数据集在作业一
Kmeans聚类
K-means 是一种无监督聚类算法,其核心思想是将数据集划分为 k 个不同的簇(Cluster),使得每个簇内的数据点尽可能相似,而不同簇的数据点尽可能差异较大。
算法流程
这个过程其实有点像梯度下降,都是一点一点向最优值逼近。
代码
读取数据及可视化
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as sio
# 读取数据
data=sio.loadmat("ex7data2.mat")
X=data['X']
# print(X.shape)(300, 2)
# 可视化
def plot_data(X):
plt.scatter(X[:,0],X[:,1],marker='o',c='y',edgecolors='g')
plt.show()
# plot_data(X)
簇分配
def find_centres(X,centers):
m=X.shape[0]
idx=np.zeros(m)
for i in range(m):
min_dist=np.inf
for j in range(len(centers)):
dist=np.sum((X[i]-centers[j])**2)
if dist<min_dist:
min_dist=dist
idx[i]=j
return idx
作用是对所有的点按照新的中心进行划分。
初始聚类中心
centers=np.array([[3,3],[6,2],[8,5]])
idx=find_centres(X,centers)#每个样本所属的簇索引
# print(idx)
计算聚类中心,按照初始簇分配来计算平均中心
def compute_centres(X,idx,centers):
centers=[]#用来存储新的聚类中心
for i in range(int(idx.max())+1):
centers.append(np.mean(X[idx==i],axis=0))
return centers
centers_new=compute_centres(X,idx,centers)
# print(centers_new)
计算聚类中心,按照初始簇分配来计算平均中心
def compute_centres(X,idx,centers):
centers=[]#用来存储新的聚类中心
for i in range(int(idx.max())+1):
centers.append(np.mean(X[idx==i],axis=0))
return centers
centers_new=compute_centres(X,idx,centers)
# print(centers_new)
按照分好的簇,取新的一轮中心点
执行kmeans聚类
def kmeans(X,centers,count):
centers_all=[]
centers_all.append(centers)
for i in range(count):
idx=find_centres(X,centers)
centers=compute_centres(X,idx,centers)
centers_all.append(centers)
return idx,np.array(centers_all)
idx是用来记录最新的每个点属于哪一个簇,centers_all是用来记录所有中心点。
绘制kmeans聚类过程
def plot_kmeans(X,idx,centers_all):
plt.scatter(X[:,0],X[:,1],marker='o',c=idx,cmap='rainbow')
plt.plot(centers_all[:,:,0],centers_all[:,:,1],'kx--')
plt.show()
idx,centers_all=kmeans(X,centers,100)
plot_kmeans(X,idx,centers_all)
总结
读入数据——构建簇分配——构建计算簇类中心函数——初始化簇类中心——搭建执行kmeans算法