基于python的机器学习(五)—— 聚类(二)

一、k-medoids聚类算法

k-medoids是一种聚类算法,它是基于k-means聚类算法的一种改进。k-medoids算法也是一种迭代算法,但是它将中心点限定为数据集中的实际样本点,而不是任意的点。

具体来说,k-medoids算法从数据集中选择k个初始中心点,然后将数据集中的每个样本分配给最近的中心点,并计算每个中心点的总距离。接下来,算法会尝试用一个未被选中的样本替换每个中心点,并计算新的总距离,选择总距离最小的替换。重复这个过程,直到中心点的位置不再改变或达到预定的迭代次数。

1.1 k-medoids与k-means算法的异同点

k-medoids算法是k-means算法的一个变种,它们都是聚类算法,但在一些方面有所不同。

相同点:

  1. 目标函数:k-medoids和k-means算法的目标都是将数据点划分到k个簇中,使得簇内的数据点相似度最大化,簇间的相似度最小化。
  2. 选择中心点:k-medoids和k-means算法都需要选择k个中心点作为初始点,然后通过迭代算法来更新中心点,直到收敛。
  3. 簇分配:k-medoids和k-means算法都是通过计算数据点与中心点之间的距离来确定数据点的簇分配。

不同点:

  1. 中心点的选择:k-medoids算法选择的中心点必须是实际数据点,而k-means算法的中心点可以是任意点。
  2. 距离度量:k-medoids算法使用的是曼哈顿距离(或其他适合计算离散特征的距离度量),而k-means算法使用的是欧几里德距离(适用于计算连续特征的距离度量)。
  3. 簇的划分:k-medoids算法的簇划分更加稳定,因为每个簇的中心点必须是实际数据点,而k-means算法的簇划分可能会受到初始点的选择影响,可能会得到不同的结果。
  4. 计算复杂度:k-medoids算法的计算复杂度要高于k-means算法,因为它需要计算每个数据点到中心点的距离,并选择最近的中心点作为簇分配。

1.2 k-medoids算法原理和实例

k-medoids算法是一种聚类算法,它的原理是通过将数据集中的每个数据点分配给最近的一个中心点,然后重新计算每个中心点的位置,直到达到收敛的效果为止。

下面是k-medoids算法的步骤:

  1. 初始化k个中心点,可以随机选择k个数据点作为中心点。
  2. 对于每个数据点,计算其到所有中心点的距离,将它分配给距离最近的中心点。
  3. 对于每个中心点,计算它与其他被分配给它的数据点的总距离,选择具有最小总距离的数据点作为新中心点。
  4. 重复步骤2和步骤3,直到中心点不再改变或达到最大迭代次数。

下面是一个简单的示例代码来实现k-medoids算法

import numpy as npdef k_medoids(X, k):# 随机初始化质心m, n = X.shapecentroids_idx = np.random.choice(m, size=k, replace=False)centroids = X[centroids_idx]# 迭代更新质心max_iter = 100for _ in range(max_iter):# 分配每个样本到最近的质心distances = np.linalg.norm(X[:, np.newaxis] - centroids, axis=2)labels = np.argmin(distances, axis=1)# 更新质心为最小代价for i in range(k):cluster_X = X[labels == i]cluster_distances = np.linalg.norm(cluster_X[:, np.newaxis] - cluster_X, axis=2)costs = np.sum(cluster_distances, axis=1)best_idx = np.argmin(costs)centroids[i] = cluster_X[best_idx]return centroids, labels# 示例用法
X = np.array([[1, 2], [2, 1], [3, 2], [9, 10], [10, 9], [11, 10]])
k = 2
centroids, labels = k_medoids(X, k)print("质心:")
print(centroids)
print("标签:")
print(labels)

该示例代码中,X是输入数据的特征矩阵,k是聚类的类别数。k_medoids函数使用k-medoids算法进行聚类。它首先随机选择k个样本作为质心,然后迭代更新质心和样本的分配,直到达到最大迭代次数为止。最后返回最终的质心和样本的标签。

