An Algorithm Summary of Programming Collective Intelligence (3)

k-Nearest Neighbors kNN(不要问我叫什么)
PCI里面用kNN做了一个价格预测模型,还有一个简单的电影喜好预测。简单来说就是要对一个东西做数值预测,就要先有一堆已经有数值的东西,从里面找出和要预测的东西相似的,再通过计算这些相似东西的均值来作出预测。

kNN里面首先遇到的问题是如何定义“相似”。

把物品的各种属性量化,这样就构成了一个若干维度的向量空间。于是我们说相似就是离得近。这个量化的时候学问很大,毕竟各种不同的属性用不同的量化方法算出来的数值千差百异。所以还要根据各自的重要性进行伸缩调整,不重要的干脆就乘以一个零直接去掉省心。这是一个非常费心的活儿。不同的问题伸缩系数肯定各异,如何来确定这些系数就要加上主观判断、反复调整、结果比较、cross validation。这个时候优化算法是个不错的选择。这个我们后面还会提到。

怎么计算离得近呢?方法很多,PCI给了几个:欧式距离,Pearson相关度和Tanimoto分数。具体如何计算就不重复了,让我重复也重复不出来。

当然只选择一个最相似的来进行预测是不够准确的,所以有了k——选k个最相似的来平均——这就是kNN的来历。

如何计算平均也是一个很有意思的事情。直接把k个数值加起来一除可以,就是有点简单粗暴,不像读书人做的事情,虽然暴力美有时候也是很诱人的。更合理一点的方法是给不同的数值分配权值,离得近的权重大一点,远的就小一点。突然想起来原来的万有引力公式,牛老大也喜欢近的,不知道能不能改叭改叭拿过来用。

优点
即使在复杂数值预测问题中依然理解,对系数调整的经验在处理类似问题时依然很有帮助。
伸缩系数的调整不仅可以改善预测的结果,也说明了对应属性的重要性。
随时可以增大数据集

缺点
计算量大
调整系数很烦人

Clustering 聚类

层次聚类和K-means聚类都不做预测,所以也就不需要训练。PCI里面举了一个给blog分类的例子。

层次聚类很简单,第一步的工作也是先量化,构建向量空间,然后不断寻找最接近的两个向量并合并他们作为一个新的聚类向量,直到最后只剩下一个聚类为止。

K-means聚类(又是k?!)有所不同。它先任意在向量空间中挑出k个点,然后把所有向量按照和这k个点的远近划分成组,每个向量加入距离最近的点所代表的组。然后计算每组的重心,把代表小组的点的位置调整到这个重心上,再重复上面的计算,知道所有的向量分组不再变化为止。

K-means需要你来确定这个K和点的初始位置,这里面没有什么好办法。

你可能感兴趣的:(programming)