聚类算法(一):k-均值 (k-means)算法
来源:互联网 发布:淘宝店铺主图可以换吗 编辑:程序博客网 时间:2024/04/29 15:24
首先确保你在动手写代码之前已经了解什么是聚类分析。
k-均值算法----一种基于形心地技术的聚类算法。k-均值算法的英文名是k-means,那么这个算法是怎么工作的呢?
k-均值算法把簇的形心定义为簇内点的均值。它的处理流程如下:1.在数据点集D中随机的选择k个对象(这个k表示你要讲数据集分成几个簇),每个对象代表一个簇的初始均值或中心。2.对剩下的每个对象,根据其与哥哥簇中心的欧氏距离,将它分配到最相似的簇。3.k-均值算法迭代的改善内变差。对于每个簇,它使用上次迭代分配到该簇的对象,计算新的均值。 4.使用更新的均值作为新的簇中心。重新分配所有对象。 5.迭代继续,直到分配稳定,本轮行程的簇的中心点坐标与前一轮行程的簇相同。
算法:k-均值
输入:k:簇的数目
D:包含n个对象的数据集
输出:k个簇的集合
方法:
1.从D中任意选择k个对象作为初始簇中心;
2.repeat
3. 根据簇中对象的均值,将每个对象分配到最相似的簇;
4. 更新簇的均值,即重新计算每个簇中对象的均值;
5.until 不再发生变化
源码(Python)
__author__ = 'ChiXu_15s103144_HIT'import randomimport mathdef K_means(data, k): center = [] cluster = [] dis = [] demo_cluster = [] flag = 0 i = 0 len_data = len(data) while i<k: cluster.append(data[random.randint(0, len_data-1)]) #在数据中随机的找点放进cluster中 if cluster in center: cluster = [] continue else: center.append(cluster) #起始状态,每个簇里只有一个随机点 cluster = [] i += 1 while True: new_cluster = [] for i in xrange(len_data): for j in xrange(k): #分别计算它与k个中心点的距离 lenth = Distance(data[i],center[j][0]) dis.append(lenth) #选出距离最短的中心点,并放进center中 dis_copy = dis min_dis = sorted(dis)[0] if min_dis == 0: dis = [] dis_copy = [] continue else: mark = dis_copy.index(min_dis) center[mark].append(data[i]) dis = [] dis_copy = [] #计算每个cluster中的平均中心点 for i in xrange(k): new_cluster.append(Cluster_Average(center[i])) for i in xrange(k): if new_cluster[i] == center[i][0]: flag += 1 if flag == k: #如果簇内的平均中心点不再发生变化,则return return center else: #否则用新的平均中心点取代原来的平均中心点 flag = 0 center = [] for i in xrange(k): #center.append(new_cluster[i]) demo_cluster.append(new_cluster[i]) center.append(demo_cluster) demo_cluster = []def Cluster_Average(cluster): #计算cluster内平均中心点 average = [] total_x = total_y = 0 len_cluster = len(cluster) for i in xrange(len_cluster): total_x += cluster[i][0] total_y += cluster[i][1] average.append(total_x/len_cluster) average.append(total_y/len_cluster) return averagedef Distance(point1, point2): #计算两点欧氏距离 if point1 == point2: return 0 else: dis_x = point2[0] - point1[0] dis_y = point2[1] - point1[1] dis = math.sqrt(dis_x**2 + dis_y**2) return dispoint = []data = []num = raw_input('请输入随机点阵的数目:')for i in xrange(int(num)): #构造随机点阵 point.append(random.randint(1,100)) point.append(random.randint(1,100)) data.append(point) point = []k = raw_input('请输入中心点k的数目:')center = K_means(data,int(k))print(center)
0 0
- 聚类算法(一):k-均值 (k-means)算法
- K均值(K-means)聚类算法
- K-均值聚类算法(K-means)
- K均值聚类算法(K-Means)
- 聚类算法:k均值(k-means)
- K-means(K-均值)聚类算法
- K-均值聚类算法(K-means algorithm) & 二分K-均值算法(Bisecting k-means algorithm)
- K均值聚类算法(K-Means Clustering Algorithm)
- K-Means(K均值聚类算法)
- K-Means Algorithm(K-均值算法)
- k-Means(二分k-均值算法)
- K-Means(K均值) 算法
- 算法杂货铺——k均值聚类(K-means)
- 算法杂货铺——k均值聚类(K-means)
- 算法杂货铺——k均值聚类(K-means)
- 算法杂货铺——k均值聚类(K-means)
- 机器学习算法 - k-means Clustering K均值聚类
- 机器学习--k均值聚类(k-means)算法
- Docker与JVM性能对比实验设计
- Kafka:下一代分布式消息系统
- day03 homework
- arclist 调用附加字段
- poj 1141 (区间dp记录路径问题)
- 聚类算法(一):k-均值 (k-means)算法
- unity3d-背景层设置
- 十一、c语言算术优先级和口诀
- UGUI 使用ScrollRect实现地图拖放及多点缩放
- OC-053.NSDate类、NSDateFomatter类、NSCalendar类、NSDateComponents类---ios时间类
- BZOJ 1045 (UVa 11300) 数学分析 + 结论
- 黑马程序员——Java开发工具Eclipse的使用
- pthread编程基础
- 概要设计和详细设计的区别