1.3 k-medoids聚类算法的优缺点

k-medoids聚类算法是一种基于划分的聚类算法,优点和缺点如下:

优点:

  1. 不受离群值的影响:k-medoids聚类算法使用实际数据点作为聚类中心(medoids),因此对离群值不敏感。这使得k-medoids算法在处理存在离群值的数据集时表现较好。
  2. 适用于任意距离度量:k-medoids算法可以使用任意距离度量来计算数据点之间的相似度,因此可以适用于各种类型的数据集。这使得k-medoids算法在处理非欧几里德空间的数据时具有灵活性。
  3. 可解释性:k-medoids算法生成的聚类结果直观易懂,因为每个聚类中心都是数据集中实际存在的数据点。

缺点:

  1. 对初始聚类中心的敏感性:k-medoids算法对初始聚类中心的选择非常敏感,不同的初始中心可能会导致不同的聚类结果。因此,为了获取稳定和准确的聚类结果,需要使用合适的初始聚类中心选择方法。
  2. 计算复杂度高:k-medoids算法的计算复杂度较高,特别是在处理大规模数据集时。因为算法需要计算每个数据点到每个聚类中心的距离,并且在每一次迭代中都需要重新选择最优的聚类中心。

1.4 k-medoids聚类算法的代码实现

Sklearn 的正式发行版 0.22 并没有提供 k-medoids 聚类模块,但在 GitHub网站中,可下载 k-medoids聚类模块的测试版,网址为https://github.com/terkkila/scikit-learn/tree/kmedoids/sklearn/clusterhttps://github.com/terkkila/scikit-learn/tree/kmedoids/sklearn/cluster在该页面中,需要下载_ _init_ _.pyk_medoids_.py两个文件,将其复制到 X:\Anaconda3\lib\site-packages\sklearn\cluster 目录下(会替换掉原来的_ _init_ _.py文件),即可使用 k_medoids 聚类模块。
k-medoids 聚类模块实际上是一个 k_medoids类,k_medoids类的使用方法和 k-means类很相似,它的构造函数的参数有:①簇的个数 n_clusters;②初始簇中心的获取方法 init();③获取初始簇中心的更迭次数 n_init。

用 k_medoids聚类算法将数据聚成2类(数据文件km.txt)。

km.txt 文件内容如下:(与上篇文章中的相同)

import numpy as np
import matplotlib.pyplot as plt
from pyclust import KMedoids
import treelibX1, X2 = [], []
fr = open('km.txt')
for line in fr.readlines():lineArr = line.strip().split()X1.append([int(lineArr[0])])X2.append([int(lineArr[1])])
X = np.array(list(zip(X1, X2))).reshape(len(X1), 2)model = KMedoids(2).fit(X)        # 调用估计器fit()方法进行聚类,聚类数为2
colors = ['b', 'g', 'r', 'c']
markers = ['o', 's', 'x', 'o']for i, l in enumerate(model.labels_):plt.plot(X1[i], X2[i], color=colors[l], marker=markers[i], ls='None')# 下面用X形绘制中心点
centroids = model.cluster_centers_            # centroids保存了所有中心点for i in range(2):plt.plot(centroids[i][0], centroids[i][1], markers[2])
plt.show()

二、DBSCAN聚类算法

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法。它通过将数据点划分为核心点、边界点和噪音点来进行聚类。DBSCAN算法的基本思想是寻找具有足够密度的数据点,将它们划分为一个簇,并通过连接具有足够密度的相邻数据点来扩展该簇。

