Python计算机视觉第六章-图像聚类

目录

6.1 K-means聚类

6.1.1 SciPy聚类包

6.1.2 图像聚类

6.1.3 在主成分上可视化图像

6.1.4 像素聚类

6.2 层次聚类

6.3 谱聚类


6.1 K-means聚类

        K-means 是一种将输入数据划分成 k 个簇的简单的聚类算法。K-means 反复提炼初 始评估的类中心,步骤如下:

(1) 以随机或猜测的方式初始化类中心 u i i =1 k
(2) 将每个数据点归并到离它距离最近的类中心所属的类 c i
(3) 对所有属于该类的数据点求平均,将平均值作为新的类中心;
(4) 重复步骤( 2 )和步骤( 3 )直到收敛。
        K-means 试图使 类内总方差 最小:      V=\sum_{i=1}^{k}\sum_{x_{j}\in c_{i}}(x_{j}-\mu_{i})^{2}
        xj 是输入数据,并且是矢量。 该算法是启发式提炼算法,在很多情形下都适用,但 是并不能保证得到最优的结果。
        
        K-means 算法最大的缺陷是必须预先设定聚类数 k ,如果选择不恰当则会导致聚类出来的结果很差。

6.1.1 SciPy聚类包

        在SciPy库中,scipy.cluster.vq模块提供了K-means算法的实现。K-means是一种常见的聚类算法,其主要目标是将数据点分配到预定数量的簇中,使得簇内的数据点尽可能相似,而簇间的数据点尽可能不同。

实验代码:

import numpy as np
from scipy.cluster.vq import kmeans, vq
import matplotlib.pyplot as plt

# 生成测试数据
np.random.seed(42)
data = np.concatenate([
    np.random.normal(loc=[1, 1], scale=0.5, size=(100, 2)),
    np.random.normal(loc=[5, 5], scale=0.5, size=(100, 2)),
    np.random.normal(loc=[8, 1], scale=0.5, size=(100, 2))
])

# 聚类数量
k = 3

# 计算K-means聚类的质心
centroids, distortion = kmeans(data, k)

# 将数据点分配到簇
code, distance = vq(data, centroids)

# 绘制结果
plt.figure(figsize=(8, 6))
plt.scatter(data[:, 0], data[:, 1], c=code, s=30, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=100, marker='x')  # 质心
plt.title('K-means Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

# 打印结果
print("质心位置:")
print(centroids)
print("失真度(Distortion):", distortion)

分析:

  1. 聚类效果

    • 上述代码生成了三类数据点,每类数据点在二维空间中分布。K-means聚类会将这些数据点分成三簇,并计算每簇的质心。
    • 绘图中,数据点的颜色表示它们所属的簇,红色的“x”标记表示各簇的质心。
  2. 质心位置

    • centroids数组中包含了每个簇的质心位置。你可以通过这些质心了解每个簇的中心位置。
  3. 失真度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值