【scipy 基础】--聚类

这篇具有很好参考价值的文章主要介绍了【scipy 基础】--聚类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

【scipy 基础】--聚类
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()

【scipy 基础】--聚类
从图中可以看出,数据的分布情况没有改变,只是数据的范围从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()

【scipy 基础】--聚类
图中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()

【scipy 基础】--聚类

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

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

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

3. 总结

聚类分析可以帮助我们发现数据集中的内在结构、模式和相似性,从而更好地理解数据。
使用Scipy库,可以帮助我们高效的完成数据的聚类分析,而不用去具体了解聚类分析算法的实现方式。文章来源地址https://www.toymoban.com/news/detail-735843.html

到了这里,关于【scipy 基础】--聚类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Scipy优化使用教程】二、Scipy中有约束优化的两种算法

    参考官网:Scipy. 对于有约束的最小化问题, Scipy 提供的 minimize 这个包有三个: trust-constr , SLSQP\\\' 和 COBYLA 。它们要求使用稍微不同的结构来定义约束。 trust-constr 需要要求约束被定义成一系列的 LinearConstraint 和 NonlinearConstraint 两种类型。 SLSQP\\\' 和 COBYLA 需要要求约束条件被定义

    2024年02月02日
    浏览(48)
  • 【scipy 基础】--最优化

    SciPy 库的 optimize 模块主要用于执行各种优化任务。 优化 是寻找特定函数的最小值或最大值的过程,通常用于机器学习、数据分析、工程和其他领域。 scipy.optimize 提供了多种优化算法,包括梯度下降法、牛顿法、最小二乘法等,可以解决各种复杂的优化问题。 该模块还包含

    2024年02月05日
    浏览(46)
  • 【scipy 基础】--稀疏矩阵

    稀疏矩阵 是一种特殊的矩阵,其非零元素数目远远少于零元素数目,并且非零元素分布没有规律。 这种矩阵在实际应用中经常出现,例如在物理学、图形学和网络通信等领域。 稀疏矩阵 其实也可以和一般的矩阵一样处理,之所以要把它区分开来进行特殊处理,是因为: 一

    2024年02月05日
    浏览(40)
  • 【scipy 基础】--正交距离回归

    Scipy 的 ODR 正交距离回归(ODR-Orthogonal Distance Regression)模块,适用于 回归分析 时,因变量和自变量之间存在 非线性关系 的情况。 它提高了回归分析的准确性和稳健性。对于需要解决非线性回归问题的科研人员和工程师来说,它具有非常重要的意义。 ODR正交距离回归 模块的

    2024年02月05日
    浏览(46)
  • 【scipy 基础】--空间计算

    scipy.spatial 子模块提供了一系列用于处理和计算空间数据和几何形状的算法和工具,在许多领域都有广泛的应用,例如计算机视觉、地理信息系统、机器人学、医学影像分析等。 下面,来具体看看 scipy.spatial 子模块为我们提供的主要功能分类。 scipy.spatial 子模块中主要包含的

    2024年02月05日
    浏览(39)
  • 【scipy 基础】--线性代数

    SciPy 的 linalg 模块是 SciPy 库中的一个子模块,它提供了许多用于线性代数运算的函数和工具,如矩阵求逆、特征值、行列式、线性方程组求解等。 相比于 NumPy的linalg模块 , SciPy的linalg模块 包含更多的高级功能,并且在处理一些特定的数值计算问题时,可能会表现出更好的性

    2024年02月05日
    浏览(38)
  • 【scipy 基础】--图像处理

    SciPy 库本身是针对科学计算而不是图像处理的,只是图像处理也包含了很多数学计算, 所以 Scipy 也提供了一个专门的模块 ndimage 用于图像处理。 ndimage 模块提供的功能包括输入/输出图像、显示图像、基本操作(如裁剪、翻转、旋转等)、图像过滤(如去噪、锐化等)、图像

    2024年02月05日
    浏览(48)
  • 【scipy 基础】--插值

    插值运算 是一种数据处理方法,主要用来填补数据之间的空白或缺失值。 因为在实际应用中,数据往往不是完整的,而是存在着空白或缺失值,这些空白或缺失值可能是由于数据采集困难、数据丢失或数据处理错误等原因造成的。 如果直接使用这些空白或缺失值进行分析和

    2024年02月05日
    浏览(39)
  • 【scipy 基础】--统计分布

    scipy.stats 子模块包含大量的概率分布、汇总和频率统计、相关函数和统计测试、掩蔽统计、核密度估计、准蒙特卡罗功能等等。 这个子模块可以帮助我们描述和分析数据,进行假设检验和拟合统计模型等。 具体来说, scipy.stats 子模块包括以下主要功能: 类别 说明 连续统计

    2024年02月05日
    浏览(41)
  • 【scipy 基础】--信号处理

    scipy.signal 模块主要用于处理和分析信号。 它提供了大量的函数和方法,用于滤波、卷积、傅里叶变换、噪声生成、周期检测、谱分析等信号处理任务。 此模块的主要作用是提供一套完整的信号处理工具,从而帮助用户对各种连续或者离散的时间序列数据、音频信号、电信号

    2024年02月05日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包