2.1 DBSCAN聚类算法中的几个定义

  1. ϵ-领域:ϵ-领域是指一个点周围半径为ϵ的范围内的所有点的集合。具体地说,对于给定的一个点p,其ϵ-领域包括了所有与p的距离小于等于ϵ的点。
  2. 核心对象:核心对象是指一个数据点,如果在指定的半径r内至少有minPts个数据点,则该数据点被视为核心对象。具体来说,一个核心对象需要满足以下两个条件:
    1. 这些数据点必须是在半径r内的,即它们之间的距离必须小于等于r。
    2. 在半径r内至少有minPts个数据点,包括自身。
  3. 密度可达:对于DBSCAN算法中的一个样本点p,如果存在样本点q,使得q在p的ε领域内,并且q的密度达到了MinPts的要求,那么我们称q在以p为中心的ε领域内与p密度可达。而如果存在一系列样本点p1,p2,...,pn,使得p1与p2密度可达,p2与p3密度可达,...,pn-1与pn密度可达,那么我们称pn在以p1为中心的ε领域内与p1密度可达。
  4. 直接密度可达:对于DBSCAN算法中的一个样本点A,如果在半径ε内存在另一个样本点B,且B在A的ε-邻域内,即距离A小于等于ε,则样本点A的直接密度可达于样本点B。

2.2 DBSCAN聚类算法步骤

DBSCAN (Density-Based Spatial Clustering of Applications with Noise) 是一种聚类算法,用于在基于密度的空间中发现聚类。

DBSCAN算法的步骤如下:

  1. 初始化参数:设置半径ε和最小点数MinPts。
  2. 计算密度:对于数据集中的每个数据点,计算它的ε-邻域内的点的数量。如果该数量大于等于MinPts,则将该点标记为核心点。
  3. 标记边界点:对于每个核心点,将其ε-邻域内的点(不包括核心点)标记为边界点。
  4. 构建聚类:初始化一个空的聚类集合,并对每个核心点执行以下步骤: a. 如果该核心点尚未被访问过,则创建一个新的聚类,并将其加入到聚类集合中。 b. 将该核心点加入到当前聚类中。 c. 对于该核心点的ε-邻域内的所有点,如果该点是核心点,则将其加入到当前聚类中;如果该点是边界点且尚未被访问过,则将其加入到当前聚类中,并标记为已访问。
  5. 标记噪音点:对于所有未被访问过的点,如果其不属于任何聚类,则将其标记为噪音点。
  6. 输出结果:返回聚类集合。

2.3 DBSCAN聚类算法举例

假设有一组二维数据点,如下所示:

数据点1:(2, 3) 数据点2:(4, 5) 数据点3:(6, 7) 数据点4:(9, 10) 数据点5:(11, 12) 数据点6:(13, 14) 数据点7:(15, 16) 数据点8:(16, 17) 数据点9:(18, 19)

首先,我们需要选择两个参数:邻域半径eps和最小密度minPts。邻域半径eps决定了一个点的邻域范围,而最小密度minPts决定了一个核心点所需要的邻域内的最小数据点数。

假设我们选择eps=2和minPts=3,然后进行DBSCAN聚类算法。

  1. 随机选择一个未访问的数据点,比如数据点1。
  2. 检查数据点1的邻域内是否有至少minPts个数据点。
    • 数据点2和数据点3在数据点1的邻域内,那么数据点1为核心点,并且将数据点2和数据点3添加到同一个簇中。
    • 数据点4、数据点5、数据点6和数据点7不在数据点1的邻域内,不满足最小密度要求。
    • 数据点8和数据点9不在数据点1的邻域内,不满足最小密度要求。
  3. 随机选择一个未访问的核心点,比如数据点2。
  4. 检查数据点2的邻域内是否有至少minPts个数据点。
    • 数据点3在数据点2的邻域内,那么数据点2为核心点,并且将数据点3添加到同一个簇中。
    • 数据点1不在数据点2的邻域内,不满足最小密度要求。
  5. 随机选择一个未访问的核心点,比如数据点3。
  6. 检查数据点3的邻域内是否有至少minPts个数据点。
    • 数据点2在数据点3的邻域内,那么数据点3为核心点,并且将数据点2添加到同一个簇中。
    • 数据点1不在数据点3的邻域内,不满足最小密度要求。
  7. 继续选择下一个未访问的核心点,并进行相同的操作,直到所有的核心点都被访问过为止。
  8. 如果还有未访问的数据点,则将其标记为噪声点。

根据上述步骤,我们可以得到以下聚类结果:

  • 簇1:数据点1、数据点2、数据点3
  • 噪声点:数据点4、数据点5、数据点6、数据点7、数据点8、数据点9

