1 k-means算法


输入:
样本数据D=cor1,cor2,...,corn,cori=(xi,yi)D={cor_1, cor_2, ..., cor_n}, cor_i=(x_i, y_i)D=cor1​,cor2​,...,corn​,cori​=(xi​,yi​),
聚类簇数:k
迭代次数:steps
计算过程:

从数据集D中随机选取k个数据作为簇中心点center={c_1, c_2,..., c_k}
令簇类:cluster_1, ..., cluster_k
while(steps--):for j=0,1, ..., n do计算每个源数据与簇中心点距离d=|cor_1-c1|根据最近的均值向量确定cor_i所属的簇cluster_i(i=0,1, ..., k-1)将对应的数据归入簇endforfor i=0, 1, ..., k-1 do更新簇中心均值向量:center_i = (1/cluster_i数据个数)*sum(cluster_i所有数据)if center_i != c_i thenc_i = center_ielse保持原中心点不变end ifendfor

输出:簇划分cluster1,cluster2,...,clusterkcluster_1, cluster_2, ..., cluster_kcluster1​,cluster2​,...,clusterk​


2 python实现

2.1 Demo

import matplotlib.pyplot as plt
import numpy as np
import math
'''原始数据.'''
x = [0.697, 0.774, 0.634, 0.608, 0.556, 0.403, 0.481, 0.437, 0.666, 0.243,0.245, 0.343, 0.639, 0.657, 0.360, 0.593, 0.719, 0.359, 0.339, 0.282,0.748, 0.714, 0.483, 0.478, 0.525, 0.751, 0.532, 0.473, 0.725, 0.446]
y = [0.460, 0.376, 0.264, 0.318, 0.215, 0.237, 0.149, 0.211, 0.091, 0.267,0.057, 0.099, 0.161, 0.198, 0.370, 0.042, 0.103, 0.188, 0.241, 0.257,0.232, 0.346, 0.312, 0.437, 0.369, 0.489, 0.472, 0.376, 0.445, 0.459]
# 原始数据图像
plt.figure(figsize=(8, 8))
plt.scatter(x, y, color='r')
plt.xlim(0.1, 0.9)
plt.ylim(0, 0.9)
plt.xlabel("x data")
plt.ylabel("y data")
plt.grid(True)
plt.savefig("./images/source_data.png", format='png')
coordinate = [data for data in zip(x, y)]
print("coordinate: {}".format(coordinate))
print("data 0 x: {}".format(coordinate[0][0]))
print("data 0 y: {}".format(coordinate[0][1]))
rand = np.random.randint(0, 30)
print("random number: {}".format(rand))
init = coordinate[rand]def direct_line():print("---------\n")def k_mean_cluster(k, steps):'''k-means聚类参数:k:簇个数;steps:迭代次数;返回:center_data:簇中心点classification_temp:所有参数及参数值'''init_num = np.random.randint(0, 30, (1, k))# 随机获取初始簇中心点center_data = [coordinate[i] for i in init_num[0]]'''locals()函数动态建立列别,存储k个簇的数据通过classification_temp['cluster_0'],..., classification_temp['cluster_(k-1)']获取分类数据'''for step in range(steps):classification_temp = locals()for i in range(k):classification_temp['cluster_' + str(i)] = []    '''原始数据聚类:j为原始数据,i为簇分类数将每个数据利用距离进行聚类'''for j in range(len(coordinate)):dis_temp = []for i in range(len(center_data)):dis = math.pow(init_data[i][0]-coordinate[j][0], 2) + math.pow(init_data[i][1]-coordinate[j][1], 2)dis = math.sqrt(dis)dis_temp.append(dis)dis_min = min(dis_temp)dis_index = dis_temp.index(dis_min)for i in range(k):'''Adding data to croresponding cluster.'''if i == dis_index:classification_temp['cluster_'+str(dis_index)].append(j)'''更新聚类中心坐标'''for i in range(k):xx = []yy = []for index in classification_temp['cluster_'+str(i)]:xx.append(coordinate[index][0])yy.append(coordinate[index][1])   xx_mean = np.mean(xx)yy_mean = np.mean(yy)if xx_mean != center_data[i][0] or yy_mean != center_data[i][0]:center_data[i]= (xx_mean, yy_mean)print("cluster center: {}".format(center_data))'''plot final results.'''plt.figure(figsize=(8, 8))plt.xlim(0.1, 0.9)plt.ylim(0, 0.9)plt.xlabel("x data")plt.ylabel("y data")plt.grid(True)for i in range(k):direct_line()markers = ['.', 's', '^', 'P']print("cluster {}: data: {}".format(i, classification_temp['cluster_'+str(i)]))xx = []yy = []for index in classification_temp['cluster_'+str(i)]:xx.append(coordinate[index][0])yy.append(coordinate[index][1])plt.scatter(xx, yy, marker=markers[i])plt.scatter(init_data[i][0], center_data[i][1], marker=markers[3], linewidths=1, color='r')plt.savefig("./images/k-mean_cluster.png", format="png")return center_data, classification_tempif __name__ == "__main__":center, cluster = k_mean_cluster(3, 50)for i in range(3):print("cluster {} data: {}".format(i, cluster['cluster_'+str(i)]))print("center: {}".format(center))

