Kmeans算法流程
背景:平面上有两堆数据(数据以(x,y)的二维坐标形式表示),目标是找出两堆数据的中心点
算法步骤
- 随机生成两个点作为两堆数据的中心点
- 计算所有点分别到两个中心点的距离
- 对于平面的每一个点,比较到哪一个中心点的距离近,就被归为哪一类
- 对于归类后的数据重新计算中心点的坐标
- 判断中心点是否有明显变化,如果有,跳转到2,如果没有,跳转到6
- 程序结束,输出中心点的坐标
下面是用python代码实现
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
import numpy as np
#KMeans算法实现原理
def k_means():
X,y = make_blobs(n_samples=150,random_state=170,centers=2)
a_point = np.array([-12,-8])
b_point = np.array([-2,2])
tol = True #容忍度,是否继续程序的迭代
while tol:
a_lens = np.linalg.norm(X - a_point,axis = 1) #计算所有点到a点的距离
b_lens = np.linalg.norm(X - b_point,axis = 1) #计算所有点到b点的距离
a_sets = X[a_lens < b_lens]
b_sets = X[b_lens < a_lens]
a_new_point = a_sets.mean(axis = 0) #计算分类后的新的中心点的坐标
b_new_point = b_sets.mean(axis = 0) #计算分类后的新的中心点的坐标
#计算新的中心点和上次计算的中心点对比,有无明显位移
tol_move = np.linalg.norm(a_new_point - a_point) + np.linalg.norm(b_new_point - b_point)
#如果位移不明显,跳出循环,1.0是对于明显性的容忍度,根据需要设置
if tol_move < 1.0:
tol = False
a_point = a_new_point
b_point = b_new_point
return a_point,b_point
print(k_means())
注:因为系统中有Kmeans这个函数,所以不能和系统中的函数重名,因为python中有已定义的函数,实现如下
from sklearn.cluster import KMeans
#使用系统Kmeans方法进行聚类
X,y = make_blobs(n_samples=150,random_state=170,centers=2)
km = KMeans(n_clusters=2,random_state=170).fit(X)
#打印聚类后的中心
print(km.cluster_centers_)
#原始数据的聚类结果
print(km.predict(X))
希望对大家有帮助