2.4 DBSCAN聚类算法的优缺点

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)聚类算法的优点和缺点如下:

优点:

  • 不需要事先指定聚类数量,能够自动发现数据中的聚类。
  • 能够处理任意形状的聚类,并且对噪声数据具有较强的鲁棒性。
  • 对于较大的数据集,DBSCAN算法具有较高的计算效率。
  • 对于具有不同密度的聚类,DBSCAN能够自适应地调整聚类的形状和大小。

缺点:

  • 对于高维数据,DBSCAN聚类算法表现不佳,容易出现维度灾难。
  • 对于数据集中密度不均匀的聚类,DBSCAN算法可能难以找到合适的聚类结果。
  • 对于数据集中聚类之间存在较大密度差距的情况,DBSCAN算法可能无法准确地划分聚类。
  • 对于数据集的参数选择较为敏感,需要事先对参数进行调优。

2.5 Sklearn实现DBSCAN聚类算法

使用sklearn库实现DBSCAN聚类算法对三维点进行聚类的示例代码:

from sklearn.cluster import DBSCAN
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt# 生成示例数据集
np.random.seed(0)
n_samples = 150
X = np.random.randn(n_samples, 3)# 使用DBSCAN聚类算法进行聚类
dbscan = DBSCAN(eps=0.4, min_samples=10)
y_pred = dbscan.fit_predict(X)# 绘制聚类结果
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
colors = ['blue', 'green', 'red', 'purple', 'yellow']
for i in range(len(np.unique(y_pred))):ax.scatter(X[y_pred == i, 0], X[y_pred == i, 1], X[y_pred == i, 2], c=colors[i], label='Cluster {}'.format(i))
ax.set_xlabel('Feature 1')
ax.set_ylabel('Feature 2')
ax.set_zlabel('Feature 3')
ax.set_title('DBSCAN Clustering')
plt.legend()
plt.show()

在上述代码中,我们使用np.random.randn函数生成了一个包含150个三维点的示例数据集。然后,我们使用DBSCAN类初始化了一个DBSCAN聚类算法的实例,并指定了epsmin_samples参数。最后,我们调用fit_predict方法对数据进行聚类,并将聚类结果绘制在三维散点图中。

三、OPTICS聚类算法

OPTICS(Ordering Points To Identify the Clustering Structure)是一种基于密度的聚类算法,它通过识别数据集中的密度相对较高的区域来发现聚类结构。与传统的基于密度的聚类算法DBSCAN不同,OPTICS不需要设置邻域大小参数,而是通过自适应地计算邻域大小来进行聚类

OPTICS算法的基本思想是,对于数据集中的每个点,计算它与其他点之间的距离,然后根据距离将数据点排序。通过这种排序方式,OPTICS算法可以在每个数据点的邻域中找到密度相对较高的数据点,从而识别出聚类的结构。

OPTICS算法的输出结果是一个可达距离图(Reachability Plot),它可以用于确定聚类的阈值参数,从而将数据点分为不同的聚类簇。通过分析可达距离图,可以识别出密度相对较高的聚类簇和稀疏区域。

OPTICS算法的主要步骤如下:

  1. 计算每个数据点与其他点之间的距离,构建距离矩阵。
  2. 根据距离矩阵,计算每个数据点的核心距离(core distance)。核心距离是一个自适应的邻域大小,用于判断一个点是否是核心点(core point)。
  3. 根据核心距离和距离矩阵,计算每个数据点的可达距离(reachability distance)。可达距离表示从一个数据点到另一个数据点的最短路径的最大距离。
  4. 根据可达距离,构建可达距离图。
  5. 分析可达距离图,确定聚类的阈值参数,将数据点分为不同的聚类簇。

3.1 Sklearn实现OPTICS聚类算法

使用sklearn库中的cluster.OPTICS类来实现OPTICS聚类算法。

下面是一个使用sklearn库实现OPTICS聚类算法的示例代码:

