聚类的作用:
-
知识发现 发现事物之间的潜在关系
-
异常值检测
-
特征提取 数据压缩的例子
有监督和无监督学习:
有监督:
-
给定训练集 X 和 标签Y
-
选择模型
-
学习(目标函数的最优化)
-
生成模型(本质上是一组参数、方程)
-
根据生成的一组参数进行预测分类等任务
无监督:
-
拿到的数据只有X ,没有标签,只能根据X的相似程度做一些事情。
-
Clustering 聚类
-
对于大量未标注的数据集,按照内在相似性来分为多个类别(簇) 目标:类别内相似度大,类别间相似小。
-
也可以用来改变数据的维度,可以将聚类结果作为一个维度添加到训练数据中。
-
-
降维算法,数据特征变少
相似度:
数据间相似度:
-
每一条数据都可以理解为多维空间中的一个点。
-
可以根据点和点之间的距离来评价数据间的相似度
-
近朱者赤近墨者黑!
欧式距离:
闵可夫斯基距离:
余弦距离:
将数据看做空间中的点的时候,评价远近可以用欧氏距离或者余弦距离。
计算过程如下:
-
将数据映射为高维空间中的点(向量)
-
计算向量间的余弦值
-
取值范围[-1,+1] 越趋近于1代表越相似,越趋近于-1代表方向相反,0代表正交
描述:
K-Means 是一种常用的聚类算法,它的目标是将数据集划分为 KKK 个簇,使得簇内数据点之间的相似度最大化,而簇与簇之间的相似度最小化。K-Means 算法的基本流程是:
- 随机选择 KKK 个初始簇中心。
- 计算每个数据点到每个簇中心的距离,将数据点分配到最近的簇。
- 更新每个簇的中心,重新计算簇的质心。
- 重复步骤 2 和 3,直到簇中心不再发生变化或达到最大迭代次数。
我们可以使用 sklearn
库来实现 K-Means 聚类,或者手动编写 K-Means 算法。以下是这两种方法的实现。
聚类过程:
1. 使用 sklearn
库实现 K-Means 聚类
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs# 生成样本数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)# 使用 sklearn 实现 K-Means
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)# 获取聚类结果
y_kmeans = kmeans.predict(X)# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')# 绘制簇的质心
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75)
plt.title("K-Means Clustering with sklearn")
plt.show()
在这里,make_blobs
用于生成模拟的聚类数据集。我们使用 KMeans
类对数据进行聚类,并绘制出每个簇的质心和分配给每个簇的点。可以通过设置 n_clusters
参数来调整簇的数量。
2. 手动实现 K-Means 算法
如果不使用 sklearn
,我们可以手动实现 K-Means 算法。以下是 K-Means 的基本实现步骤:
import numpy as np
import matplotlib.pyplot as plt# 生成随机数据
def create_data(n_samples=300, n_features=2, n_clusters=4, cluster_std=0.60, random_state=0):np.random.seed(random_state)X = []centers = np.random.randn(n_clusters, n_features) * 10for center in centers:X.append(center + np.random.randn(n_samples // n_clusters, n_features) * cluster_std)return np.vstack(X)# 计算欧氏距离
def euclidean_distance(a, b):return np.linalg.norm(a - b, axis=1)# K-Means算法实现
def kmeans(X, k, max_iters=100):# 随机初始化簇中心centers = X[np.random.choice(X.shape[0], k, replace=False)]for _ in range(max_iters):# 计算每个点到各个簇中心的距离,并分配到最近的簇labels = np.array([np.argmin(euclidean_distance(x, centers)) for x in X])# 计算新的簇中心new_centers = np.array([X[labels == i].mean(axis=0) for i in range(k)])# 检查簇中心是否发生变化,若无变化则停止迭代if np.all(centers == new_centers):breakcenters = new_centersreturn labels, centers# 生成数据
X = create_data(n_samples=300, n_clusters=4, random_state=0)# 设置K值,运行K-Means
k = 4
labels, centers = kmeans(X, k)# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75)
plt.title("K-Means Clustering Manual Implementation")
plt.show()
解释:
- 数据生成:
create_data
函数用来生成模拟数据。 - 计算距离:
euclidean_distance
函数用于计算数据点与簇中心之间的欧氏距离。 - K-Means 核心算法:在
kmeans
函数中,我们随机初始化簇中心,然后通过多次迭代更新簇中心和数据点分配,直到收敛。
3意义:
K-Means 是一种无监督学习算法,主要用于解决聚类问题。它的核心思想是通过划分数据集,将相似的数据点归为一类,以最大化簇内相似度、最小化簇间相似度。具体意义包括:
-
数据分类与简化:K-Means 可用于对无标签的数据集进行划分,将复杂的高维数据简化为多个类别。通过划分数据集,可以更好地理解数据的分布与结构。
-
发现潜在模式:K-Means 通过将数据进行分组,可以揭示隐藏在数据中的潜在模式。例如,在消费行为数据中,K-Means 可以帮助识别出不同类型的消费者群体。
-
降维与数据压缩:在某些情况下,K-Means 可用于数据降维和数据压缩。通过将相似的点划分为同一个簇,实际中可以用簇中心来代替数据点,从而达到压缩数据的效果。
-
性能与效率:K-Means 算法简单易实现,计算复杂度较低,适合处理大规模数据集,是一种常用的聚类算法。
4.应用案例:
K-Means 算法在多个领域中有广泛的应用,以下是一些典型的应用场景:
1. 图像压缩
在图像处理中,K-Means 可以用于图像的颜色量化与压缩。通过将图像中的像素颜色分为若干簇(K个颜色),然后用每个簇的质心颜色来替代该簇内所有的像素颜色,进而实现图像压缩。
- 具体案例:在 JPEG 图像压缩中,K-Means 可以用于减少图像的颜色空间。例如,如果一个图像有数千种颜色,K-Means 可以将它压缩为 K 种主要颜色,而图像质量的下降非常有限。
2. 客户细分
在市场营销中,K-Means 被广泛用于客户细分。通过将客户按照他们的行为数据(如消费频率、购买金额等)进行聚类,可以识别出不同的客户群体,进而针对不同群体采取定制化的营销策略。
- 具体案例:电商平台可以利用 K-Means 将客户分为高价值客户、低活跃客户、价格敏感客户等群体,从而制定针对性营销措施,提升客户留存率和转化率。
3. 文本分类
K-Means 也可以用于自然语言处理中的文本聚类,例如对新闻文章、社交媒体帖子、产品评论等进行聚类分析,识别出不同的主题或内容类别。
- 具体案例:新闻聚类中,可以使用 K-Means 将相似主题的新闻文章自动分类为不同的新闻类别(如体育、政治、科技等),以便用户快速浏览相关内容。
4. 图像分割
在医学影像处理、卫星图像分析等领域,K-Means 可以用于图像分割,将图像划分为不同的区域或对象。例如,在 CT 或 MRI 图像中,可以通过 K-Means 分割不同的组织器官。
- 具体案例:通过 K-Means 聚类分析不同像素的灰度值,可以将医疗图像中的器官或肿瘤区域分割出来,帮助医生进行病灶分析。
5. 社交网络分析
在社交网络中,K-Means 可以用来分析用户行为和兴趣,将相似的用户聚类成社群。例如,社交媒体平台可以通过分析用户的点赞、评论等行为,找出兴趣相似的用户群体,进而为他们推荐定制化的内容。
- 具体案例:社交媒体平台使用 K-Means 聚类将用户分为体育爱好者、音乐迷、科技迷等不同兴趣群体,以便优化内容推荐算法。
6. 推荐系统
在推荐系统中,K-Means 聚类可以帮助识别用户群体并推荐相似用户喜欢的商品。例如,在视频网站中,可以通过用户的观看行为,将他们聚类为不同的观众群体,进而推荐他们喜欢的影片。
- 具体案例:Netflix 等流媒体平台通过 K-Means 聚类用户的观看历史,推荐与其他相似用户喜欢的影片或电视剧,提高用户体验。
5算法优缺点:
优点:
- 简单易实现,计算复杂度低。
- 收敛速度快,适合大规模数据集。
- 结果直观,可解释性强。
缺点:
- 对初始簇中心的选择较为敏感,不同的初始化方式可能导致不同的聚类结果。
- 只能发现球形簇,无法处理复杂的簇形状。
- 需要预先指定 KKK 值,而 KKK 值的选择通常需要根据经验或通过交叉验证等方法确定。
6. 总结
- 使用
sklearn
可以快速实现 K-Means 算法,适合开发中快速调用。 - 手动实现可以帮助我们理解 K-Means 算法的内部工作机制,例如如何更新簇中心、如何分配数据点等。
- 通过手动实现,我们也可以更容易地修改算法,尝试改进或扩展 K-Means。
K-Means 是一种经典的聚类算法,适合处理数据量较大、簇形状为圆形或球形的场景。不过,K-Means 也有一定的局限性,例如它对簇的形状敏感,容易受到初始簇中心选择的影响。尽管它在处理复杂簇形状时存在一定局限性,但通过合理调整参数及结合其他方法,K-Means 依然是数据分析中一个非常重要的工具。