机器学习:K均值聚类

本文介绍了如何实现K-means聚类算法,包括寻找最近类中心、计算均值类中心、随机初始化以及在2D数据集和图像压缩中的应用。通过实验,学习者将掌握算法的关键步骤并评估其在图像压缩方面的效果。
摘要由CSDN通过智能技术生成

介绍

在本实验中,将实现K均值聚类算法(K-means)并了解其在数据聚类上的工作原理及图像压缩上的应用。

本次实验需要用到的数据集包括:

  • Exp_data1.mat -2D 数据集
  • hzau.jpeg -用于测试k均值聚类算法图像压缩性能的图像

评分标准如下:

# 引入所需要的库文件
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sb
from scipy.io import loadmat

%matplotlib inline

1 K均值聚类 K-means Clustering

在本部分实验中,将实现K均值聚类算法。

在每次迭代中,算法主要包含两个部分:寻找最近类中心点和计算均值类中心。

另外,基于初始化的需求,需创建一个选择随机样本并将其用作初始聚类中心的函数。

1.1 寻找最近类中心点

在本部分实验中,我们将为每个样本点寻找离其距离最近的类中心,并将其赋予对应的类。

具体的更新公式如下:

其中x_i为第i个样本点,u_j为第j个均值类中心。

**要点 1:** 在下方cell中,请**实现''寻找最近类中心点''的代码**。

# ====================== 在这里填入代码 =======================
def find_closest_centroids(X, centroids):
    """   
    输入
    ----------
    X : 尺寸为 (m, n)的矩阵,第i行为第i个样本,n为样本的维数。 
        
    centroids : 尺寸为 (k, n)的矩阵,其中k为类别个数。
    
    输出
    -------
    idx : 尺寸为 (m, 1)的矩阵,第i个分量表示第i个样本的类别。 
    """
    m = X.shape[0]
    k = centroids.shape[0]
    idx = np.zeros(m)
    for i in range(m):
        dist = np.linalg.norm(X[i] - centroids, axis=1)
        idx[i] = np.argmin(dist)
    return idx
# ============================================================= 

如果完成了上述函数 find_closest_centroids,以下代码可用于测试。如果结果为[0 2 1],则计算通过。

#导入数据
data = loadmat('Exp_data1.mat')
X = data['X']
initial_centroids = initial_centroids = np.array([[3, 3], [6, 2], [8, 5]])

idx = find_closest_centroids(X, initial_centroids)
idx[0:3]


#显示并查看部分数据
data2 = pd.DataFrame(data.get('X'), columns=['X1', 'X2'])
data2.head()


#可视化二维数据
fig, ax = plt.subplots(figsize=(9,6))
ax.scatter(X[:,0], X[:,1], s=30, color='k', label='Original')
ax.legend()
plt.show()

1.2 计算均值类中心

在本部分实验中,我们将每类样本的均值作为新的类中心。

具体的更新公式如下:

其中C_j为第j类样本点的指标集,|C_j|为集合C_j的元素个数。

**要点 2:** 在下方cell中,请**实现''计算均值类中心''的代码**。

# ====================== 在这里填入代码 ======================= 
def compute_centroids(X, idx, k):
    m, n = X.shape
    centroids = np.zeros((k, n))
    for i in range(k):
        indices = np.where(idx == i)[0]
        centroids[i] = np.mean(X[indices], axis=0)
    
    return centroids
# ============================================================= 
#测试上述计算均值类中心代码
compute_centroids(X, idx, 3)

1.3 随机初始化类中心

随机选择k个样本作为初始类中心。

**要点 3:** 在下方cell中,请**实现''随机初始化类中心''的代码**。具体为随机选择k个样本作为初始类中心。

# ====================== 在这里填入代码 ======================= 
def init_centroids(X, k):
    m, n = X.shape
    centroids = np.zeros((k, n))
    rand_d = np.random.choice(m, k, replace=False)
    centroids = X[rand_d]
    return centroids
# ============================================================= 
#测试上述随机初始化类中心代码
init_centroids(X, 3)

1.4 实现K均值聚类算法

**要点 4:** 在下方cell中,请通过结合上述步骤**实现''K均值聚类算法''的代码**。

# ====================== 在这里填入代码 =======================
def run_k_means(X, initial_centroids, max_iters):
    m, n = X.shape
    k = initial_centroids.shape[0]
    idx = np.zeros(m, dtype=int)
    centroids = initial_centroids.copy()
    for i in range(max_iters):
        idx = find_closest_centroids(X, centroids)
        centroids = compute_centroids(X, idx, k)
    return idx, centroids
# ============================================================= 

2 将K均值聚类算法应用于数据集1

在本部分实验中,将已实现的K均值聚类算法应用于数据集1,该数据集中的样本维数为2,因此聚类结束后,可通过可视化观察聚类结果。

