K-means聚类算法 伪代码 python3代码

2023-05-16

K-means 算法及其代码

  • K-means算法介绍
  • K-means 伪代码
  • K-means python 代码

K-means算法介绍

链接: 模式识别—聚类分析

K-means 伪代码

  1. 计算两个点之间的欧式距离
	def calcluate_distance(core: tuple, dot: tuple):
    """
    计算两个点之间的欧氏距离
    :param core: 质心坐标 (x,y) 类型为tuple
    :param dot:  要计算距离的点(m,n) 类型为tuple
    :return: 距离 dist 类型为float
    """
    #dist用欧式距离公式获得
    return dist
  1. 计算给定点应分配到哪一个质心
def calculate_cluster(dot: tuple, cores: list):
    """
    计算给定点应该指派到哪一个质心
    :param dot: 待处理的点
    :param cores: 质心列表
    :return: 应该指派到的质心的序号
    """
    distance_list = []
    for core in cores:
        #获取到对应的dist
        #添加到distance列表中
    min_dist = min(distance_list)
    #获取最短距离
    put_to_index = distance_list.index(min_dist)
    #获取最短距离对应的index
    return put_to_index
  1. 将点分配到最近的质心的簇
def put_dot_into_clusters(row_data: list, k: int, cores: list):
    """
    将点指派至最近质心的簇
    :param cores:
    :param row_data:
    :param k:
    :return: 已分配点的簇
    """
    clusters = []
    for each in range(k):
		#创建对应个数的簇
    for every_data in row_data:
		#获取every_data的index
		#添加对应的every_data到对应的簇
    return clusters
  1. 计算当前簇的下一个质心
def re_calculate_core(cluster: set):
    """
    计算当前簇的下一个质心
    :param cluster:
    :return: new_core
    """
    all_x = []	
	all_y = []
    for each_dot in cluster:
        #获取所有数据的X和y
	#获取平均的X和Y
    new_core = (round(avg_x, 2), round(avg_y, 2))
	#生成新的质心,且保留两位小数
    return new_core
  1. 初始化数据点
	for num in range(10):
		#adot用random生成,用round保留两位小数
    data_list.append(adot)
	#添加adot到data_list中

K-means python 代码

IDE: Pyharm
Version:Python 3.7.3

from random import random, sample
from math import pow
#Made by 柯少又来秀了
#Made by 柯少又来秀了
#Made by 柯少又来秀了

def calcluate_distance(core: tuple, dot: tuple):
   """
   计算两个点之间的欧氏距离
   :param core: 质心坐标 (x,y) 类型为tuple
   :param dot:  要计算距离的点(m,n) 类型为tuple
   :return: 距离 dist 类型为float
   """
   dist = pow(((dot[0] - core[0]) ** 2 + (dot[1] - core[1]) ** 2), 0.5)
   # if dist == 0:
   #     print("00000000000", dot)
   #考虑特殊情况
   return dist

def calculate_cluster(dot: tuple, cores: list):
   """
   计算给定点应该指派到哪一个质心
   :param dot: 待处理的点
   :param cores: 质心列表
   :return: 应该指派到的质心的序号
   """
   distance_list = []
   for core in cores:
       dist = calcluate_distance(core, dot)
       #获取到对应的dist
       distance_list.append(dist)

   min_dist = min(distance_list)
   #获取最短距离
   put_to_index = distance_list.index(min_dist)
   #获取最短距离对应的index
   return put_to_index

def initiation_cores(row_data: list, k: int):
   """
   根据row_data的数据生成初始质心
   :param row_data: 原始数据
   :param k: k值
   :return: 质心列表
   """
   cores = sample(row_data, k)
   #python中random.sample()方法可以随机地从指定列表中提取出N个不同的元素,即创建质心列表
   return cores

def put_dot_into_clusters(row_data: list, k: int, cores: list):
   """
   将点指派至最近质心的簇
   :param cores:
   :param row_data:
   :param k:
   :return: 已分配点的簇
   """
   clusters = []
   for each in range(k):
       clusters.append(set())
   #set() 函数创建一个无序不重复元素集
   for every_data in row_data:
       index = calculate_cluster(every_data, cores)
       clusters[index].add(every_data)
   return clusters

