0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

介绍一种基于最小化平方误差的聚类算法

冬至子 来源:数据之书 作者:databook 2023-08-09 16:01 次阅读

物以类聚, 「聚类算法 使用最优化的算法来计算数据点之间的距离,并将它们分组到最近的簇中。

Scipy的聚类模块中,进一步分为两个聚类子模块:

  1. vq(vector quantization):提供了一种基于向量量化的聚类算法。

「vq模块」 支持多种向量量化算法,包括K-meansGMM(高斯混合模型)和WAVG(均匀分布)。

  1. hierarchy:提供了一种基于层次聚类的聚类算法。

「hierarchy模块」 支持多种层次聚类算法,包括wardelbowcentroid

总之,Scipy中的vqhierarchy模块都提供了一种基于最小化平方误差的聚类算法,
它们可以帮助我们快速地对大型数据集进行分组,从而更好地理解数据的分布和模式。

1. vq 聚类

vq聚类算法的原理是将数据点映射到一组称为“超空间”的低维向量空间中,然后将它们分组到最近的簇中。

首先,我们创建一些测试数据:(创建3个类别的测试数据)

import numpy as np
import matplotlib.pyplot as plt

data1 = np.random.randint(0, 30, (100, 3))
data2 = np.random.randint(30, 60, (100, 3))
data3 = np.random.randint(60, 100, (100, 3))

data = np.concatenate([data1, data2, data3])

fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.scatter(data[:, 0], data[:, 1], data[:, 2])
plt.show()

图片

data1data2data3分布在3个区域,
每个数据集有 「100条」 数据,每条数据有 「3个属性」

1.1. 白化数据

「聚类」 之前,一般会对数据进行 「白化」 ,所谓 「白化数据」 ,是指将数据集中的每个特征或每个样本的值都统一为同一个范围。
这样做的目的是为了消除特征之间的量纲和数值大小差异,使得不同特征具有相似的重要性,从而更容易进行聚类算法。

在聚类之前对数据进行 「白化处理」 也被称为 「预处理」 阶段。

from scipy.cluster.vq import whiten

# 白化数据
normal_data = whiten(data)

# 绘制白化后的数据
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.scatter(normal_data[:, 0], normal_data[:, 1], normal_data[:, 2])
plt.show()

图片

从图中可以看出,数据的分布情况没有改变,只是数据的范围从0~100变成0.0~3.5
这就是白化的效果。

1.2. K-means

白化之后,就可以用K-meas方法来进行聚类运算了。
scipyvq模块中有2个聚类函数:kmeanskmeans2

kmeans函数最少只要传入两个 参数 即可:

  1. 需要聚类的数据,也就是上一步白化的数据
  2. 聚类的数目

「返回值」 有2部分:

  1. 各个聚类的中心
  2. 各个点距离聚类中心点的欧式距离的平均值
from scipy.cluster.vq import kmeans 

center_points, distortion = kmeans(normal_data, 3)
print(center_points)
print(distortion)
# 运行结果
[[1.632802   1.56429847 1.51635413]
 [0.48357948 0.55988559 0.48842058]
 [2.81305235 2.84443275 2.78072325]]
0.5675874109728244

把三个聚类点绘制在图中来看更加清楚:

fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.scatter(normal_data[:, 0], 
           normal_data[:, 1], 
           normal_data[:, 2])
ax.scatter(
    center_points[:, 0],
    center_points[:, 1],
    center_points[:, 2],
    color="r",
    marker="^",
    linewidths=5,
)

plt.show()

图片

图中3个红色的点就是聚类的中心点。

1.3. K-means2

kmeans2函数使用起来和kmeans类似,但是返回值有区别,
kmeans2的返回的是:

  1. 聚类的中心点坐标
  2. 每个聚类中所有点的索引
from scipy.cluster.vq import kmeans2

