python快速实现10种聚类算法

文章目录

听说点进蝈仔帖子的都喜欢点赞加关注~~

鸣谢:

https://mp.weixin.qq.com/s/jtcDiAV_MC1_0GeR-8YVOg

什么是聚类?

python快速实现10种聚类算法

将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异。”物以类聚,人以群分”,在自然科学和社会科学中,存在着大量的分类问题。聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法。聚类分析起源于分类学,但是聚类不等于分类。聚类与分类的不同在于,聚类所要求划分的类是未知的。聚类分析内容非常丰富,有系统聚类法、有序样品聚类法、动态聚类法、模糊聚类法、图论聚类法、聚类预报法等。

另一种说法:
聚类是一种机器学习技术,它涉及到数据点的分组。给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组。理论上,同一组中的数据点应该具有相似的属性和/或特征,而不同组中的数据点应该具有高度不同的属性和/或特征。聚类是一种无监督学习的方法,是许多领域中常用的统计数据分析技术。

在数据科学中,我们可以使用聚类分析从我们的数据中获得一些有价值的见解。

; 什么是聚类算法?

有许多类型的聚类算法。许多算法在特征空间中的示例之间使用相似度或距离度量,以发现密集的观测区域。因此,在使用聚类算法之前,扩展数据通常是良好的实践。

聚类分析的所有目标的核心是被群集的各个对象之间的相似程度(或不同程度)的概念。聚类方法尝试根据提供给对象的相似性定义对对象进行分组。
—源自:《统计学习的要素:数据挖掘、推理和预测》,2016年

一些聚类算法要求您指定或猜测数据中要发现的群集的数量,而另一些算法要求指定观测之间的最小距离,其中示例可以被视为”关闭”或”连接”。因此,聚类分析是一个迭代过程,在该过程中,对所识别的群集的主观评估被反馈回算法配置的改变中,直到达到期望的或适当的结果。scikit-learn 库提供了一套不同的聚类算法供选择。下面列出了10种比较流行的算法:

  1. 亲和力传播
  2. 聚合聚类
  3. BIRCH
  4. DBSCAN
  5. K-均值
  6. Mini-Batch K-均值
  7. Mean Shift
  8. OPTICS
  9. 光谱聚类
  10. 高斯混合
    每个算法都提供了一种不同的方法来应对数据中发现自然组的挑战。没有最好的聚类算法,也没有简单的方法来找到最好的算法为您的数据没有使用控制实验。在本文中,我们将回顾如何使用来自 scikit-learn 库的这10个流行的聚类算法中的每一个。

安装库

pip install scikit-learn

创建一个测试二分类数据集


from numpy import where
from sklearn.datasets import make_classification
from matplotlib import pyplot

X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

for class_value in range(2):

row_ix = where(y == class_value)

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

pyplot.show()

下面正式开始聚类算法

亲和力传播算法AP

AP简介
亲和力传播算法无需指定聚类的结果,使用的是AffinityPropagation,详情请参考:https://www.cnblogs.com/lc1217/p/6908031.html

算法优缺点
AP算法的优点:

不需要制定最终聚类族的个数
族中心点是已有的数据点,并不会额外出现新的数据点
其结果的平方差误差较小。
AP算法的不足:

AP算法的时间复杂度较高,一次迭代大概O(N3)
调参的结果(阻尼系数)对结果影响巨大

from numpy import unique
from sklearn.cluster import AffinityPropagation
import numpy as np
from sklearn.preprocessing import StandardScaler

X = np.random.random((500, 4))
X = StandardScaler().fit_transform(X)

model = AffinityPropagation(damping=0.5)

model.fit(X)
yhat = model.predict(X)
clusters = len(unique(yhat))

聚合聚类

集聚类的步骤: (Steps of Agglomerative Clustering:)
Initially, all the data-points are a cluster of its own.

最初,所有数据点都是其自身的集群。
Take two nearest clusters and join them to form one single cluster.

