当前位置: 首页 > news >正文

机器学习中的谱聚类及实践案例

在我们之前研究的聚类算法中,我们使用数据点之间的紧密性(距离)作为特征来聚类数据点。但是,我们也可以使用数据点之间的连接性作为特征来聚类数据点。使用连通性,我们可以将两个数据点聚类到相同的聚类中,即使两个数据点之间的距离更大。

谱聚类

谱聚类是聚类算法的一种变体,它使用数据点之间的连接来形成聚类。该算法利用数据矩阵的特征值和特征向量,将数据预测到低维空间,对数据点进行聚类。它基于数据的图形表示的思想,其中数据点表示为节点,数据点之间的相似性表示为边。

谱聚类执行的步骤

构建数据的相似性图:此步骤以邻接矩阵的形式构建相似性图,该邻接矩阵由A表示。邻接矩阵可以通过以下方式构建:

  • ε-邻域图:预先固定参数ε。然后,每个点都连接到位于其ε半径内的所有点。如果任何两个点之间的所有距离在尺度上都相似,则通常不存储边的权重,即两个点之间的距离,因为它们不提供任何附加信息。因此,在这种情况下,构建的图是无向和无权图。
  • K-最近邻参数k是预先固定的。然后,对于两个顶点u和v,只有当v是u的k-最近邻居之一时,一条边才是从u到v的。注意,这导致了加权有向图的形成,因为对于每个u具有v作为k-最近邻居之一的情况并不总是如此,对于v具有u在其k-最近邻居中的情况也将是相同的。为了使该图无向,遵循以下方法之一:
    1.如果v是u的k-最近邻之一,或u是v的k-最近邻之一,则从u到v和从v到u引导边。
    2.如果v是u的k-最近邻且u是v的k-最近邻,则将边从u指向v,从v指向u。
    3.全连通图:为了构建这个图,每个点都与一个无向边连接,该边由两个点到其他点之间的距离加权。由于该方法用于对局部邻域关系进行建模,因此通常使用高斯相似性度量来计算距离。

将数据投影到较低维度的空间:这一步是为了考虑同一个集群的成员在给定维度空间中可能很远的可能性。因此,维度空间被减少,使得这些点在减少的维度空间中更接近,并且因此可以通过传统的聚类算法被聚类在一起。它是通过计算图拉普拉斯矩阵来完成的。

要计算它,首先需要定义节点的度。第i个节点的度由下式给出:注意,在这里插入图片描述
它是上面邻接矩阵中定义的节点i和j之间的边。

在这里插入图片描述

# Defining the adjaceny matix
import numpy as np
A = np.array([[0, 1, 1, 0, 0, 0, 0, 0, 1, 1],[1, 0, 1, 0, 0, 0, 0, 0, 0, 0],[1, 1, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 1, 1, 0, 0, 0, 0],[0, 0, 0, 1, 0, 1, 0, 0, 0, 0],[0, 0, 0, 1, 1, 0, 1, 1, 0, 0],[0, 0, 0, 0, 0, 1, 0, 1, 0, 0],[0, 0, 0, 0, 0, 1, 1, 0, 0, 0],[1, 0, 0, 0, 0, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 0, 0, 0, 1, 0]])

度矩阵定义如下:

在这里插入图片描述

D = np.diag(A.sum(axis=1))
print(D)

因此,图拉普拉斯矩阵被定义为:
在这里插入图片描述

L = D-A
print(L)

然后将该矩阵归一化以获得数学效率。为了减少维数,首先,计算特征值和相应的特征向量。如果聚类的数量是k,则取第一特征值和它们的特征向量并将其堆叠成矩阵,使得特征向量是列。

Python中计算矩阵的特征值和特征向量的代码

# find eigenvalues and eigenvectors
vals, vecs = np.linalg.eig(A)

对数据进行聚类:这个过程主要涉及通过使用任何传统的聚类技术(通常是K-Means聚类)对简化的数据进行聚类。首先,每个节点被分配一行归一化的图拉普拉斯矩阵。然后使用任何传统技术对这些数据进行聚类。为了转换聚类结果,节点标识符被保留。

特性

  1. 少假设:这种聚类技术与其他传统技术不同,它不假设数据遵循某些属性。因此,这使得这种技术可以回答一类更通用的聚类问题。
  2. 易于实现和速度:该算法比其他聚类算法更容易实现,而且速度也非常快,因为它主要由数学计算组成。
  3. 不可扩展:由于它涉及矩阵的构建以及特征值和特征向量的计算,因此对于密集数据集来说非常耗时。
  4. 简化:该算法使用特征值分解来降低数据的维数,使其更容易可视化和分析。
  5. 簇形状:该技术可以处理非线性簇形状,使其适用于广泛的应用。
  6. 噪声敏感性:它对噪声和离群值敏感,这可能会影响结果聚类的质量。
  7. 聚类数:该算法要求用户事先指定聚类数,这在某些情况下可能具有挑战性。
  8. 内存要求:该算法需要大量内存来存储相似性矩阵,这可能是大型数据集的限制。

基于谱聚类的信用卡数据聚类

下面的步骤演示了如何使用Sklearn实现谱聚类。

步骤1:重新配置所需的库

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import SpectralClustering
from sklearn.preprocessing import StandardScaler, normalize
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score

步骤2:加载和清理数据

