简介
- 常见的、经典的聚类模型主要有:KMeans、层次聚类、DBSCAN、谱聚类等;
- 聚类模型支持无监督学习任务;
- KMeans已单独写过博客,本文不在赘述;
层次聚类
简介
- 层次聚类法,是无监督学习模型,有自下而上的凝聚的层次聚类和自上而下分裂的层次聚类两种方式;
- 通过定义簇与簇之间的距离,决策簇的合并或分拆;
簇间距
- 两簇最近的样本的距离;
- 两簇最远的样本的距离;
- 两簇所有样本的平均距离;
算法步骤——自底而上凝聚的层次聚类
step1:将每个样本点视为一个独立的簇,计算所有簇的两两间距;
step2:将簇间距最小的两簇合并为一个簇;
step3:重复1、2步骤,直至聚类至预设类别数;
DBSCAN
简介
- 基于密度的聚类方式,既适用于凸样本集,也适用与非凸样本集;
- 该算法将具有足够密度的区域划分为簇,在具有噪声的空间数据库中发现任意形状的簇;
- 将簇定义为密度连接的点的集合;
密度相关概念
- 密度直达:样本x在其邻域r半径内的样本个数大于minSamples,样本x到其r邻域内的样本y称为密度直达,密度直达不具备对称性;
- 密度可达:样本x通过多个中间样本的密度直达,与样本y连接,称样本x与样本y密度可达,密度可达不具备对称性;
- 密度连接:样本点x与样本点y可以通过同一个核心样本密度可达,则称x和y密度连接,密度连接具备对称性;
- 密度连接的点定义为1簇密度联通簇;
算法步骤
step1:从数据集中随机取一个待聚类的样本点p,并对于参数Eps和minPts判断该样本点是否为核心样本;
step2:若样本点p是核心样本点,则找出所有样本点p的密度连接点;若样本点p是边缘点,则重新进行step1;
step3:重复step1、step2,直至所有待聚类样本点均被处理。
谱聚类
简介
以一种图论的视角去看待样本,将样本点进行图矩阵化,并找到一种切割方式,使得切割后的各组之间相似性小,组内样本相似度大,在计算中通常对图相关矩阵采用先降维后聚类的方式实现。
图相关矩阵
- 邻接矩阵:所有点之间的权重wij(如欧式距离),构成的一个n x n的邻接矩阵W,W是对称矩阵,类似于相关系数矩阵。
- 度矩阵:对于顶点vi,它的度记为di = sum(wij),度矩阵D = diag([d1, d2, d3…dn])
- 拉普拉斯矩阵:L = D - W
算法步骤
step1:计算拉普拉斯矩阵;
step2:对拉普拉斯矩阵进行特征分解,求解k个最小的特征向量,排列成n * k的特征向量矩阵Q;
step3:用Q矩阵的行代替原样本,进行kmeans聚类,得到类别。
sklearn实战
重要参数
# 层次聚类
class sklearn.cluster.AgglomerativeClustering(
n_clusters=2,
affinity='deprecated',
metric=None,
memory=None,
connectivity=None,
compute_full_tree='auto',
linkage='ward',
distance_threshold=None,
compute_distances=False)
# n_clusters 聚类数,与distance_threshold有一个为None;
# distance_threshold 最小合并距离,当簇间距大于该阈值则不再合并;
# linkage 簇间距计算方式 {‘ward’, ‘complete’, ‘average’, ‘single’}, default=’ward’。
# dbscan聚类
class sklearn.cluster.DBSCAN(
eps=0.5,
min_samples=5,
metric='euclidean',
metric_params=None,
algorithm='auto',
leaf_size=30,
p=None,
n_jobs=None
)
# eps 邻域的距离阈值;
# min_samples 核心数据对象所需邻域内最少样本阈值;
# metric 顶点权重度量方式;
# 谱聚类
sklearn.cluster.SpectralClustering(
affinity=‘nearest_neighbors’,
assign_labels=‘kmeans’,
coef0=1,
degree=3,
eigen_solver=‘arpack’,
eigen_tol=0.0,
gamma=1.0,
kernel_params=None,
n_clusters=2,
n_init=10,
n_jobs=1,
n_neighbors=10,
random_state=None)
# affinity 邻接矩阵的点相似度计算方式;
# assign_labels 降维后的聚类方式选择;
# n_clusters 最终形成聚类的类别数。
聚类任务
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.cluster import AgglomerativeClustering, DBSCAN, SpectralClustering
# 鸢尾花数据集
data = load_iris()
X, y = data["data"], data["target"]
# 层次聚类
model1 = AgglomerativeClustering(n_clusters=3)
y_pred1 = model1.fit_predict(X)
# 基于密度的聚类
model2 = DBSCAN()
y_pred2 = model2.fit_predict(X)
# 谱聚类
model3 = SpectralClustering(random_state=41, n_clusters=3)
y_pred3 = model3.fit_predict(X)
参考
https://blog.csdn.net/qq_40206371/article/details/129868310
https://zhuanlan.zhihu.com/p/77043965
https://blog.csdn.net/qq_45448654/article/details/120850612
https://www.ngui.cc/el/3126694.html?action=onClick