选取两个最近的群集,并将它们合并为一个群集。
Proceed recursively step 2 until you obtain the desired number of clusters.

递归地执行步骤2,直到获得所需的群集数量。


from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import AgglomerativeClustering
from matplotlib import pyplot

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

model = AgglomerativeClustering(n_clusters=2)

yhat = model.fit_predict(X)

clusters = unique(yhat)

for cluster in clusters:

row_ix = where(yhat == cluster)

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

pyplot.show()

BIRCH

BIRCH的全称是利用层次方法的平衡迭代规约和聚类(Balanced Iterative Reducing and Clustering Using Hierarchies),它是用层次方法来聚类和规约数据。

BIRCH只需要单遍扫描数据集就能进行聚类,那它是怎么做到的呢?

BIRCH算法利用了一个树结构来帮助我们快速的聚类,这个树结构类似于平衡B+树,一般将它称之为聚类特征树(Clustering Feature Tree,简称CF Tree)。这颗树的每一个节点是由若干个聚类特征(Clustering Feature,简称CF)组成。

从下图我们可以看看聚类特征树是什么样子的:每个节点包括叶子节点都有若干个CF,而内部节点的CF有指向孩子节点的指针,所有的叶子节点用一个双向链表链接起来。

python快速实现10种聚类算法
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.datasets.samples_generator import make_blobs

X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1,-1], [0,0], [1,1], [2,2]], cluster_std=[0.4, 0.3, 0.4, 0.3],
                  random_state =9)
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()

DBSCAN

DBSCAN 聚类(其中 DBSCAN 是基于密度的空间聚类的噪声应用程序)涉及在域中寻找高密度区域,并将其周围的特征空间区域扩展为群集。


from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import DBSCAN
from matplotlib import pyplot

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

model = DBSCAN(eps=0.30, min_samples=9)

yhat = model.fit_predict(X)

clusters = unique(yhat)

for cluster in clusters:

row_ix = where(yhat == cluster)

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

pyplot.show()

K均值

k-means算法是一种简单的迭代型聚类算法,采用距离作为相似性指标,从而发现给定数据集中的K个类,且每个类的中心是根据类中所有值的均值得到,每个类用聚类中心来描述。对于给定的一个包含n个d维数据点的数据集X以及要分得的类别K,选取欧式距离作为相似度指标,聚类目标是使得各类的聚类平方和最小.


from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import KMeans
from matplotlib import pyplot

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

model = KMeans(n_clusters=2)

model.fit(X)

yhat = model.predict(X)

clusters = unique(yhat)

for cluster in clusters:

row_ix = where(yhat == cluster)

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

pyplot.show()

Mini-Batch K-均值

Mini Batch K-Means算法是K-Means算法的一种优化方案,采用小批量的数据子集减小计算时间,同时仍试图优化目标函数,这里所谓的小批量是指每次训练算法时所随机抽取的数据子集,采用这些随机产生的子集进行训练算法,大大减小了计算时间,与其他算法相比,减少了k-均值的收敛时间,小批量k-均值产生的结果,一般只略差于标准算法。

Mini Batch KMeans使用了一个种叫做Mini Batch(分批处理)的方法对数据点之间的距离进行计算。Mini Batch的好处是计算过程中不必使用所有的数据样本,而是从不同类别的样本中抽取一部分样本来代表各自类型进行计算。由于计算样本量少,所以会相应的减少运行时间,但另一方面抽样也必然会带来准确度的下降。


from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import MiniBatchKMeans
from matplotlib import pyplot

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

model = MiniBatchKMeans(n_clusters=2)

model.fit(X)

yhat = model.predict(X)

clusters = unique(yhat)

for cluster in clusters:

row_ix = where(yhat == cluster)

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

pyplot.show()

均值漂移聚类

均值漂移聚类涉及到根据特征空间中的实例密度来寻找和调整质心。


from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import MeanShift
from matplotlib import pyplot

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

