监督学习通常是指我们用假设函数去拟合带有标签的数据集,然后根据假设函数去预测新(不带有标签)的数据的标签。而在无监督学习中,通常数据并不带有任何标签,需要利用算法找出数据中的隐含结构,比如自动将数据分成簇,这种通常叫做聚类算法。
K-Means(K 均值算法)
K-Means 是目前运用最广泛的聚类算法。首先需要随机生成 个点,作为聚类中心(Cluster Centroids),接着进入迭代,每次迭代都要完成簇分配和移动聚类中心。首先是簇分配,需要遍历每个样本,然后计算每个样本到聚类中心的距离,将其分配到距离最近的聚类中心。第二步则是移动聚类中心,需要计算当前每个分类中所有样本的均值点,并将该点作为当前分类新的聚类中心。接着就又进入了下一轮迭代,直到聚类中心及样本点都不再改变则完成迭代,这时候 K-Means 已经聚合,数据已经被分为 个簇。
K-means 接收两个输入参数,一个是 K,代表簇的个数,另一个参数就是一系列无标签数据 。我们约定 是一个 维实数向量,K-means 计算过程如下:
首先,随机初始化 K 个聚类中心 。接着进入迭代,重复计算以下步骤:
- 簇分配
对于每个训练样本,用 表示最接近 的聚类中心,通过 找出距离 最近的聚类中心的序号 ,将其赋值给 。 - 移动聚类中心
为第 k 个分类中所有样本的均值,即聚类中心。假设 ,就代表样本 都属于第 2 个聚类中心 。这时,我们计算 的均值 ,其中 是一个 维向量,因为每个样本都是一个 维向量,此时 已经更新为当前分类所有样本的均值点,这就完成了聚类中心的移动。值得注意的是,如果当前聚类中心没有任何样本,可以直接移除这个聚类中心,那么最终会得到 K-1 个簇,如果确实需要得到 K 个簇的话,也可以重新随机初始化这个聚类中心。
K-Means 还可以解决分离不佳的簇的问题,有时候我们的数据并不像左边这样分类明确,而是像右边这样紧密关联。假设图中为客户的身高体重数据,我们想要根据这些数据来确定 T 恤的尺码。我们利用 K-Means 算法仍然可以将这些关联紧密的数据分为若干个簇,并根据每个簇内样本的身高体重数据来设计合适的尺码,这样就可以很好地贴合三类不同人群的需求。
优化目标
在 K-Means 算法中,我们会追踪变量 ,其中 等于样本 所属的聚类中心 下所有样本的均值 。
K-Means 算法的优化目标为最小化每个样本到其所属聚类中心的距离,代价函数为:
这个代价函数也叫失真代价函数(Distortion Cost Function)或者叫 K-Means 的失真(The Distortion Of The K-means Algorithm)。实际上,簇分配的过程就是选择 来最小化代价函数 的过程。而移动聚类中心的过程就是选择 来最小化代价函数 的过程。
初始化
首先要保证簇的个数 K 小于样本数量 ,然后随机选择 K 个训练样本。初始化聚类中心点的选择对聚类结果影响很大,尤其是 K 比较小的情况下(2-10),如果初始化的不好,很容易得到局部最优解,如下图所示:
我们可以尝试多次随机初始化,并多次运行 K-Means 算法(50-1000次),直到找到较好的结果,即选择使得代价函数值最小的 K 值。实际上,K 值越大,就越难得到全局最优解。
聚类数量选取
数据散点图:
我们可以通过观察数据的散点图或通过聚类算法的输出来选择合适的 K 值。但有时候画图也难以选择,如图所示,我们可以将数据集划分为两个聚类,也可以将其划分为四个聚类,所以有时候无监督学习并没有一个明确的答案,这就是我们很难通过自动化算法来选取 K 值的原因。
肘部法则(Elbow Method):
分别计算并画出不同的 K 值的代价函数值,观察代价函数值随 K 值的变化曲线,在曲线拐点处(肘部)的 K 值通常会是理想的选择(图中 K = 3)。
有时候代价函数值随 K 值的变化是一条平滑的曲线,并没有清晰的拐点,这时候肘部法则就不适用了。
下游目的:
我们还可以观察哪个 K 值能够更好地应用于下游目的,比如当我们考虑是将 T 恤尺码分为三类(S、M、L)还是五类(XS、S、M、L、XL)的时候,我们可以根据一些下游目的,比如客户评分、销量、退货率、客户满意度等来作为参考。
网友评论