1.引言
在无监督学习领域,我们面对的是未标记的数据集,目标是揭示其中隐藏的结构和模式。本文将重点探讨两种关键的无监督学习技术:聚类分析和降维方法。我们将深入理解K-means聚类算法及其实现,介绍DBSCAN等密度聚类方法,并通过PCA与t-SNE的实际应用,展示如何进行有效的数据降维与可视化。更多Python在人工智能中的使用方法,欢迎关注《Python人工智能实战》栏目!
2.K-means聚类算法与实现
2.1. 算法原理
K-means算法是一种基于距离的迭代聚类方法,其核心思想是将数据集划分为K个簇,使得每个数据点归属于与其最近均值(质心)对应的簇。算法流程如下:
- 初始化:随机选取K个数据点作为初始质心。
- 迭代分配:对于每个数据点,计算其到各个质心的距离,将其分配到最近质心所在的簇。
- 更新质心:根据每个簇内所有数据点重新计算簇质心,即取簇内所有点的均值作为新的质心。
- 终止条件:当簇分配不再发生变化或达到预设的最大迭代次数时,停止迭代。
2.2. Python实现与输出
下面是一个使用sklearn与numpy
库实现K-means聚类的示例代码:
from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
# 假设我们有一些二维数据
data = np.array([[1, 2], [1, 4], [1, 0], [10, 2], [10, 4], [10, 0]])
# 初始化KMeans,设定簇的数量为2
kmeans = KMeans(n_clusters=2, random_state=0)
# 对数据进行拟合和预测
kmeans.fit(data)
labels = kmeans.predict(data)
centroids = kmeans.cluster_centers_
# 可视化结果
plt.scatter(data[:, 0], data[:, 1], c=labels, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=300, alpha=0.5)
plt.title('K-means Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
此代码将生成一个散点图,其中不同颜色的点代表不同的簇,红色的点代表每个簇的中心。通过图可以直观地看到数据被划分成了两个簇。
关于Numpy的使用方法,可以看往期文章:
3.DBSCAN等密度聚类方法介绍
3.1. 算法原理
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,它不需要预先指定簇的数量,而是通过发现数据中的高密度区域来识别簇。DBSCAN有两个关键参数:
- ε(epsilon):定义邻域半径,即距离小于ε的点被认为是“邻近”的。
- MinPts:一个点成为核心点所需的邻近点最小数量。
算法步骤如下:
- 寻找核心点:遍历数据点,若某点邻域内点数大于等于MinPts,则标记为核心点。
- 扩展簇:从一个核心点出发,将所有可达的核心点及其邻域点归入同一簇。
- 识别噪声点:未被分配到任何簇的点被视为噪声点。
3.2. Python实现
使用sklearn
库实现DBSCAN:
from sklearn.cluster import DBSCAN
import numpy as np
# 生成一些示例数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
# 定义 DBSCAN 模型参数
eps = 0.5 # 邻域半径
min_samples = 5 # 最小样本数
# 创建 DBSCAN 模型
db = DBSCAN(eps=eps, min_samples=min_samples)
# 拟合数据
db.fit(X)
# 标记每个样本的簇标签
labels = db.labels_
# 打印簇标签
print("Cluster labels:", labels)
# 输出 Cluster labels: [-1 -1 -1 -1 -1 -1]
在上述示例中,首先生成了一些示例数据X
。然后,定义了 DBSCAN 模型的参数eps
(邻域半径)和min_samples
(最小样本数)。接下来,创建了 DBSCAN 模型并使用数据进行拟合。最后,可以通过labels_
属性获取每个样本的簇标签。
输出结果:
labels
包含每个样本的聚类标签。正值表示簇编号,-1
表示噪声点。
4.PCA与t-SNE降维可视化实战
4.1. PCA降维实现
PCA是一种线性降维方法,通过最大化方差保留来找到数据的主要方向(主成分),将原始高维数据投影到这些主成分构成的低维空间中。
Python实现与可视化:
from sklearn.decomposition import PCA
import numpy as np
import matplotlib.pyplot as plt
# 假设我们有一个高维数据集
high_dim_data = np.random.rand(100, 10) # 100个样本,每个样本10个特征
# 初始化PCA,设定要降到的维度数
pca = PCA(n_components=2)
# 对数据进行降维
low_dim_data = pca.fit_transform(high_dim_data)
# 可视化降维后的数据
plt.scatter(low_dim_data[:, 0], low_dim_data[:, 1])
plt.title('PCA Dimensionality Reduction')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()
输出结果: 图形展示经过PCA降维后的数据点分布,颜色对应K-means或DBSCAN的聚类结果,可以帮助观察聚类结构是否在低维空间中得以保留和清晰展现。
4.2. t-SNE降维实现
t-SNE是一种非线性降维方法,特别擅长于揭示高维数据的局部结构和流形,常用于数据可视化。其核心思想是将高维空间中的相似性概率转化为低维空间中的相似性概率,通过优化KL散度来调整低维表示。
Python实现与可视化:
from sklearn.manifold import TSNE
# 使用之前的高维数据集
# 初始化t-SNE
tsne = TSNE(n_components=2, random_state=0)
# 对数据进行降维
tsne_data = tsne.fit_transform(high_dim_data)
# 可视化降维后的数据
plt.scatter(tsne_data[:, 0], tsne_data[:, 1])
plt.title('t-SNE Dimensionality Reduction')
plt.xlabel('t-SNE Feature 1')
plt.ylabel('t-SNE Feature 2')
plt.show()
输出结果: 图形展示经过t-SNE降维后的数据点分布,颜色同样对应聚类结果。t-SNE往往能揭示出更复杂的数据结构和簇间分离,有助于直观理解数据的内在模式。
5.总结
总结而言,K-means、DBSCAN等聚类算法为无监督学习提供了划分数据结构的方法,而PCA和t-SNE等降维技术则助力我们以更低维度可视化和理解高维数据的聚类特性。通过结合这些技术,我们可以有效地探索无标签数据集中的隐藏信息,为后续的数据分析、模式识别乃至决策制定提供有力支持。更多Python在人工智能中的使用方法,欢迎关注《Python人工智能实战》栏目!