model = MeanShift()

yhat = model.fit_predict(X)

clusters = unique(yhat)

for cluster in clusters:

row_ix = where(yhat == cluster)

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

pyplot.show()

OPTICS

DBSCAN有一些缺点,如:参数的设定,比如说阈值和半径 这些参数对结果很敏感,还有就是该算法是全局密度的,假若数据集的密度变化很大时,可能识别不出某些簇。如下图:

核心距离:假定P是核心对象,人为给定一个阈值A,然后计算关于P点满足阈值A的最小的半径R,即在R内,P最少有给定A个点数。

可达距离:对象q到对象p的可达距离是指p的核心距离和p与q之间欧几里得距离之间的较大值。如果p不是核心对象,p和q之间的可达距离没有意义。
核心距离:假若半径ξ=8 阈值MinPts=5

则有图而知:P是核心对象(在半径8内,P的近邻对象个数>5),并且P的核心距离为4 因为在半径4内,有四个近邻点,满足阈值5


from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import OPTICS
from matplotlib import pyplot

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

model = OPTICS(eps=0.8, min_samples=10)

yhat = model.fit_predict(X)

clusters = unique(yhat)

for cluster in clusters:

row_ix = where(yhat == cluster)

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

pyplot.show()

光谱聚类

光谱聚类是一类通用的聚类方法,取自线性线性代数。
它是通过 Spectral 聚类类实现的,而主要的 Spectral 聚类是一个由聚类方法组成的通用类,取自线性线性代数。要优化的是” n _ clusters “超参数,用于指定数据中的估计群集数量。下面列出了完整的示例。


from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import SpectralClustering
from matplotlib import pyplot

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

model = SpectralClustering(n_clusters=2)

yhat = model.fit_predict(X)

clusters = unique(yhat)

for cluster in clusters:

row_ix = where(yhat == cluster)

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

pyplot.show()

高斯混合模型

混合模型是一个可以用来表示在总体分布(distribution)中含有 K 个子分布的概率模型,换句话说,混合模型表示了观测数据在总体中的概率分布,它是一个由 K 个子分布组成的混合分布。混合模型不要求观测数据提供关于子分布的信息,来计算观测数据在总体分布中的概率。
高斯混合模型可以看作是由 K 个单高斯模型组合而成的模型,这 K 个子模型是混合模型的隐变量(Hidden variable)。一般来说,一个混合模型可以使用任何概率分布,这里使用高斯混合模型是因为高斯分布具备很好的数学性质以及良好的计算性能。

举个不是特别稳妥的例子,比如我们现在有一组狗的样本数据,不同种类的狗,体型、颜色、长相各不相同,但都属于狗这个种类,此时单高斯模型可能不能很好的来描述这个分布,因为样本数据分布并不是一个单一的椭圆,所以用混合高斯分布可以更好的描述这个问题,如下图所示:

python快速实现10种聚类算法

from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.mixture import GaussianMixture
from matplotlib import pyplot

X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)

model = GaussianMixture(n_components=2)

model.fit(X)

yhat = model.predict(X)

clusters = unique(yhat)

for cluster in clusters:

row_ix = where(yhat == cluster)

pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

pyplot.show()

