机器学习之无监督学习聚类和降维
一、聚类Clustering
聚类(Clustering)旨在将数据集中的样本分成若干个簇,使得同一个簇内的对象彼此相似,不同
簇间的对象差异较大。聚类是一种无监督学习算法,不需要预先标记数据的标签,完全依赖数据本
身内在结构和特征来进行分组,最终簇所对应的概念语义需由使用者来把握和命名。
聚类的核心是“物以类聚”,具体通过以下步骤实现:
定义相似性:选择一个度量标准(如欧氏距离,余弦相似度)来衡量对象之间的相似性或距离。
分组:根据相似性将对象分配到不同的簇中。
优化:通过迭代或直接计算,调整簇的划分,使簇内相似性最大化,簇间差异最大化。
1、均值聚类
1.1、K均值聚类
K 均值聚类(K-means)是基于样本集合划分的聚类方法,将样本集合划分为𝑘个子集构成𝑘个簇,
将𝑛个样本分到𝑘个簇中,每个样本到其所属簇的中心的距离最小。每个样本只能属于一个簇,所以
K均值聚类是硬聚类。
初始化,随机选择𝑘个样本点作为初始簇中心。
对样本进行聚类,计算每个样本到各个簇中心的距离,将每个样本分到与其最近的簇,构成聚类结果。
使用新的簇中心重复上述过程,直到收敛或符合停止条件(例如划分不再改变)。
K均值聚类特点
K 均值聚类的初始中心的选择会直接影响聚类结果,并且不适合非凸形状簇。
K均值聚类需要事先指定簇个数𝑘,而实际中最优的𝑘值是不知道的,需要尝试使用不同的𝑘值检验聚类结果质量,可以采用二分查找快速找到最优𝑘值。聚类结果的质量可以用簇的平均直径来衡量,一般地,簇个数变小时平均直径会增加;簇个数变大超过某个值后平均直径会不变,而这个值正是最优的𝑘值。
1.2、层次聚类
聚合聚类:开始将每个样本各自分到一个簇,之后将相距最近的两个簇合并,如此往复直至满足停止条件(例如达到预设的簇的个数、每个簇只包含一个样本、簇内样本相似性达到某个阈值等)。
分裂聚类:开始将整个数据集视作一个整体,之后根据某种距离或相似性度量,选择一个现有的簇将其分裂成两个簇,使分裂后子簇内相似性高,子簇间差异大,如此往复直至满足停止条件。

1.3、密度聚类



2、K-means API使用
import os
os.environ['OMP_NUM_THREADS'] = '2'
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus'] = False
X,y = make_blobs(n_samples=300, n_features=2, centers=3, cluster_std=2,random_state=42)
fig,ax = plt.subplots(2,1,figsize=(8,8))
ax[0].scatter(X[:,0],X[:,1], c=y,s = 50,label = '原始数据')
ax[0].set_title('原始数据')
ax[0].legend()
model = KMeans(n_clusters=3)
model.fit(X)
centers = model.cluster_centers_
print(centers)
y_pred = model.predict(X)
ax[1].scatter(X[:,0],X[:,1], c=y_pred,s = 50,label = '聚类数据')
ax[1].scatter(centers[:,0],centers[:,1], c='red',s = 50,label = '簇中心')
ax[1].set_title('KMeans聚类结果')
ax[1].legend()
plt.show()

3、模型评价指标
由于聚类任务没有预定义的标签(不像监督学习有真实类别可供比较),所以需要依赖聚类结果和
原始数据来衡量模型的好坏,主要关注簇内的紧凑性和簇间的分离性。说白了就是这个评价指标
评价的是簇分得优秀不优秀。

2)簇内平方和(Within-Cluster Sum of Squares)
衡量簇内数据点到簇中心的总距离平方和,常用于K-Means,越小越好
3)肘部法
肘部法用于确定最佳簇数𝐾,在使用 K-means 时非常常见,它通过绘制簇数𝐾和某个聚类质量指标
(通常是簇内平方和)的关系曲线,找到一个拐点或“肘部”,即增加簇数带来的收益显著减少点,
这个点通常被认为是最佳的𝐾值。
4)CH 指数(Calinski-Harabasz Index)
簇间和簇内分散度的比值,也称方差比准则,越大越好
import os
os.environ['OMP_NUM_THREADS'] = '2'
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score,calinski_harabasz_score
plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus'] = False
X,y = make_blobs(n_samples=300, n_features=2, centers=3, cluster_std=2,random_state=42)
model = KMeans(n_clusters=3)
model.fit(X)
centers = model.cluster_centers_
print(centers)
y_pred = model.predict(X)
plt.scatter(X[:,0],X[:,1], c=y_pred,s = 50,label = '聚类数据')
plt.scatter(centers[:,0],centers[:,1], c='red',s = 50,label = '簇中心')
plt.legend()
plt.show()
print(silhouette_score(X,y_pred))
print(calinski_harabasz_score(X,y_pred))
print(model.inertia_)
[[ 4.85432791 2.04801886]
[-6.88811639 -7.0878587 ]
[-2.75726773 9.07285344]]
0.6996309397540692
1324.8383295497247
2267.4382044976524
二、降维
1、奇异值分解SVD
奇异值分解(Singular Value Decomposition,SVD)是一种矩阵因子分解方法,用于将矩阵分解
为更简单的形式,从而揭示数据的内在结构和特性。通过保留最大的几个奇异值及其对应的奇异向
量,可以近似重构原始矩阵,减少数据维度,同时保留主要信息。主成分分析,潜在语义分析等都
用到了奇异值分解。
import numpy as np
A = np.array([[1,1],[2,2],[0,0]])
print(A)
U , S , V = np.linalg.svd(A)
print(U)
print(S)
print(V)
A2 = U[:,:2]
print(A2)
from sklearn.utils.extmath import randomized_svd
U, S, V = randomized_svd(A, n_components=2)
print(U)
print(S)
print(V)
[[1 1]
[2 2]
[0 0]]
[[-0.4472136 -0.89442719 0. ]
[-0.89442719 0.4472136 0. ]
[ 0. 0. 1. ]]
[3.16227766e+00 8.22677308e-17]
[[-0.70710678 -0.70710678]
[-0.70710678 0.70710678]]
[[-0.4472136 -0.89442719]
[-0.89442719 0.4472136 ]
[ 0. 0. ]]
[[ 0.4472136 0.89442719]
[ 0.89442719 -0.4472136 ]
[ 0. -0. ]]
[3.16227766e+00 1.62596948e-32]
[[ 0.70710678 0.70710678]
[ 0.70710678 -0.70710678]]
2、主成分分析PCA
主成分分析(Principal Component Analysis,PCA)是一种常用的无监督学习方法,旨在找到数
据中最重要的方向,即方差最大的方向,并用这些方向重新表达数据。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)