idx, centroids = run_k_means(X, initial_centroids, 10)
cluster1 = X[np.where(idx == 0)[0],:]
cluster2 = X[np.where(idx == 1)[0],:]
cluster3 = X[np.where(idx == 2)[0],:]

fig, ax = plt.subplots(figsize=(9,6))
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 2')
ax.scatter(cluster3[:,0], cluster3[:,1], s=30, color='b', label='Cluster 3')
ax.legend()
plt.show()

1.3 将K均值聚类算法应用于图像压缩 Image compression with K-means

#读取图像
A = mpl.image.imread('hzau.jpeg')
A.shape

现在我们需要对数据应用一些预处理,并将其提供给K-means算法。

# 归一化图像像素值的范围到[0, 1] 
A = A / 255.

# 对原始图像尺寸作变换
X = np.reshape(A, (A.shape[0] * A.shape[1], A.shape[2]))
X.shape

**要点 5:** 在下方cell中,**请利用K均值聚类算法实现图像压缩**。具体方法是将原始像素替换为对应的均值类中心像素。

# ====================== 在这里填入代码 =======================
# 随机初始化类中心  
initial_centroids = init_centroids(X, 16)
idx, centroids = run_k_means(X, initial_centroids, 10)
idx = find_closest_centroids(X, centroids)
X_compressed = centroids[idx.astype(int)]
A_compressed = X_compressed.reshape(A.shape)
print(A_compressed.shape)
# ============================================================= 

#显示压缩前后的图像
fig, ax = plt.subplots(1, 2, figsize=(9,6))
ax[0].imshow(A)
ax[0].set_axis_off()
ax[0].set_title('Original image')
ax[1].imshow(A_compressed)
ax[1].set_axis_off()
ax[1].set_title('Compressed image')
plt.show()

  • 22
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
K均值聚类是一种常见的无监督学习算法,用于将一组数据分成K个不同的类别。在这个过程中,我们不需要指定分类的标签,而是根据数据点之间的相似性(或距离)来确定它们所属的类别。K均值聚类算法的核心思想是通过计算数据点之间的距离,将它们划分到最近的中心点(质心)所代表的类别中。本文将介绍K均值聚类的基本原理、算法步骤、优缺点及其应用场景。 一、K均值聚类的基本原理 K均值聚类的基本原理是将数据点分成K个不同的类别,其中每个类别都由它们的中心点(质心)所代表。质心是类别中所有数据点的平均值,它可以看作是该类别的中心。K均值聚类算法的目标是最小化所有数据点与它们所属类别的质心之间的距离。为了达到这个目标,算法将迭代地计算每个数据点与所有质心之间的距离,并将其归入距离最近的类别中。 二、K均值聚类算法步骤 K均值聚类算法的步骤如下: 1. 随机选择K个数据点作为初始质心; 2. 计算每个数据点与各个质心之间的距离,将其归为距离最近的质心所代表的类别; 3. 更新每个类别的质心,即将该类别中所有数据点的平均值作为新的质心; 4. 重复步骤2和3,直到质心不再发生变化或达到预定的迭代次数。 三、K均值聚类的优缺点 K均值聚类算法的优点包括: 1. 简单易懂:K均值聚类算法是一种基于距离度量的聚类算法,其原理和实现方法都比较简单,易于理解和实现; 2. 计算效率高:K均值聚类算法的计算时间复杂度较低,通常在处理大规模数据时也能较快地完成聚类任务; 3. 适用范围广:K均值聚类算法可以用于处理不同类型的数据,包括数值型、离散型和混合型数据。 K均值聚类算法的缺点包括: 1. 对于初始质心的选择比较敏感:初始质心的选择可能会影响最终聚类结果,因此需要进行多次随机初始化,并选择最优的结果; 2. 只能得到局部最优解:K均值聚类算法只能得到局部最优解,而不能保证得到全局最优解; 3. 对异常值敏感:K均值聚类算法对异常值比较敏感,异常值可能会导致质心偏移,从而影响聚类结果。 四、K均值聚类的应用场景 K均值聚类算法被广泛应用于各种领域,例如: 1. 机器学习K均值聚类算法可以用于对数据进行聚类,辅助数据分析和模式识别; 2. 数据挖掘:K均值聚类算法可以用于将数据点分为不同的组,从而发现数据点之间的关系; 3. 图像处理:K均值聚类算法可以用于图像分割,将图像分为不同的区域,从而更好地进行图像处理。 总结: K均值聚类算法是一种无监督学习算法,用于将一组数据点分成K个不同的类别。该算法的核心思想是通过计算数据点之间的距离,将它们划分到最近的中心点(质心)所代表的类别中。K均值聚类算法的步骤包括随机选择初始质心、计算每个数据点与各个质心之间的距离、更新每个类别的质心等。该算法的优点包括简单易懂、计算效率高、适用范围广,缺点包括对初始质心的选择比较敏感、只能得到局部最优解、对异常值敏感。K均值聚类算法被广泛应用于机器学习、数据挖掘、图像处理等领域。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值