# 吴恩达机器学习-给一个二维数据集，使用k-means进行聚类

``````import numpy as np
import scipy.io as sio
import matplotlib.pyplot as plt

# 获取数据
print(data1.keys())
X=data1['X']#(300,2)

# 初始数据可视化
plt.scatter(X[:,0],X[:,-1])
plt.show()

# 获取每个样本所属类别
def find_sentroids(X,centros):
idx=[]
for i in range(len(X)):
#X[i]是一个(2,)的一维数组,centros是（k,2），然后有个扩充广播机制最后相减是一个(k,2)维度
dist=np.linalg.norm((X[i]-centros),axis=1)#(k,)
id_i=np.argmin(dist)
idx.append(id_i)
return np.array(idx)
centros=np.array([[3,3],[6,2],[8,5]])
idx=find_sentroids(X,centros)

# 计算聚类中心点
def compute_centros(X,idx,k):
centros=[]
for i in range(k):
centros_i=np.mean(X[idx==i],axis=0)
centros.append(centros_i)
return np.array(centros)
compute_centros(X,idx,k=3)

# 运行kmeans,重复执行1和2
def run_kmeans(X,centors,iters):
k=len(centors)
centros_all=[]
centors_i=centors
for i in range(iters):
idx=find_sentroids(X,centors_i)
centors_i=compute_centros(X,idx,k)
centros_all.append(centors_i)
return idx,np.array(centros_all)

# 绘制数据集和据类中心的移动轨迹
def plot_data(X,centros_all,idx):
plt.figure()
plt.scatter(X[:,0],X[:,1],c=idx,cmap='rainbow')
# kx - -表示黑色采用叉叉，用--相连
plt.plot(centros_all[:,:,0],centros_all[:,:,1],'kx--')
idx,centros_all=run_kmeans(X,centros,iters=10)
plot_data(X,centros_all,idx)

# 观察初始聚类点的位置对聚类效果的影响
# 随机取k个样本
def init_centros(X,k):
index=np.random.choice(len(X),k)
return X[index]

for i in range(4):
idx,centros_all=run_kmeans(X,init_centros(X,k=3),iters=10)
plot_data(X,centros_all,idx)
``````

结果展示：