36岁程序员:老板最喜欢用聚类分析啊,你得学会啊!

文摘   2024-09-05 08:01   荷兰  

在机器学习领域中,分析无标签数据是一项常见且重要的任务。与有标签数据(如分类问题)不同,无标签数据没有预定义的类别或目标值。这时,我们可以使用聚类分析(Clustering Analysis)来发现数据中的潜在结构或模式。本文将介绍如何使用Python和常用库对无标签数据进行聚类分析。

一、什么是聚类分析?

聚类分析是一种将数据集划分为多个组(即簇)的技术,使得同一簇内的数据点尽可能相似,而不同簇的数据点尽可能不同。常用的聚类算法有K-Means、层次聚类(Hierarchical Clustering)和DBSCAN等。

1. K-Means 聚类

K-Means 是一种迭代算法,目的是将数据集分成 K 个簇。其主要步骤包括:- 随机选择K个初始质心(centroids)。- 将每个数据点分配到最近的质心对应的簇中。- 重新计算每个簇的质心。- 重复上述过程,直到质心不再发生变化或达到最大迭代次数。

2. 层次聚类

层次聚类通过创建一个层次结构的聚类树来组织数据点,常见的有自下而上(聚合)和自上而下(分裂)两种方法。

3. DBSCAN 聚类

DBSCAN 是一种基于密度的聚类算法,能够识别任意形状的簇,尤其适用于处理噪声数据。

二、实战:使用Python进行K-Means聚类

接下来,我们将使用Python的 scikit-learn 库来对无标签数据进行K-Means聚类。

1. 环境准备

首先,我们需要安装所需的库。如果你还没有安装它们,可以运行以下命令:

pip install numpy pandas matplotlib scikit-learn

2. 导入库和数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

# 生成示例数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 将数据可视化
plt.scatter(X[:, 0], X[:, 1], s=50)

## <matplotlib.collections.PathCollection object at 0x0000021E0B728E90>

plt.show()

在这段代码中,我们使用 make_blobs 生成了一些模拟的二维数据,数据分布在四个簇中。然后,我们使用 matplotlib 将数据可视化。

3. 应用K-Means算法

# 使用K-Means进行聚类
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)

## KMeans(n_clusters=4)

y_kmeans = kmeans.predict(X)

# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')

## <matplotlib.collections.PathCollection object at 0x0000021E0B470A50>

centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75)

## <matplotlib.collections.PathCollection object at 0x0000021E0DD5E950>

plt.show()

在这里,我们指定了 n_clusters=4,意味着我们希望将数据分为四个簇。然后我们使用 fit 方法训练模型,predict 方法预测每个数据点所属的簇。最后,我们绘制了聚类结果,并用红色标记了簇的质心。

4. 确定最佳簇数

在实际应用中,确定最佳的簇数并不容易。常用的方法之一是肘部法则(Elbow Method),即通过绘制不同簇数下模型的SSE(Sum of Squared Errors)来选择最佳的簇数。

sse = []
for k in range(1, 10):
kmeans = KMeans(n_clusters=k)
kmeans.fit(X)
sse.append(kmeans.inertia_)

## KMeans(n_clusters=1)
## KMeans(n_clusters=2)
## KMeans(n_clusters=3)
## KMeans(n_clusters=4)
## KMeans(n_clusters=5)
## KMeans(n_clusters=6)
## KMeans(n_clusters=7)
## KMeans()
## KMeans(n_clusters=9)

plt.plot(range(1, 10), sse)

## [<matplotlib.lines.Line2D object at 0x0000021E0DF136D0>]

plt.xlabel('Number of clusters')

## Text(0.5, 0, 'Number of clusters')

plt.ylabel('SSE')

## Text(0, 0.5, 'SSE')

plt.show()

在这个图中,SSE 会随着簇数的增加而减小。当增加到某个值时,SSE的减小幅度会突然变缓,这个点通常被认为是最佳簇数。

三、总结

通过这篇文章,我们介绍了无标签数据的概念,并讲解了如何使用聚类分析(以K-Means为例)来分析这些数据。聚类分析是一种强大的工具,能够帮助我们在无监督学习中发现数据的内在结构。当然,除了K-Means外,还有其他多种聚类算法可供选择,如层次聚类、DBSCAN等,根据具体应用场景选择合适的算法至关重要。

感谢关注!

科研代码
专注R和Python的数据分析。
 最新文章