参考:
k-means 聚类算法
一、原理
K-means聚类算法是一种无监督分类算法,将划分出来的类簇中点的均值当作该类簇的中心点,其可以在不确定划分规则的前提下,通过对数据集合不断迭代的方法对数据集进行划分,自动计算并更新每个类簇的中心点。
K-means聚类算法是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。
引用:K-means聚类算法
算法实现步骤:
- 选定要聚类的类别数k,选择k个中心点。
- 针对样本点,找到距离最近的中心点,将他们归为中心点代表的簇。
- 计算每个簇的新的中心点。
- 判断新的中心点和旧的中心点是否相同/接近。
- 若相同/接近,则算法终止。否则更新中心点,循环2,3,4,直到算法终止。
下面使用python和现有库sklearn,分别实现一下k-means聚类算法。
二、python实现聚类分析
import numpy as np
import matplotlib.pyplot as plt
import random
# 返回两点之间的距离
def get_distance(p1,p2):
return np.sqrt(sum(map(lambda x,y:(x-y)**2,p1,p2)))
# 计算样本的中心
def calc_center_point(cluster):
return np.matrix(cluster).mean(axis=0).tolist()[0]
# 检验两个中心点是否有差异
def check_center_diff(center, new_center):
return center == new_center
# k_means聚类算法实现
def K_means(points, center_points):
k = len(center_points) # k值
tot = 0
while True:
temp_center_points = [] # 记录中心点
clusters = [[] for _ in range(k)] # 记录数据值
# clusters = [[]]*k
# 注意:不能使用以上代码,因为*k,是复制的列表,是引用的同一个对象,修改其中一个就会改变所有的值
# 计算最近中心点,并添加到对应的分组
for data in points:
distance = []
for center in center_points:
distance.append(get_distance(data,center))
index = np.argmin(distance)
clusters[index].append(data)
# 格式化输出迭代日志
tot += 1
res_str = ''''''
res_str += f"第{
</