这篇文章主要介绍了Python中K-means算法的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
为祁门等地区用户提供了全套网页设计制作服务,及祁门网站建设行业解决方案。主营业务为成都网站建设、成都网站设计、祁门网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
1、步骤说明
(1)确定K值(决定数据聚为几类,K值是K-Means算法中唯一的参数);
(2)从原始数据集中随机选择K个点作为初始均值点;
(3)依次从原始数据集中取出数据,每取出一个数据就和K个均值点分别计算距离(默认计算点间的欧氏距离),和谁更近就归为这个均值点所在的簇;
(4)分别计算各簇当前的均值点(即求该簇中所有点的平均值);
(5)比较当前的均值点和上一步得到的均值点是否相同,如果相同,则K-Means算法结束,否则,将当前的均值点替换掉之前的均值点,然后重新划分族,重复步骤三。
2、实例
import numpy as np import matplotlib.pyplot as plt '''标志位统计递归运行次数''' flag = 0 '''欧式距离''' def ecludDist(x, y): return np.sqrt(sum(np.square(np.array(x) - np.array(y)))) '''曼哈顿距离''' def manhattanDist(x, y): return np.sum(np.abs(x - y)) '''夹角余弦''' def cos(x, y): return np.dot(x, y)/(np.linalg.norm(x) * np.linalg.norm(y)) '''计算簇的均值点''' def clusterMean(dataset): return sum(np.array(dataset)) / len(dataset) '''生成随机均值点''' def randCenter(dataset, k): temp = [] while len(temp) < k: index = np.random.randint(0, len(dataset)-1) if index not in temp: temp.append(index) return np.array([dataset[i] for i in temp]) '''以数据集的前k个点为均值点''' def orderCenter(dataset, k): return np.array([dataset[i] for i in range(k)]) '''聚类''' def kMeans(dataset, dist, center, k): global flag #all_kinds用于存放中间计算结果 all_kinds = [] for _ in range(k): temp = [] all_kinds.append(temp) #计算每个点到各均值点的距离 for i in dataset: temp = [] for j in center: temp.append(dist(i, j)) all_kinds[temp.index(min(temp))].append(i) #打印中间结果 for i in range(k): print('第'+str(i)+'组:', all_kinds[i], end='\n') flag += 1 print('************************迭代'+str(flag)+'次***************************') #更新均值点 center_ = np.array([clusterMean(i) for i in all_kinds]) if (center_ == center).all(): print('结束') for i in range(k): print('第'+str(i)+'组均值点:', center_[i], end='\n') plt.scatter([j[0] for j in all_kinds[i]], [j[1] for j in all_kinds[i]], marker='*') plt.grid() plt.show() else: #递归调用kMeans函数 center = center_ kMeans(dataset, dist, center, k) def main(k): '''生成随机点''' x = [np.random.randint(0, 50) for _ in range(50)] y = [np.random.randint(0, 50) for _ in range(50)] points = [[i,j] for i, j in zip(x, y)] plt.plot(x, y, 'b.') plt.show() initial_center = randCenter(dataset=points, k=k) kMeans(dataset=points, dist=ecludDist, center=initial_center, k=k) if __name__ == '__main__': main(3)
感谢你能够认真阅读完这篇文章,希望小编分享的“Python中K-means算法的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联行业资讯频道,更多相关知识等着你来学习!