K-Means是常用的聚类算法,是一种无监督学习的算法。
步骤如下:
(1)随机选择k个点作为初始的k个类的中心点;
(2)迭代时对数据集中的每一个数据点,每一个中心,计算中心与数据点的距离,将数据点分配到距离最近的中心所在的类;
(3)对每一个类,计算类中所有点的均值,并将均值作为新的中心。
(4)通过迭代的方法,逐次更新各聚类中心的值,直到得到最好的聚类结果(如值保持不变)。
实现代码如下:
// Python实现K-Means算法
#K-Means算法
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
#读取数据
data=pd.read_csv('data/kmeans.csv',header=None,names=['x','y'])
# print(data)
# plt.scatter(data['x'],data['y'])
# plt.show()
# print(data['x'].values[0])
#获得横坐标
x=data['x']
#获得纵坐标
y=data['y']
#求每个数据与各个中心点的距离
def distance(data,centers):
#方法一:
# dist=np.zeros((data.shape[0],centers.shape[0]))
# for i in range(len(data)):
# for j in range(len(centers)):
# dist[i,j]=np.sqrt(np.sum((data.iloc[i,:]-centers[j])**2))
#方法二:
d=np.square(np.repeat(np.array(data),4,0).reshape(-1,4,2)-centers)
dist=np.sqrt(np.sum(d,axis=2))
return dist
#求每个数据对应的最近的中心点
def near_center(data,centers):
dist=distance(data,centers)
near_cen=np.argmin(dist,1)
return near_cen
def kemans(data,k):
#step1:初始化centers
centers=np.random.choice(np.arange(-5,5,0.1),(k,2))
for _ in range(15):
#step2点归属
near_cen=near_center(data,centers)
#step3类中心更新
for ci in range(k):
centers[ci]=data[near_cen==ci].mean()
return centers,near_cen
centers,near_cen=kemans(data,4)
print(near_cen)
plt.scatter(x,y,c=near_cen)
plt.scatter(centers[:,0],centers[:,1],marker='*',s=50,c='r')
plt.show()
'kmeans.csv’内容如下。