# Changing the working location to the location of the data# Loading the data
X = pd.read_csv('CC_GENERAL.csv')# Dropping the CUST_ID column from the data
X = X.drop('CUST_ID', axis = 1)# Handling the missing values if any
X.fillna(method ='ffill', inplace = True)X.head()

输出
在这里插入图片描述
步骤3:预处理数据,使数据可视化

# Preprocessing the data to make it visualizable# Scaling the Data
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# Normalizing the Data
X_normalized = normalize(X_scaled)# Converting the numpy array into a pandas DataFrame
X_normalized = pd.DataFrame(X_normalized)# Reducing the dimensions of the data
pca = PCA(n_components = 2)
X_principal = pca.fit_transform(X_normalized)
X_principal = pd.DataFrame(X_principal)
X_principal.columns = ['P1', 'P2']X_principal.head()

在这里插入图片描述
步骤4:构建聚类模型并可视化聚类

在下面的步骤中,两个不同的谱聚类模型具有不同的参数“affinity”值。

a) affinity = ‘rbf’

# Building the clustering model
spectral_model_rbf = SpectralClustering(n_clusters = 2, affinity ='rbf')# Training the model and Storing the predicted cluster labels
labels_rbf = spectral_model_rbf.fit_predict(X_principal)
# Building the label to colour mapping
colours = {}
colours[0] = 'b'
colours[1] = 'y'# Building the colour vector for each data point
cvec = [colours[label] for label in labels_rbf]# Plotting the clustered scatter plotb = plt.scatter(X_principal['P1'], X_principal['P2'], color ='b');
y = plt.scatter(X_principal['P1'], X_principal['P2'], color ='y');plt.figure(figsize =(9, 9))
plt.scatter(X_principal['P1'], X_principal['P2'], c = cvec)
plt.legend((b, y), ('Label 0', 'Label 1'))
plt.show()

在这里插入图片描述
b) affinity = ‘nearest_neighbors’

# Building the clustering model
spectral_model_nn = SpectralClustering(n_clusters = 2, affinity ='nearest_neighbors')# Training the model and Storing the predicted cluster labels
labels_nn = spectral_model_nn.fit_predict(X_principal)

在这里插入图片描述

步骤5: 评估性能

# List of different values of affinity
affinity = ['rbf', 'nearest-neighbours']# List of Silhouette Scores
s_scores = []# Evaluating the performance
s_scores.append(silhouette_score(X, labels_rbf))
s_scores.append(silhouette_score(X, labels_nn))print(s_scores)

输出
在这里插入图片描述

步骤6:比较性能

# Plotting a Bar Graph to compare the models
plt.bar(affinity, s_scores)
plt.xlabel('Affinity')
plt.ylabel('Silhouette Score')
plt.title('Comparison of different Clustering Models')
plt.show()

在这里插入图片描述
谱聚类是机器学习中的一种聚类算法,它使用相似性矩阵的特征向量将一组数据点划分为聚类。谱聚类背后的基本思想是使用图的拉普拉斯矩阵的特征向量来表示数据点,并通过将k-means或其他聚类算法应用于特征向量来找到聚类。

谱聚类的优点和缺点

优点:

  1. 可扩展性:谱聚类可以处理大型数据集和高维数据,因为它在聚类之前降低了数据的维度。
  2. 灵活性:谱聚类可以应用于非线性可分离的数据,因为它不依赖于传统的基于距离的聚类方法。
  3. 鲁棒性:谱聚类可以对数据中的噪声和离群值更具鲁棒性,因为它考虑了数据的全局结构,而不仅仅是数据点之间的局部距离。

缺点:

  1. 复杂性:谱聚类在计算上是昂贵的,特别是对于大型数据集,因为它需要计算特征向量和特征值。
  2. 模型选择:选择正确数量的聚类和正确的相似性矩阵可能具有挑战性,可能需要专业知识或反复试验。

http://www.mrgr.cn/news/60583.html

相关文章:

  • 深度学习_循环神经网络_预测平安中国股价(文末附带数据集下载链接, 长期有效, 如果有大佬愿意帮忙, 我先在这磕一个,感谢)
  • 【Java并发编程】信号量Semaphore详解
  • 《代码之外》
  • 微信小程序的日期区间选择组件的封装和使用
  • autoware-传感器驱动和感知算法(sensing-perception)-笔记
  • 融云IM信息托管服务,用户资料、好友关系、群组信息全覆盖
  • VLAN聚合
  • 1.字节大小
  • Java集合框架中的泛型有什么优点?
  • 第13天小整理
  • 机器学习入门之监督学习
  • 并联 高电压、高电流 放大器实现 2 倍输出电流模块±2A
  • 《学会提问》
  • qt-opensource-windows-x86-5.14.2.rar
  • 聚水潭到畅捷通T+的数据高效集成方案解析
  • OceanBase数据库结合ETLCloud快速实现数据集成
  • GEE 图表:利用CGIAR/SRTM90_V4绘制雷尼尔山登山步道沿途的海拔高度图表
  • DevCon,我们来了|DAOBase 线下活动(曼谷站)
  • python -m pip install --upgrade pip和pip install --upgrade pip有什么区别?
  • python读取CSV文件
  • 算法4之链表
  • C++:字符串
  • Unable to add window -- token null is not valid; is your activity running?
  • 【JIT/极态云】技术文档--函数设计
  • 可重入函数和不可重入函数
  • LVGL移植教程(超详细)——基于GD32F303X系列MCU