聚类问题
聚类问题是无监督学习:无监督学习与监督学习是相对的,因为它是用的是一个无标签的训练集,而不是一个有标签的训练集。换句话说,我们没有一个向量y和一个已知结果,我们只有一些特征值得数据集,从数据集中我们可以发现一些数据自身的特征。
聚类问题适合于:
市场分割;
社交网络分析;
大型服务器聚类;
天文数据分析;
K均值算法
k均值算法是最受欢迎也被广泛使用的算法,这个算法能够将数据自动地分类到一些子集中去,主要通过以下步骤来实现(以两个聚类作为示例):
1、随机分配两个数据点,成为聚类中心点;
2、聚类分配:根据我们的训练集距离中心点距离远近分配所有的数据集为对应的两组,数据集离那个中心点距离近就将其分为哪一类;
3、移动中心点:计算上述已经分好类的所有数据点的平均值,然后将两个中心点移动到两个平均值点;
4、重复2,3步骤直到我们找到我们的聚类。
主要变量有:
K(聚类数目)
训练集
注意我们不会使用X0=1的惯例。
算法流程:
第一个循环是聚类分配步骤。我们创造一个c向量(c(i)代表训练集x(i)的中心点)。我们可以写出聚类分配步骤的操作通过数学表示:
代表中心点的中心点的类的索引,也就是说 距离那个中心点最近,那么它就属于哪一类。
通常我们都在右式中加上平方项,这是我们尝试最小化的函数能够跟家急速的增加。通常这是一个惯例,但是这个惯例也帮助我们减少了计算量。因为欧几里得距离要求一个平方根,但是加上平方项以后就不需要求平方根。
没有带平方项:
带平方项:
因此这个平方项的惯例通常有两个目的:更快速的最小化和更少的计算了。
第二个循环是移动中心点的步骤,我们需要移动每一个中心点到各自子集的中心点。
更正式的,我们可以用等式来表示这个循环:
这里 是 组的训练集。
如果你没有分配一个中心点到聚类中心,那么你可以随机初始化一个中心点,你也可以消除聚类分组。
在大量的迭代之后,算法将收敛,收敛以后继续迭代就不会影响聚类了。也就是聚类中心也不会改变了。
注意在分分类聚类:一些数据集没有内部分类或者自然结构,k均值仍然能够均匀的把你的数据分为k类,引次在这种情况中这种算法会很有用。
在k均值算法中需要用到的参数:
=聚类的索引(1,2…,k),分配训练集x(i);
=聚类中心k;
=被重新分配过的聚类中心。
使用上述变量我们可以定义我们的代价函数为:
我们的目标是使用上述的代价函数最小化我们所有的参数。
也就是说,我们要寻找集合c中所有的值,c代表训练集所有的聚类,也就说每一个x所属的类都保存在c中,u代表我们所有的中心点。需要最小化每一个训练集到它对应的中心点的距离和的平均值最小。
在聚类分配步骤中,我们的目标是:
最小化J用 (代表对应的x训练集属于哪一个中心点);
在移动中心点步骤中,我们的目标是
最小化J,使用
使用k均值算法,代价函数总是减少的。
随机初始化
对于随机初始化你的聚类中心点有一种值得推荐的方法:
1、K<m,也就是说确保你的聚类的数目比你的训练集的数量小;
2、随机选择K个训练集数据。(确保选择的是独一无二的数据点);
3、设置 等于这k个数据点。
4k均值可能导致局部最优,为了减少局部最优的发生,你可以使用许多不同的随机初始值来运行这个算法。当k<10时,通常强烈减少使用一个循环来运行不同的随机初始值。
选择聚类的数量
选择聚类的数量K可能是模糊的。
肘部方法:画出代价函数J和聚类数量K的关系,当我们增加聚类数量时代价函数减少,然后慢慢变平,选择代价函数开始变平时的K值作为聚类数量。
然而,通常这个曲线是非常平缓的,没有非常明确的突变点。
当k增加时J总是减少,唯一的例外是k均值算法有局部最优点。
另一种选择k的方法是根据你的目的来选择一些带有目的性的分类。
比如T恤:
我们可以设置三个尺码(S.M,L)
我们也可以设置5个尺码(XS,S,M,L,XL)
这样我们的K=3或K=5;