机器学习之Javascript篇: k-Means 聚类算法介绍

原文:https://www.burakkanber.com/blog/machine-learning-k-means-clustering-in-javascript-part-1/

作者:Burak Kanber

翻译:王维强


 

在机器学习算法的帮助下我们能够处理体量巨大的数据,我们可以向数据询问一系列的问题,希望机器学习能给出答案。比如:某个数据点和哪些相似?通过对这些数据的分析能否总结出某种模式?给出历史趋势数据的前提下,能否判断未来走势? 诸如此类的问题都适用于在机器学习领域寻找答案。

 

介绍 & 动机

今天的议题是怎么把数据分类。比如,你正在为一家医疗影像设备公司工作,假如你已经找到了识别肿瘤细胞的方法,但是如果能有一种方法可以找出肿瘤细胞群的中心位置就更好了,这样就可以使用机器人精准地达到目的地并清除它们。

我们需要找出一种聚类算法,这就是今天要特别讨论的 k-means。

 

聚类

聚类算法通常来讲就是要按照相似性给数据分类。如果你是一个电商经营者,就可以用聚类算法识别出各种购物者的类型。你可能会发现有一种顾客在浏览三五个产品页面之后就会下单购买,另外一组用户可能需要浏览多达15个页面还要看很多评论才决定购买,而且会是一单高价值的购买行为,另外你可能还会注意到有一组冲动消费型的用户,他们不用浏览太深入就会发生多次小额购买行为。一旦完成了对这些线上消费者的人口调查,你就能更好地优化站点提高销售额。因为知道了自己的客户中存在冲动型消费者,你就可以针对性地添加一些功能刺激这部分消费者。

 

k-means

和近邻算法(k-nearest-neighbor)一样,k-means 中的 k 也是一个数量值,是算法中的重要参数。需要特别指出的是,这里的 “k” 就是我们要在数据中找出来的簇(分组)的数量。不幸的是,很难在问题解决前知晓这个数量值,所以 k-means 算法通常需要在另外一个算法的帮助下找到最恰当的 k 值。

问题是 k-means 算法会把数据分割成 k 个独特的簇, 但是算法不会告诉你 k 值是否正确。比如,你的数据在理想情况下应该被分成5个簇,但是如果人为地把 k 设定为3,那么你就会得到3个簇,当然这些簇的规模肯定大了一些,相对于理想状态下的5个簇,精确度也下降了。

这个算法有优点也有短板,为了使用 k-means 算法你需要预先知道k的值,或者用另外的算法帮你猜测这个值。 k-means 只是帮你把数据分到不同的类别里,你还需要做些额外的工作找到簇的合适数目。

在今天例子中我们先设定簇的数目为3,下一篇文章将会讨论自动猜测 k 值的算法,最常用到的就是误差分析法结合反复调用 k-means 算法以优化结果,使误差最小化。

 

过程

虽然 k-means 算法简单,但是如果用在多维数据集上会表现出它强大的生命力。今天我们会处理一组2维数据,下次我们再把它做的复杂些。

算法过程如下:

  1. 以散点图的方式,可视化数据。
  2. 创建 k 个新的数据点,随机分布在图上,把这些数据点作为簇的“重心”,也称“簇重心备选者”。
  3. 重复下面的过程:
    1. 把距离重心最近的那些数据点分配给它
    2. 移动重心的位置到所有属于它的数据点的平均位置上
    3. 如果重心的位置在最后一步中移动了,继续重复上诉过程,否则退出。

 

简单吧! 如你所见,这是一个迭代过程。可能会迭代两三次甚至数十次,但是最终你的簇重心会靠近目的地并停止移动,最后会得到你想要的簇集合。
 

机器委员会

该算法和很多我们在这个系列中将要讲到算法的一样,容易陷入局部最优解。如果你多运行下面的例子几次,就会发现每次得到的结果都会有差别,这意味着一些结果陷入了不同的局部最优解。算法从一些随机的,本身就容易受局部最优影响的种子开始,因为永远不知道算法具体的开始位置和结果的走向,种子的状态会导致局部最优还是全局最优?这些都无从知晓。就像遗传算法一样,能跳出局部最优解的一个方法就是使“解”发生一点儿突变。在此 k-means 例子中, 我们会在算法中加入一条规则,就是当发现重心数据点经过一轮迭代后没有发生移动,那么就在一个在随机方向上推一把。结果就是它可能又回到了原来的位置,也可能找到了一个新的解。这个推动不要大到让计算从回起点,但是也要足够把它踢出某个局部最优区域。另外一个我们可以使用的技巧被称之为“机器委员会”,如果你的算法能结束的很快或者能使用并行计算,那么这个技巧很管用。其实很简单,我们运行 k-means 算法3次,5次,51次或10000次,选择那些最经常得到的解。“机器委员会” 是指一些人选择在不同硬件上运行并行算法,一个字面上的机器委员会能给这些“解”投票。

代码<

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值