机器学习算法实战系列:无监督学习全攻略——聚类与降维核心技术解析
引言
“数据没有标签怎么办?无监督学习能从混沌中发现秩序,揭示数据背后的隐藏模式!”
在现实世界中,大量数据是没有标签的,而无监督学习正是挖掘这类数据价值的利器。本文将深入讲解聚类和降维两大核心技术,从经典算法到最新进展,结合多个工业级案例,带你掌握从数据中发现知识的艺术。准备好探索数据的内在结构了吗?
第一部分:聚类算法深度解析
1.1 聚类基础与评估方法
聚类任务定义
给定数据集D={x₁,x₂,…,xₙ},将D划分为k个不相交的簇{C₁,C₂,…,Cₖ},使得:
- 同一簇内样本相似度高
- 不同簇间样本相似度低
评估指标
-
内部指标(无需真实标签):
- 轮廓系数(Silhouette Coefficient)
- Calinski-Harabasz指数
- Davies-Bouldin指数
-
外部指标(需真实标签):
- 调整兰德指数(ARI)
- 标准化互信息(NMI)
- 同质性(Homogeneity)
1.2 K-Means算法详解
算法步骤
- 随机选择k个中心点
- 将每个样本分配到最近的中心点形成簇
- 重新计算每个簇的中心点
- 重复2-3直到收敛
数学表达
最小化目标函数:
J = Σ Σ ||x - μᵢ||²
i x∈Cᵢ
其中μᵢ是簇Cᵢ的中心。
Python实现
import numpy as np
class KMeans:
def __init__(self, k=3, max_iter=100, tol=1e-4):
self.k = k
self.max_iter = max_iter
self.tol = tol
self.centroids = None
def _init_centroids(self, X):
indices = np.random.choice(len(X), self.k, replace=False)
return X[indices]
def _assign_clusters(self, X):
distances = np.linalg.norm(X[:, np.newaxis] - self.centroids, axis=2)
return np.argmin(distances, axis=1)
def _update_centroids(self, X, labels):
new_centroids = np.array([X[labels == i].mean(axis=0)
for i in range(self.k)])
return new_centroids
def fit(self, X):
self.centroids = self._init_centroids(X)
for _ in range(self