吴恩达Lecture13:K-Means聚类

本文深入介绍了K-Means聚类算法,包括其迭代过程、中心点更新方法,并提供了Python代码实现。通过图像压缩的例子展示了K-Means在实际中的应用,同时对比了自定义实现与sklearn库调用的效果。
摘要由CSDN通过智能技术生成

K-Means Algorithm

k均值聚类算法是一个迭代的过程,每次迭代包括两个步骤
(1)随机选择k个类的中心,将样本逐个指派到与其最近的中心的类上,得到一个聚类结果;
(2)更新每个类的样本均值,作为类的新的中心;
(3)重复以上步骤,直至中心不再变化。

K均值化过程

'''样本逐个指派最近的中心类'''
def findClass(x,centroids):
    idx=np.zeros((x.shape[0]))
    for i in range(x.shape[0]):
        c=np.sum(np.square(x[i,:]-centroids)\
                 ,axis=1)
        idx[i]=np.argmin(c)
    return idx+1
'''更新每个类别的均值作为新的中心点'''
def averageCentriods(x,centroids):
    idx=findClass(x,centroids)
    miu=np.zeros(centroids.shape)
    for i in range(miu.shape[0]):
        miu[i]=x[idx==i+1].mean(axis=0)
    return miu

设置原始中心点为:

centroids=np.array([[2,5],[3,1],[6,3]])

测试一下上述是否满足:

>>> a=averageCentriods(X,centroids)
a=array([[2.33208328, 4.58037583],
       [2.87805874, 1.17646048],
       [5.82114571, 3.34062269]])
>>> b=averageCentriods(X,a)
b=array([[1.95399466, 5.02557006],
       [3.04367119, 1.01541041],
       [6.03366736, 3.00052511]])

通过测试两次中心点变化,由蓝点向红点走(下图所示),说明聚类起作用了:
测试变化
迭代多次:

def k_means(X,centroids,max_iter):
    c=averageCentriods(X,centroids)
    for i in range(max_iter):
        c=averageCentriods(X,c)
    return c

迭代多次最终效果:
迭代多次

K均值应用:图像压缩

对一张图像进行压缩,要将三维转换为二维,再进行聚类操作。比如,聚类为16类后,将原二维矩阵中类别相同的样本值改成该类别中心点的样本值x_comprised[idx==i+1] = centroids[i],再将该二维矩阵转回三维,即可实现压缩。

# 随机初始化中心
def InitCentroids(X, K):
    rand = np.random.permutation(X) #随机排列
    centroids = rand[:K, :] #选前K个
    return centroids

压缩

X = A.reshape(A.shape[0]*A.shape[1], 3)
K = 16
max_iter = 10
centroid_initial = InitCentroids(X,K)
centroids = k_means(X,centroid_initial,max_iter)
x_comprised = np.zeros(X.shape)
idx = findClass(X,centroids)
for i in range(K):
    x_comprised[idx==i+1] = centroids[i]
x_comprised = x_comprised.reshape(A.shape)

用现成sklearn库调用KMeans

利用写好的KMeans函数,在sklearn.cluster中调用。
y_pred相当于上面提到的idx,表类别,不过是从0开始计数的。
cluster_centers_相当于上面提到的centroids,表中心点。

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=K)
y_pred = kmeans.fit_predict(X)
cluster_centers = kmeans.cluster_centers_
x_pr = np.zeros(X.shape)
for i in range(K):
    x_pr[y_pred == i] = cluster_centers[i]
x_pr = x_pr.reshape(A.shape)

效果展示

第一张为原始图;
第二张为自写的KMeans效果图;
第三张为调用sklearn库的效果图。
在这里插入图片描述

fig, axes = plt.subplots(1, 3, figsize=(14, 6))
axes[0].imshow(A)
axes[1].imshow(x_comprised)
axes[2].imshow(x_pr)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值