Original: https://blog.csdn.net/weixin_39490300/article/details/123889554
Author: 易烊千蝈
Title: python快速实现10种聚类算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/732104/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • CUDA(10.2)+PyTorch安装加配置 详细完整教程

    以下均为博主亲测的可靠流程,其中有一些我遇到的问题及解决方法,希望能帮到大家,不再踩坑,也欢迎大家交流遇到的问题和配置方法。 CUDA(10.2)+PyTorch安装加配置 详细完…

    Python 2023年10月27日
    046
  • TCP/IP协议簇

    0 TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议…

    Python 2023年6月9日
    0154
  • Python脚本写端口扫描器(socket,python-nmap)

    目录 ​​Socket模块编写​​ ​​扫描给定主机是否开放了指定的端口​​ ​​python-nmap模块编写 ​​ ​​扫描给定ip或给定网段内指定端口是否开放​​ 一个用py…

    Python 2023年5月25日
    057
  • pytest框架实现接口自动化

    一.安装requests模块 pip install requests 二.get请求接口,拿到返回值 1.url和params拼接 import requests a=[‘htt…

    Python 2023年9月11日
    046
  • 学习笔记——Django项目中的请求

    2022-10-03 url中的位置参数 位置参数存放的位置 是子应用中的自定义的”urls.py”文件中的路由中。 位置参数的设置: 如果位置参数很多,那…

    Python 2023年10月31日
    024
  • Python爬虫之Scrapy框架(案例练习)

    @作者 : SYFStrive @博客首页 : HomePage; 🥧 上一篇续文传送门 📌: 个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌: 如果觉得文章对你有帮助可以点点关注…

    Python 2023年8月1日
    044
  • Linux系统安装并配置nginx实现多服务同一端口

    基本诉求是项目要实现并发,因为用了深度学习框架,tornado服务无法通过以下方式多进程开启服务, python;gutter:true; http_server.bind(por…

    Python 2023年10月26日
    062
  • python randn(5)_Python 数据处理(五)

    DataFrame(续) 索引和选择 索引的基础语法如下 选择列 df[col] Series 用标签选择行 df.loc[label] Series 用整数位置选择行 df.il…

    Python 2023年8月19日
    049
  • 【Python】使用一行代码实现均值,中位数和众数

    1. 引言 在做数据分析时,我们经常需要使用统计量来更加方便的了解数据的分布。但是统计量有多种计算方式,本文重点介绍常用的三种数据统计中常用的统计量,即均值,中位数和众数;并尝试使…

    Python 2023年5月25日
    0112
  • Spring Cloud08: Hystrix 容错机制与数据监控

    一、概述 容错机制是指的是在一个分布式系统中,每个微服务之间是相互调用的,并且他们之间相互依赖,而实际的运行情况中,可能会因为各种原因导致某个微服务不可用,那么依赖于这个微服务的其…

    Python 2023年6月9日
    0114
  • pytest之parametrize参数化

    文章末尾给大家留了大量福利哟 前言 我们都知道pytest和unittest是兼容的,但是它也有不兼容的地方,比如ddt数据驱动,测试夹具fixtures(即setup、teard…

    Python 2023年9月12日
    058
  • Python项目实战 —— 04. 淘宝用户行为分析

    Python项目实战 Python项目实战–目录 Python项目实战 —— 04. 淘宝用户行为分析 * 一、背景 二、解题思路 三、数据分析 – 3.1…

    Python 2023年8月15日
    052
  • Django部署深度学习项目-1

    如何使用pycharm社区版创建django项目? 安装相关依赖库之后: 创建一个空文件夹,在此文件夹路径下使用命令 django-admin startproject mysit…

    Python 2023年8月4日
    034
  • 客户端视频渲染目前最理想的解决方案

    很多客户端产品有视频渲染需求。视频渲染有软件渲染和硬件渲染两种方案。 软件渲染一般来说需要将常见的yuv视频流转换成rgb/rgba视频流,再通过GDI绘制到窗口上。软件渲染的优势…

    Python 2023年10月11日
    046
  • Python代码阅读(第36篇):列表偏移

    本文中的代码实现了将列表向左或向右偏移指定位数的功能。 [En] The code read in this article implements the function of …

    Python 2023年5月25日
    056
  • .NET 开源项目推荐之 直播控制台解决方案 Macro Deck

    流媒体是一个吸引数亿万玩家的严肃行业。 最受欢迎的游戏锦标赛的转播获得了数百万的观看次数,从商业角度来看,这也使游戏行业变得有趣。在直播圈有个很受欢迎的直播控制台程序Macro D…

    Python 2023年10月19日
    046
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球