def re_calculate_core(cluster: set):
   """
   计算当前簇的下一个质心
   :param cluster:
   :return:
   """
   all_x = []
   all_y = []
   for each_dot in cluster:
       all_x.append(each_dot[0])
       all_y.append(each_dot[1])
   avg_x = sum(all_x) / len(all_x)
   avg_y = sum(all_y) / len(all_y)
   new_core = (round(avg_x, 2), round(avg_y, 2))
   return new_core

if __name__ == '__main__':
   #在if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而import到其他脚本中是不会被执行的
   #生成n个点
   data_list = []
   #round() 方法返回浮点数x的四舍五入值
   #round(80.23456, 2) :  80.23
   #random() 方法返回随机生成的一个实数,它在[0,1)范围内
   for num in range(10):
       adot = (round(random() * 20 - 100, 2), round(random() * 20 - 100, 2))
       data_list.append(adot)

   for num in range(100):
       adot = (round(random() * 100 + 100, 2), round(random() * 50 + 150, 2))
       data_list.append(adot)

   for num in range(50):
       adot = (round(random() * 20, 2), round(random() * 20, 2))
       data_list.append(adot)

   for num in range(50):
       adot = (round(random() * 100 + 100, 2), round(random() * 20, 2))
       data_list.append(adot)

   for num in range(100):
       adot = (round(random() * 200, 2), round(random() * 200, 2))
       data_list.append(adot)

   # 设置k值
   k = 4
   # 生成初始质心
   my_cores = initiation_cores(data_list, k)
   roundx = 0
   while True:
       roundx += 1
       # 指派
       cl = put_dot_into_clusters(data_list, k, my_cores)
       new_cores = list()
       for index in range(k):
           new_cores.append(re_calculate_core(cl[index]))
       if new_cores == my_cores:
           break
       else:
           my_cores = new_cores

   import matplotlib.pyplot as plt
   colors = ['#0000FF', '#FF0000', '#00FF00', '#666666', '#FFFF00']
   for index in range(k):
       color = colors[index % 5]
       for every_dot in cl[index]:
           plt.scatter(every_dot[0], every_dot[1], c=color, alpha=0.53)
       plt.scatter(my_cores[index][0], my_cores[index][1], marker='+', c='#000000', s=180)
   plt.show()

#Made by 柯少又来秀了
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

K-means聚类算法 伪代码 python3代码 的相关文章