center_points, labels = kmeans2(normal_data, 3)
print(center_points)
print(labels)
# 运行结果
[[2.81305235 2.84443275 2.78072325]
 [1.632802   1.56429847 1.51635413]
 [0.48357948 0.55988559 0.48842058]]
[2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 ... ...
 0 0 0 0]

可以看出,计算出的聚类中心点center_pointskmeans一样(只是顺序不一样),
labels0,1,2三种值,代表normal_data中每个点属于哪个分类。

kmeans2除了返回了聚类中心点,还有每个数据点属于哪个聚类的信息
所以我们绘图时,可以将属于不同聚类的点标记不同的颜色。

fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
arr_data = [[], [], []]
for idx, nd in enumerate(normal_data):
    arr_data[labels[idx]].append(nd)

data = np.array(arr_data[0])
ax.scatter(data[:, 0], data[:, 1], data[:, 2], color='lightblue')
data = np.array(arr_data[1])
ax.scatter(data[:, 0], data[:, 1], data[:, 2], color='lightgreen')
data = np.array(arr_data[2])
ax.scatter(data[:, 0], data[:, 1], data[:, 2], color='lightyellow')

ax.scatter(
    center_points[:, 0],
    center_points[:, 1],
    center_points[:, 2],
    color="r",
    marker="^",
    linewidths=5,
)

plt.show()

图片

2. hierarchy 聚类

hierarchy聚类算法的步骤比较简单:

  1. 将每个样本视为一个簇
  2. 计算各个簇之间的距离,将距离最近的两个簇合并为一个簇
  3. 重复第二个步骤,直至到最后一个簇
from scipy.cluster.hierarchy import ward, fcluster, dendrogram
from scipy.spatial.distance import pdist

# 计算样本数据之间的距离
# normal_data是之前白化之后的数据
dist = pdist(normal_data)

# 在距离上创建Ward连接矩阵
Z = ward(dist)

# 层次聚类之后的平面聚类
S = fcluster(Z, t=0.9, criterion='distance')
print(S)
# 运行结果
[20 26 23 18 18 22 18 28 21 22 28 26 27 27 20 17 23 20 26 23 17 25 20 22
 ... ...
  5 13  3  4  2  9  9 13 13  8 11  6]

返回的S中有 「300个数据」 ,和normal_data中的数据一样多,S中数值接近的点,分类越接近。

从数值看聚类结果不那么明显,scipy的层次聚类提供了一个dendrogram方法,内置了matpltlib的功能,
可以把层次聚类的结果用图形展示出来。

P = dendrogram(Z, no_labels=True)
plt.show()

图片
从这个图可以看出每个数据分别属于哪个层次的聚类。
最底层的叶子节点就是normal_data中的各个数据,这些数据的索引信息可以从 P 中获取。

# P是一个字典,包含聚类之后的信息
# key=ivl 是图中最底层叶子节点在 normal_data 中的索引
print(P["ivl"])
# 运行结果
['236', '269', '244', ... ... '181', '175', '156', '157']

3. 总结

聚类分析可以帮助我们发现数据集中的内在结构、模式和相似性,从而更好地理解数据。
使用Scipy库,可以帮助我们高效的完成数据的聚类分析,而不用去具体了解聚类分析算法的实现方式。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19159

    浏览量

    229113
  • 向量机
    +关注

    关注

    0

    文章

    166

    浏览量

    20850
  • GMM
    GMM
    +关注

    关注

    0

    文章

    5

    浏览量

    7250
