本文基于Andrew_Ng的ML课程作业
1-K-means clustering used for simple two-dimensional datasets: K-means聚类用于简单二维数据集
导入库
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat
函数:初始化聚类中心
def init_centroids(X,k): #初始化聚类中心
m,n=X.shape
centroids=np.zeros((k,n))
idx=np.random.randint(0,m,k) #np.random.randint(low,high=None,size=None):返回size规模在[low, high)范围内的随机整型数
for i in range(k):
centroids[i,:]=X[idx[i],:]
return centroids
函数:找到每个样本最接近的聚类中心(Cluster Assignment)
def find_closet_centroids(X,centroids): #找到每个样本最接近的聚类中心(Cluster Assignment)
m=X.shape[0]
k=centroids.shape[0]
idx=np.zeros(m)
for i in range(m):
min_distan=1000000 #最小距离先设置为一个极大值
for j in range(k):
distan_squ=np.sum((X[i,:]-centroids[j,:])**2) #第i个样本到第j个centroid距离的平方
if distan_squ < min_distan:
min_distan=distan_squ
idx[i]=j+1
return idx
函数:计算簇的聚类中心(分配给簇的所有样本的平均值)(Move Centroid)
def compute_centroids(X,idx,k): #计算簇的聚类中心(分配给簇的所有样本的平均值)(Move Centroid)
n=X.shape[1]
centroids=np.zeros((k,n))
for i in range(k):
indices=np.where(idx==i+1) #np.where(condition):条件成立时,where返回每个符合condition条件元素的坐标,以元组的形式
centroids[i,:]=(np.sum(X[indices,:],axis=1)/len(indices[0])) #np.sum(X,axis=1):X为[[[],[]]]时,axis=1表示每一列元素相加,列数不变 #len(list):行数;len(list[0]):列数
return centroids
函数:加入循环整合后的K-means算法
def K_means(X,initial_centroids,max_iters): #加入循环整合后的K-means算法
k=initial_centroids.shape[0]
centroids=initial_centroids
for i in range(max_iters):
idx=find_closet_centroids(X,centroids)
centroids=compute_centroids(X,idx,k)
return idx,centroids
函数:用三种不同颜色展示三种聚类
def plot_clusters(): #用三种不同颜色展示三种聚类
cluster1=X[np.where(idx==1)[0],:] #这里np.where()后要加[0]是因为返回的是多元素array,取第一个元素才是每个符合condition条件元素的坐标
cluster2=X[np.where(idx==2)[0],:]
cluster3=X[np.where(idx==3)[0],:]
fig,ax=plt.subplots(figsize=(12,8))
ax.scatter(cluster1[:,0],cluster1[:,1],s=30,color='r',label='Cluster 1')
ax.scatter(cluster2[:,0],cluster2[:,1],s=30,color='g',label='Cluster 1')
ax.scatter(cluster3[:,0],cluster3[:,1],s=30,color='b',label='Cluster 1')
ax.legend()
pl