2.2 Result

2.2.1 结果

cluster 0 data: [0, 3, 22, 23, 24, 25, 26, 27, 28, 29]
cluster 1 data: [5, 6, 7, 9, 10, 11, 14, 17, 18, 19]
cluster 2 data: [1, 2, 4, 8, 12, 13, 15, 16, 20, 21]
center: [(0.5717999999999999, 0.41369999999999996), (0.3492, 0.2076), (0.6699999999999999, 0.2028)]

2.2.2 可视化

图2.1 源数据

图2.2 聚类数据

其中,红色加号为聚类中心,三种形状:圆形,三角形,正方形分别为簇。

3 小结

k-means聚类,先随机在原始数据中挑选k个簇中心点,依次计算每个原始数据到中心点的距离,将到中心点距离最近的数据归为一类,遍历所有源数据后,对更新k个簇中心点,该簇中心点使用上次聚类数据的均值作为新的中心点,继续迭代,直到聚类中心不再改变或达到迭代次数终止。

k-means聚类算法及python实现相关推荐

  1. k means聚类算法_一文读懂K-means聚类算法

    1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...

  2. k means聚类算法_K-Means 聚类算法 20210108

    说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...

  3. python图像分割_基于K均值聚类算法的Python图像分割

    1个K均值算法 实际上,K-means算法是一种非常简单的算法,与算法思想或特定实现无关. 通过以一定方式测量样本之间的相似度,并迭代更新聚类中心,它属于无监督分类. 当聚类中心不再移动或移动差异小于 ...

  4. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  5. k均值聚类算法python_K均值和其他聚类算法:Python快速入门

    k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...

  6. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  7. python(scikit-learn)实现k均值聚类算法

    k均值聚类算法原理详解 示例为链接中的例题 直接调用python机器学习的库scikit-learn中k均值算法的相关方法 from sklearn.cluster import KMeans imp ...

  8. Python金融数据挖掘 第11章 复习思考题1 (聚类)给出一个数据集data_multivar.txt,里面有200个点坐标,在平面坐标系下可以画出它的散点图,用K均值聚类算法来训练模型,分4类。

    1.题目 给出一个数据集data_multivar.txt,里面有200个点坐标,在平面坐标系下可以画出它的散点图,如图11-12所示. data_multivar.txt 图11-12 数据集 da ...

  9. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  10. K-Means(K均值聚类算法)

    K-Means(K均值聚类算法) 1.前言 要学习聚类算法就要知道聚类学习算法是什么,为什么要学习聚类学习聚类学习算法,有什么用途,下面就简单的做一下介绍,并且详细的说明k-means均值聚类学习算法 ...

最新文章

  1. .NET中如何得到图片大小
  2. qgis经纬度_数据养成系列--QGIS地理空间
  3. HDU1671-Phone List (trie树)
  4. Android开发心得-ListView的监听事件
  5. javascript正则表达式验证密码(必须含数字字符特殊符号,长度4-16位之间)
  6. js基础语法(01)-JS中+号的三种含义
  7. VS2008中配置 Windows SDK v7
  8. SAP S/4HANA是如何通过SADL框架加CDS view读取销售订单数据的
  9. 浅谈ASP.NET框架
  10. word2vec相关资料
  11. 讨论了好久的问题,IE、Firefox下CSS图片垂直居中的问题
  12. 无人驾驶、自动驾驶与驾驶辅助的区别
  13. 【多线程】--生产者消费者模式--synchronized版本
  14. Docker学习之docker常用命令
  15. 企业微信代开发获取应用Secret
  16. 文本编辑器(vim)
  17. win7浏览器主页修改不过来_Win7 IE无法修改默认主页怎么办?解决IE浏览器主页无法修改主页...
  18. Win10图片查看器打不开图片,报错内存不足
  19. 【规划】一个计算机专业学生几年的编程经验汇总
  20. 火车头过滤 css样式_HTML5和CSS3过滤器中的网络摄像头视频捕获

热门文章

  1. matplotlib 绘制并列饼状图
  2. 电气工程和计算机科学与技术专业就业前景,电气工程与自动化专业就业前景以及就业方向...
  3. 网络规划设计师过考经验
  4. dicom文件tag详解
  5. TabControl 选项卡控件
  6. 【python】详解numpy库与pandas库axis=0,axis= 1轴的用法
  7. C++中吸取C的二等公民
  8. 数据分析统计学原理第十三章:实验设计与方差分析 | 我的统计学原理复习日记
  9. 面试浅谈之十大排序算法
  10. vivado多时钟周期约束set_multicycle_path使用