收藏 人收藏

    评论

    相关推荐

    一种基于GiST的层次算法

    层次方法是聚类分析的个重要方法。该文利用通用搜索树实现了一种新的层次
    发表于 04-23 10:10 24次下载

    一种基于层次的属性全局离散算法

    本文摒弃了以往利用断点集来进行离散算法思想,提出了一种新的基于粗糙集和分裂的层次的全局离散
    发表于 12-29 17:15 3次下载

    一种改进的FCM算法及其在赤潮预测中的应用

    一种改进的FCM算法及其在赤潮预测中的应用:针对传统FCM算法的不足,文中提出了一种改进的F
    发表于 03-15 15:38 26次下载

    一种原型模糊的初始方法

    一种原型模糊的初始方法 模糊是非监督
    发表于 10-21 16:02 990次阅读

    一种有效的多关系算法

    一种有效的多关系算法_邓左祥
    发表于 01-03 15:24 0次下载

    一种改进的BIRCH算法方法

    为解决传统BIRCH算法对数据对象输入顺序敏感、结果不稳定的问题,提出了一种改进的BIRCH算法。该
    发表于 11-10 15:52 1次下载
    <b class='flag-5'>一种</b>改进的BIRCH<b class='flag-5'>算法</b><b class='flag-5'>聚</b><b class='flag-5'>类</b>方法

    一种改进的凝聚型层次算法

    在比特流未知协议识别过程中,针对如何将得到的多协议数据帧分为单协议数据帧这问题,提出了一种改进的凝聚型层次算法。该
    发表于 11-21 08:58 0次下载
    <b class='flag-5'>一种</b>改进的凝聚型层次<b class='flag-5'>聚</b><b class='flag-5'>类</b><b class='flag-5'>算法</b>

    K均值算法的MATLAB实现

    K-means算法是最简单的一种算法算法的目的是使各个样本与所在
    发表于 12-01 14:07 2.1w次阅读
    K均值<b class='flag-5'>聚</b><b class='flag-5'>类</b><b class='flag-5'>算法</b>的MATLAB实现

    一种新的人工鱼群混合算法

    人工鱼群是一种随机搜索优化算法,具有较快的收敛速度,对问题的机理模型与描述无严格要求,具有广泛的应用范围。本文在该算法的基础上,结合传统的K-means
    发表于 12-04 16:18 0次下载

    一种新的基于流行距离的谱算法

    本文提出了一种新的基于流行距离的谱算法,这是一种新型的聚类分析算法。不仅能够对任意的非规则形
    发表于 12-07 14:53 3次下载

    基于最小重构误差向量图像检索算法

    针对局部聚合描述符向量( VLAD)模型中对特征软量化时权重系数的取值不确定性和特征量化误差较大问题,提出一种具有最小重构误差的权重系数分配算法
    发表于 12-18 09:56 0次下载
    基于<b class='flag-5'>最小</b>重构<b class='flag-5'>误差</b>向量图像检索<b class='flag-5'>算法</b>

    一种基于MapReduce的图结构算法

    图结构(SCAN)是一种著名的基于密度的图算法。该
    发表于 12-19 11:05 0次下载
    <b class='flag-5'>一种</b>基于MapReduce的图结构<b class='flag-5'>聚</b><b class='flag-5'>类</b><b class='flag-5'>算法</b>

    一种改进的联合相似度推荐算法

    协同过滤算法由于推荐效果良好,而被广泛应用于推荐领域,但其在数据稀疏及冷启动的情况下会导致推荐效果明显下降。在数据稀疏情况下,为充分利用用户的历史信息以提髙算法的推荐精度,提出一种改进的
    发表于 03-18 11:17 10次下载
    <b class='flag-5'>一种</b>改进的<b class='flag-5'>聚</b><b class='flag-5'>类</b>联合相似度推荐<b class='flag-5'>算法</b>

    一种自适应的关联融合算法

    为解决传统算法多数需要预先设定聚参数且无法有效识别异常点和噪声点的问题,提出一种自适应的关联融合
    发表于 04-01 16:16 13次下载
    <b class='flag-5'>一种</b>自适应的关联融合<b class='flag-5'>聚</b><b class='flag-5'>类</b><b class='flag-5'>算法</b>

    一种基于分块集成的图像算法

    的图像算法( Block integration Based Image Clustering,BI-CⅠ。首先,将图像数据分为若干矩阵块;然后,利用核范数矩阵回归构造基于某矩阵块的系数矩阵,同时提岀了
    发表于 05-29 14:20 3次下载