吴恩达强化学习复盘(1)聚类算法|K-Means算法
简介
之前复盘机器学习(系列链接),深度学习(系列链接),这个系列复盘无监督学习、推荐系统和强化学习。前两个部分主要聚焦于监督学习,在这一部分将探讨超越监督学习的新技术,为学习者提供一套实际中广泛使用的强大工具。
无监督学习具体会学习聚类算法。聚类算法是一种将数据分组的方法,类似于异常检测。这两种技术在当今许多公司的重要商业应用中都有使用。
当用户访问在线购物网站或视频流媒体网站时,推荐系统会向用户推荐商品或视频。推荐系统是商业领域中最重要的机器学习技术之一,它在商业活动中转移了价值数十亿美元的产品等。尽管其重要性显著,但在学术界却较少受到关注。这个系列将了解推荐系统的工作机制,并学会自己实现一个推荐系统。此外,如果对在线广告系统的工作方式感兴趣,了解推荐系统也能帮助理解大型在线广告公司如何决定向用户展示哪些广告。
强化学习在新闻中常被提及,虽然强化学习是一种新兴技术,其商业应用数量相较于其他技术要少,但它是一项相对前沿的技术,为机器学习开辟了新的领域。这里将自己实现一个强化学习算法,并使用它来控制模拟机器。
什么是聚类算法
聚类算法会做什么
总的来说聚类算法会查看大量数据点,并自动找出彼此相关或相似的数据点。
聚类与监督学习的对比
- 监督学习:以二元分类的监督学习为例,给定数据集(有特征 x1 和 x2),训练集包含输入特征 X 和标签 Y,可以绘制数据集并拟合逻辑回归算法或神经网络来学习决策边界。即监督学习的数据集既包括输入数据也包括目标集。
- 无监督学习(聚类属于无监督学习):在无监督学习中,仅给定只有 X 的数据集,没有标签或目标标签 Y。绘制这样的数据集时,只是一些点,而不像监督学习中有两个用不同标识(如轴和特定符号)表示的类别。由于没有目标标签,无法告诉算法要预测的 “正确答案”,而是让算法找出数据中有趣的结构。
聚类算法的目标
聚类算法是无监督学习算法中的一种,它在数据中寻找一种特殊结构,即尝试将数据集分组为簇,簇是彼此相似的点的组。例如,对于一个给定的数据集,聚类算法可能会发现它包含来自两个簇的数据。
聚类算法的应用
- 新闻文章分组:将类似的新闻文章分组在一起,比如关于熊猫的故事相关文章可以归为一类。
- 市场细分:在人工智能领域,发现有不同目的的学习者(如提升技能、发展职业、跟上人工智能更新等),可以通过聚类对学习者进行分类,以便更好地推广机器学习相关内容,同时也提到即使不属于这些类别,相关学习材料也可能有用。
- DNA 数据分析:通过查看不同个体的基因表达数据,将他们归类为表现出相似特征的人。
- 天文数据分析:天文学家使用聚类来分析天文数据,将太空中的天体分组在一起,以分析太空中发生的事情,比如找出哪些天体形成一个星系,哪些形成空间中的相干结构。
K-Means 聚类算法
例子
以一个包含 30 个未标记训练样本的数据集为例,目的是在该数据集上运行 K-Means(KMS)算法,将数据点聚类。这里设定要查找两个簇(实际应用中如何确定簇的数量后续会讨论)。
算法初始化
K-Means 算法的第一步是随机猜测两个簇的中心位置。在例子中,用红叉和蓝叉表示随机选取的两个点,作为两个不同类(簇)中心的初步猜测,不过这只是随机的初始猜测,不一定准确。
算法关键步骤
- 步骤一:将点分配给簇中心(质心):遍历数据集中的每一个点,判断它更靠近红叉(红色簇中心)还是蓝叉(蓝色簇中心),然后将点分配给离它最近的那个簇中心。通过给点涂颜色(红色或蓝色)来直观展示点的分配情况,比如某个点更接近红色簇中心就涂成红色,更接近蓝色簇中心就涂成蓝色。
- 步骤二:移动簇中心:观察所有被涂成红色的点,计算它们的平均值(在各个维度上),然后将红叉移动到这些红点平均值所在的位置;对所有蓝色的点也进行同样的操作,即计算蓝点的平均值,并将蓝叉移动到相应的平均位置。这样就得到了新的簇中心位置。
算法迭代过程
在得到新的簇中心位置后,再次查看所有 30 个训练样本,重新判断每个点是更接近红色还是蓝色簇中心的新位置,并重新分配点(通过颜色表示)。这个过程中可能会发现一些点改变了颜色,因为簇中心位置的移动导致某些点到不同簇中心的距离发生了变化。然后重复上述两个关键步骤,即再次将点分配给簇中心,并移动簇中心。
算法收敛
持续重复这两个步骤,最终会发现点的颜色(所属簇的类别)和簇中心的位置不再发生变化。此时,K-Means 聚类算法达到了收敛状态,因为反复应用这两个步骤不会再使点的分配或簇中心的位置进一步改变。在这个例子中,算法成功地将数据点分成了两个簇,上面的点对应一个簇,下面的点对应另一个簇。
K-Means原理
算法原理
- 目标:将 n 个数据点划分到 K 个簇中,使得每个数据点都属于与其距离最近的均值(聚类中心)所在的簇,并且最小化每个簇内数据点到该簇中心的距离平方和,即最小化目标函数
,其中
表示第i个簇,
是第i个簇的中心,
是属于
的第j个数据点。
- 距离度量:通常使用欧几里得距离来计算数据点之间的距离。对于两个n维数据点
和
,它们之间的欧几里得距离
。
算法步骤
- 初始化:随机选择K个数据点作为初始的聚类中心
。
- 分配数据点到簇:对于数据集中的每个数据点
,计算它到K个聚类中心的距离,并将其分配到距离最近的聚类中心所在的簇
中。
- 更新聚类中心:对于每个簇
,计算该簇中所有数据点的均值,作为新的聚类中心
。
- 重复步骤 2 和 3:不断重复分配数据点到簇和更新聚类中心的步骤,直到聚类中心不再发生变化,或者达到预设的迭代次数。
算法示例
假设有一组二维数据点(1,2),(2,3),(3,1),(4,4),(5,3),(6,2),要将其分为K = 2个簇。
- 随机选择两个初始聚类中心,例如
,
。
- 计算每个数据点到两个聚类中心的距离,将数据点分配到最近的聚类中心所在的簇。例如,(2,3)到
的距离为
,到
的距离为
,所以(2,3)被分配到
所在的簇。
- 计算每个簇中数据点的均值,更新聚类中心。假设分配后
所在的簇有(1,2),(2,3),(3,1),则新的
;
所在的簇有(4,4),(5,3),(6,2),新的
。
- 重复步骤 2 和 3,直到聚类中心不再变化。经过几次迭代后,聚类中心会稳定下来,得到最终的两个簇。
算法优缺点
- 优点
- 简单快速:算法原理简单,易于理解和实现,对于大规模数据集也能较快地收敛。
- 可解释性强:聚类结果直观,每个簇都有明确的中心,可以很容易地理解每个簇的特征。
- 缺点
- 对初始聚类中心敏感:不同的初始聚类中心可能导致不同的聚类结果,甚至可能得到局部最优解而非全局最优解。
- 需要预先指定聚类个数 K:在实际应用中,很难事先知道合适的K值,K值的选择可能会影响聚类结果的质量。
- 对异常值敏感:由于是基于均值来更新聚类中心,所以异常值可能会对聚类结果产生较大影响。
应用场景
- 客户细分:根据客户的特征,如年龄、收入、消费行为等,将客户分为不同的群体,以便企业针对不同群体制定个性化的营销策略。
- 图像分割:将图像中的像素点根据颜色、纹理等特征划分为不同的区域,例如将一幅风景图像中的天空、草地、树木等不同景物分割出来。
- 文本分类:对文档进行聚类,将相似主题的文档归为一类,有助于文档的组织和检索。
最简python实现
import numpy as npdef kmeans(data, k, max_iterations=100):# 随机初始化聚类中心centroids = data[np.random.choice(data.shape[0], k, replace=False)]for _ in range(max_iterations):# 分配数据点到最近的聚类中心distances = np.array([np.linalg.norm(data - centroid, axis=1) for centroid in centroids])labels = np.argmin(distances, axis=0)# 更新聚类中心new_centroids = np.array([data[labels == i].mean(axis=0) for i in range(k)])# 检查聚类中心是否不再变化if np.all(centroids == new_centroids):breakcentroids = new_centroidsreturn labels, centroids# 示例数据
data = np.array([[1, 2], [2, 3], [3, 1], [4, 4], [5, 3], [6, 2]])
k = 2# 运行K - Means算法
labels, centroids = kmeans(data, k)
print("聚类标签:", labels)
print("聚类中心:", centroids)
笔者注
K - Means 算法名称中的 “K” 表示聚类的类别数量,是算法的一个输入参数,用户需要事先指定将数据划分为多少个类别。“Means” 表示均值,因为该算法的核心是通过计算每个聚类中数据点的均值(中心)来确定聚类的归属和更新聚类中心。