from sklearn.cluster import OPTICS
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt# 生成示例数据
X, y = make_blobs(n_samples=200, centers=4, random_state=0)# 创建OPTICS聚类模型
optics = OPTICS(min_samples=10, xi=0.05, min_cluster_size=0.1)# 拟合数据
optics.fit(X)# 获取聚类标签
labels = optics.labels_# 获取核心样本的可达距离
reachability_distances = optics.reachability_# 绘制聚类结果
unique_labels = set(labels)
colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))]for label, color in zip(unique_labels, colors):if label == -1:color = [0, 0, 0, 1]  # 将噪声样本用黑色表示class_member_mask = (labels == label)xy = X[class_member_mask]plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(color),markeredgecolor='k', markersize=14)# 显示聚类结果
plt.title('OPTICS clustering')
plt.show()

在上述示例代码中,make_blobs函数用于生成示例数据。OPTICS类是OPTICS聚类算法的实现类,通过调用fit方法可以拟合数据并进行聚类。labels_属性用于获取聚类标签。reachability_属性用于获取核心样本的可达距离。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/75670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解释:指数加权移动平均(EWMA)

指数加权移动平均(EWMA, Exponential Weighted Moving Average) 是一种常用于时间序列平滑、异常检测、过程控制等领域的统计方法。相比普通移动平均,它对最近的数据赋予更高权重,对旧数据逐渐“淡化”。 ✅ 一、通俗理解 想象你…

Spring Boot 项目基于责任链模式实现复杂接口的解耦和动态编排!

全文目录: 开篇语前言一、责任链模式概述责任链模式的组成部分: 二、责任链模式的核心优势三、使用责任链模式解耦复杂接口1. 定义 Handler 接口2. 实现具体的 Handler3. 创建订单对象4. 在 Spring Boot 中使用责任链模式5. 配置责任链6. 客户端调用 四、…

COMSOL仿真遇到的两个小问题

最近跑热仿真的时候跑出了两个问题,上网查发现也没什么解决方式,最后自己误打误撞的摸索着解决了,在这里分享一下。 问题一 我当时一准备跑仿真就弹出了这个东西,但在此之前从未遇到 然后我试着在它说的路径中建立recoveries文件…

如何在英文学术写作中正确使用标点符号?

标点符号看似微不足道,但它们是书面语言的无名英雄。就像熟练的指挥家指挥管弦乐队一样,标点符号可以确保您的写作流畅、传达正确的含义并引起读者的共鸣。正如放错位置的音符会在音乐中造成不和谐一样,放错位置的逗号或缺少分号也会使您的写…

【深度学习与大模型基础】第10章-期望、方差和协方差

一、期望 ——————————————————————————————————————————— 1. 期望是什么? 期望(Expectation)可以理解为“长期的平均值”。比如: 掷骰子:一个6面骰子的点数是1~6&#x…

JAVA虚拟机(JVM)学习

