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

代码:
 

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

# 获取数据
data1=sio.loadmat('ex7data2.mat')
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)

 结果展示:

吴恩达机器学习-给一个二维数据集,使用k-means进行聚类_第1张图片

 

你可能感兴趣的