前言Hello大家好我是小哥谈。K-means算法是很典型的基于距离的聚类算法采用距离作为相似性的评价指标即认为两个对象的距离越近其相似度就越大。该算法认为簇是由距离靠近的对象组成的因此把得到紧凑且独立的簇作为最终目标。目录1.k-means算法优缺点2.算法思想3.解决的问题4.k-means原理介绍5.k-means算法实战1.k-means算法优缺点优点容易实现缺点可能收敛到局部最小值在大规模数据集上收敛较慢.使用数据类型数值型数据2.算法思想k-means算法实际上就是通过计算不同样本间的距离来判断他们的相 近关系的相近的就会放到同一个类别中去。3.解决的问题k-means算法属于无监督学习的一种聚类算法其目的为在不知数据所属类别及类别数量的前提下依据数据自身所暗含的特点对数据 进行聚类。对于聚类过程中类别数量 k 的选取需要一定的先验知识 也可根据“类内间距小类间间距大“一种聚类算法的理想情况 为目标进行实现。4.k-means原理介绍k-means算法以数据间的距离作为数据对象相似性度量的标准因此选择计算数据间距离的计算方式对最后的聚类效果有显著的影响常用计算距离的方式有余弦距离、欧式距离、曼哈顿距离等。5.k-means算法实战实现效果如下代码每一步都已经清楚的进行了说明from numpy import * import pandas as pd import matplotlib.pyplot as plt #距离度量函数 def calc_distance(vec1,vec2): return sqrt(sum(power(vec1-vec2,2))) #创建初始聚类中心 def creat_centroid(data,k): centroids zeros((k,n)) centroids[0,0] 2 centroids[0,1] 10 centroids[1, 0] 5 centroids[1, 1] 8 centroids[2, 0] 1 centroids[2, 1] 2 return centroids # k-means聚类 def kMeans(data,k,distcalc_distance,creat_center creat_centroid): # 初始化cluster_assment存储中间结果 #第一列存储索引第二列存储距离 # 样本的个数 m shape(data)[0] init zeros((m,2)) cluster_assment mat(init) # 初始化聚类中心矩阵 centroids creat_centroid(data,k) for epoch in range(1): # 对数据集合中每个样本点进行计算 for i in range(m): min_dist inf min_index -1 # 对每个样本点到每个中心的距离进行计算 for j in range(k): dist_ij calc_distance(centroids[j, :],data[i, :]) # 找到距离最近的中心的距离和索引 if dist_ij min_dist: min_dist dist_ij min_index j cluster_assment[i,:] min_index,min_dist # 对所有节点聚类之后重新更新中心 for i in range(k): # .A把矩阵转成数组 pts_in_cluster data[nonzero(cluster_assment[:,0].A i)[0]] centroids[i,:] mean(pts_in_cluster,axis0) return centroids,cluster_assment if __name__ __main__: # 创建数据集 data array([[2,10],[2,5],[8,4],[5,8], [7,5] ,[6,4],[1,2],[4,9]]) k 3 # k为聚类个数 n 2 # n为特征个数 centroids,cluster_assment kMeans(data,k,dist calc_distance,creat_centercreat_centroid) predict_label cluster_assment[:,0] data_and_pred column_stack((data,predict_label)) # df是原样数据样本和预测出来的类别 df pd.DataFrame(data_and_pred,columns[data1,data2,pred]) df0 df[df.pred 0].values df1 df[df.pred 1].values df2 df[df.pred 2].values #画图 plt.scatter(df0[:,0],df0[:,1],c turquoise,marker o,label label0) plt.scatter(df1[:, 0], df1[:, 1], cgreen, marker*, labellabel1) plt.scatter(df2[:, 0], df2[:, 1], cblue, marker, labellabel2) plt.scatter(centroids[:,0].tolist(),centroids[:,1].tolist(),cred) plt.legend(loc 2) plt.show()具体实现效果小伙伴们可以根据需求添加数据集本文只是简单添加了几组数据集做一下演示。