首页 > 其他分享 >【scipy 基础】--聚类

【scipy 基础】--聚类

时间:2023-11-01 09:12:24浏览次数:38  
标签:center normal -- 数据 scipy 聚类 ax data

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

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()

image.png
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()

image.png
从图中可以看出,数据的分布情况没有改变,只是数据的范围从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()

image.png
图中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()

image.png

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()

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

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

3. 总结

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

标签:center,normal,--,数据,scipy,聚类,ax,data
From: https://www.cnblogs.com/wang_yb/p/17802261.html

相关文章

  • [Vue]什么是组件化?
    组件的定义:实现应用中局部功能代码和资源的集合。   ......
  • 让美食触手可及:体验螃蟹提货平台的魅力
    【让美食触手可及:体验螃蟹提货平台的魅力】你是否曾经为了准备一顿美味的螃蟹大餐而犯愁?从选购新鲜的螃蟹,到繁琐的清洗、烹饪过程,再到最后的品尝,每一步都需要精心策划。但现在,有了螃蟹提货平台,让你的美食之旅变得更加轻松愉快。螃蟹提货平台是一款专门为美食爱好者打造的在线购......
  • P4395 [BOI2003] Gem 气垫车
    树形DP裸题,令\(f_{i,j}\)表示结点\(i\)标了权值\(j\),\(i\)子树内的最小权值和。转移时枚举每个儿子,再枚举每种颜色,加上颜色不相同的最小DP值。这样时间复杂度就是颜色数量的平方乘上\(n\)。有效颜色数量的上界可以参考我出的那道EternalStar。考虑优化。容易发......
  • 一些题目
    昨天duel了好多题,记一下。HangingHearts这题一看很复杂,又是树形结构,我们考虑用树形DP解决。那么就只用考虑当前子树的关系了。要让最长不下降子序列长度最大,我们先想想什么情况会让最长不下降子序列长度变大。那就是\(f_i\)可以从\(f_j,j<i,a_j\lea_i\)的地方转移过来。......
  • 两种基于时间窗口的限流器的简单实现
    之前开发的一款基于OpenTelemetry的Tracing组件需要使用基于速率限制(RateLimiting)的跟踪采样策略,本想使用现有的解决方案,比如System.Threading.RateLimiting命名空间下的RateLimiter。大体看了RateLimiter的三种实现(固定窗口、滑动窗口和令牌桶),觉得过于相对复杂了点,代码还涉及到......
  • Isito 入门(九):安全认证
    本教程已加入Istio系列:https://istio.whuanle.cn目录7,认证PeerAuthenticationPeerAuthentication的定义实验RequestAuthencationRequestAuthencation的定义AuthorizationPolicy的定义实验提供jwksjson创建RequestAuthentication7,认证本章的内容主要是讲解服务间通讯的......
  • 开源 2 年、打磨 13 年、300 万行代码的开源项目
    从刻在石壁上的甲骨文,再到写在纸上的汉字,每一次信息载体的变更都是文化进步的重要标志。在如今这个信息数字化的时代,我们在享受着数字化便利的同时,数据也在我们看不见的地方飞速增长着,数据的重要性不言而喻。那应该如何将海量数据完整、有序、持久化地保存下来呢?程序员小伙伴看......
  • xp改文件名
    XP系统文件显示文件扩展名的步骤1打开文件夹之后,点击左上角主菜单中的“工具”菜单。(如下图)2在弹出来的设置菜单中,点击“文件夹选项”。(如下图)3来到设置窗口,再点击上面功能菜单中的“查看”。(如下图)4找到“隐藏已知文件类型的扩展名”选项,把左边方框中的”√“去掉。(如......
  • Python求Π
    fromrandomimportrandomfrommathimportsqrtfromtimeimportperf_counterimporttime#进度条print("2022310143117")foriinrange(1,101):print("\r",end="")print("进度:{}%:".format(i),"▓"*(i//......
  • Nacos 安装部署
    Nacos-Server服务部署Nacos依赖Java环境来运行。如果是从代码开始构建并运行Nacos,还需要配置Maven环境。我们直接使用发行版,需要保证JDK版本在1.8以上。NacosServer有两种运行模式:standaloneclusterstandalone模式从https://github.com/alibaba/nacos/releases......