入门 什么是JVM JVM:Java Virtual Machine,Java虚拟机。 JVM是JRE(Java Runtime Environment)的一部分,安装了JRE就相当于安装了JVM,就可以运行Java程序了。JVM的作用:加载并执行Java字节码(.class&#…

【数据结构与算法】——堆(补充)

前言 上一篇文章讲解了堆的概念和堆排序,本文是对堆的内容补充 主要包括:堆排序的时间复杂度、TOP 这里写目录标题 前言正文堆排序的时间复杂度TOP-K 正文 堆排序的时间复杂度 前文提到,利用堆的思想完成的堆排序的代码如下(包…

什么是柜台债

柜台债(柜台债券业务)是指通过银行等金融机构的营业网点或电子渠道,为投资者提供债券买卖、托管、结算等服务的业务模式。它允许个人、企业及机构投资者直接参与银行间债券市场的交易,打破了以往仅限机构参与的壁垒。以下是综合多…

【Android读书笔记】读书笔记记录

文章目录 一. Android开发艺术探索1. Activity的生命周期和启动模式1.1 生命周期全面分析 一. Android开发艺术探索 1. Activity的生命周期和启动模式 1.1 生命周期全面分析 onPause和onStop onPause后会快速调用onStop,极端条件下直接调用onResume 当用户打开新…

Java对象内存结构详解

Java对象内存结构详解 Java对象在JVM内存中的存储结构可以分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。以下是64位JVM(开启压缩指针)下…

【TI MSPM0】Printf重定向学习

一、新建工程 通过XDS110与电脑进行通信。 选择这两个引脚 需要添加这两个头文件 在程序中添加这三个函数即可对printf进行重定向 二、封装函数 另一种方法 封装一个函数,定义一个数组

深度强化学习基础 0:通用学习方法

过去自己学习深度强化学习的痛点: 只能看到各种术语、数学公式勉强看懂,没有建立清晰且准确关联 多变量交互关系浮于表面,有时候连环境、代理控制的变量都混淆 模型种类繁多,概念繁杂难整合、对比或复用,无框架分析所…

asm汇编源代码之-字库转换程序

将标准的16x16点阵汉字库(下载16x16汉字库)转换成适合VGA文本模式下显示的点阵汉字库 本程序需要调用file.asm中的子程序,所以连接时需要把file连接进来,如下 C:\> tlink chghzk file 调用参数描述如下 C:\> chghzk ; 无调用参数,转换标准库文件(SRC16.FNT)为适合VGA…

uniapp转换markdown

效果 AI智能体 微信小程序 流式 1.安装Node.js 参考:2024最新版Node.js下载安装及环境配置教程(非常详细)_node.js 安装-CSDN博客 2.需要克隆项目到本地或直接到项目地址下载压缩包。 参考:uniapp中解析markdown支持网页和小程序_uniapp ma…

用java代码如何存取数据库的blob字段

一.业务 在业务中我们被要求将文件或图片等转成 byte[] 或 InputStream存到数据库的Blob类型的字段中. 二.Blob类型介绍 在 MySQL 中,Blob 数据类型用于存储二进制数据。MySQL 提供了四种不同的 Blob 类型: TINYBLOB: 最大存储长度为 255 个字节。BL…

qemu(2) -- 定制开发板

1. 前言 qemu支持自定义开发板,本文就记录一下折腾的过程。基于qemu-10.0.0-rc3添加x210vb3s开发板。 2. 添加板卡文件 网上参考了一些文章,有些文章使用的版本和我的不一样,折腾起来费了点时间,最后发现还是直接参考qemu中已有…

Python在糖尿病分类问题上寻找具有最佳 ROC AUC 分数和 PR AUC 分数(决策树、逻辑回归、KNN、SVM)

Python在糖尿病分类问题上寻找具有最佳 ROC AUC 分数和 PR AUC 分数(决策树、逻辑回归、KNN、SVM) 问题模板解题思路1. 导入必要的库2. 加载数据3. 划分训练集和测试集4. 数据预处理5. 定义算法及其参数6. 存储算法和对应指标7. 训练模型并计算指标8. 找…

CPU(中央处理器)

一、CPU的定义与核心作用 CPU 是计算机的核心部件,负责 解释并执行指令、协调各硬件资源 以及 完成数据处理,其性能直接影响计算机的整体效率。 核心功能: 从内存中读取指令并译码。执行算术逻辑运算。控制数据在寄存器、内存和I/O设备间的…

上层 Makefile 控制下层 Makefile 的方法

在复杂的项目中,通常会将项目划分为多个模块或子项目,每个模块都有自己的 Makefile。上层 Makefile 的作用是协调和控制这些下层 Makefile 的构建过程。下面是几种常见的示例,实现上层 Makefile 对下层 Makefile 的控制。 直接调用&#xff1…

prompts提示词经典模板

prompts.py 中的提示词模板详解 文件中定义了两个核心提示词模板:REASON_PROMPT 和 RELEVANT_EXTRACTION_PROMPT。这两个模板在 DeepResearcher 的推理过程中扮演着关键角色。下面我将详细解析这两个模板的结构和功能。 REASON_PROMPT 详解 REASON_PROMPT 是用于指…