随机推荐

  • 如何成为一个全能的机器人工程师

    大疆技术总监 xff1a 如何用六年成为一个全能的机器人工程师 机器人学的核心问题是做好和物理世界的交互 现在主流的机器人学分支里 xff0c 处理与物理世界的交互的学科分为三类 xff1a 传感器和处理算法 xff1b 多刚体系统动力学控
  • 任务调度算法

    可实现在单片机裸机下还能有很好的实时性 任务调度器 SCHEDULER TASK scheduler tasks 61 amp P loop 1000Hz 1000 0 0 amp P loop 500Hz 500 0 0 amp P lo
  • 阿里云云计算ACP学习(一)---弹性计算

    弹性计算 1 ECS的概念与定位 概念 xff1a 云服务器ECS xff08 Elastic Compute Service xff09 是一种可弹性伸缩的计算服务 xff0c 可以帮助降低IT成本 xff0c 提升运维效率 xff0c
  • 阿里云云计算ACP学习(二)---弹性存储

    弹性存储 1 阿里云盘古 盘古 飞天底层同一存储平台 盘古的优势 xff1a 盘古系统在一个核心基础层之上 xff0c 通过为不同应用场景而抽象的适配层设计 xff0c 提供了分布式块存储系统和分布式文件系统两种形态 xff0c 基于这一套
  • HDFS读写流程介绍,HDFS读数据和写数据的原理是什么?

    Client 客户端 对HDFS中的数据进行读写操作 xff0c 分别是Client从HDFS中查找数据 xff0c 即为Read 读 数据 Client从HDFS中存储数据 xff0c 即为Write 写 数据 下面我们对HDFS的读写流
  • VIM简单配置step by step

    0 更新vim 更新和安装vim xff0c 保证版本 gt 61 8 0即可 可按照如下命令安装 0 1 安装依赖 yum update y yum install epel release y yum install y git gcc
  • 使用setInterval遇到的陷阱

    setInterval的使用 span class token keyword const span interval span class token operator 61 span span class token function
  • vs本地调试dll文件

    遇到一些问题 xff0c 需要调试dll文件进行调试 xff0c 环境配置如下 打开dll工程 1 鼠标右键dll项目 xff0c 属性 gt 配置属性 gt 调试 gt 命令 在命令中填写使用dll的 exe文件的路经 2 将新生成的dl
  • 对抗样本简介

    一 什么是对抗样本 对抗样本是一类被恶意设计来攻击机器学习模型的样本 它们与真实样本的区别几乎无法用肉眼分辨 xff0c 但是却会导致模型进行错误的判断 对抗样本的存在会使得深度学习在安全敏感性领域的应用收到威胁 如下图所示 xff0c 通
  • QT——QWidget窗体设置背景颜色、背景图、及其注意点

    QWidget窗体设置背景颜色 背景图 及其注意点 前言一 使用调色板QPalette来设置图片二 使用样式表QSS三 使用画笔Qpainter在paintEvent事件中绘制图片 前言 QT设置背景图笔录 一 使用调色板QPalette来
  • Navicat 连接Mysql 8.0以上版本报错1251的详细解决方案(配效果图)

    从MySql5 7版本跳到了Mysql 8 0的版本 xff0c 安装的时候提示链接加密方式已经改变 xff0c 是选择5 xff1f 时代的方式还是新的方式 xff0c 当时 全部选择默认 xff0c 所以选择的新的 加密方式 xff0c
  • 前端入门篇(一)常用五大浏览器及浏览器内核

    一 常见浏览器内核介绍 浏览器是网页运行的平台 xff0c 常见的浏览器有 IE 火狐 xff08 Firefox xff09 谷歌 xff08 Chrome xff09 Safari和Opera等 xff0c 我们平时称为五大浏览器 xf
  • 从输入URL到页面展示这中间发生了什么

    文章目录 从输入URL到页面展示这中间发生了什么Chrome多进程浏览器架构补充1 xff1a 进程和线程 整体的流程1 浏览器接收到输入的URL后 xff0c 先解析URL浏览器发送请求前 xff0c 尝试缓存命中 2 建立URL请求DN
  • 自动化标注技术

    自 动 化 标 注 技 术 自动化标注技术
  • 解决hadoop无法访问8088和19888端口的问题

    50070端口可以访问 xff0c 但是8088和19888端口不可以访问 xff0c 关防火墙 xff0c 看配置文件都是没有问题 xff0c 但就是不能web访问 看下图我的19888和8088前面都是127 0 0 1 xff0c 着
  • PyQt5有关QtWebEngineWidgets的解决办法

    from PyQt5 import QtWebKitWidgets ImportError DLL load failed 找不到指定的程序 这是因为PyQt5在5 6版本以后改用 QtWebEngineWidgets xff0c 所以之前
  • 在NER任务中CRF层的作用(例子)

    这里不过多阐述NER任务是啥了 xff0c 具体来看看他的作用 xff0c 并且举了一个例子 xff0c 让大家理解更加深刻 上图说明模型的输出是每个标签的分数 例如 xff0c 对于w0 模型的输出为1 5 B Person 0 9 I
  • 深度神经网络(DNN)通俗理解

    首先要明白俩个函数 xff0c 特别重要的俩个函数 线性的关系函数 激活函数 xff08 顾名思义是激活用的把得到的Z放入函数中 xff0c 来重新得到结果 xff09 中间的线相当于线性关系函数中的w 神经元相当于一个激活函数 xff0c
  • 爬虫写一个 “搜索引擎”,炒鸡简单。

    写搜索引擎前 xff0c 我们需要简答了解一下flask 这个轻量级的web的框架 xff0c 如果没有这个模块 只需要 pip install flask 即可 然后我们需要用html写一个最初的 搜索框 xff0c 并且命名这个文件为s
  • K-means聚类算法 伪代码 python3代码

    K means 算法及其代码 K means算法介绍K means 伪代码K means python 代码 K means算法介绍 链接 模式识别 聚类分析 K means 伪代码 计算两个点之间的欧式距离 span class toke