An Algorithm Summary of Programming Collective Intelligence (3)
2008-04-11 19:09
561 查看
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和点的初始位置,这里面没有什么好办法。
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和点的初始位置,这里面没有什么好办法。
相关文章推荐
- An Algorithm Summary of Programming Collective Intelligence
- An Algorithm Summary of Programming Collective Intelligence (2)
- An Algorithm Summary of Programming Collective Intelligence (1)
- An Algorithm Summary of Programming Collective Intelligence (2)
- An Algorithm Summary of Programming Collective Intelligence (1)
- An Algorithm Summary of Programming Collective Intelligence (5)
- An Algorithm Summary of Programming Collective Intelligence (3)
- An Algorithm Summary of Programming Collective Intelligence (4)
- An Algorithm Summary of Programming Collective Intelligence (4)
- 0912_Collective Intelligence Programming Reading Notes
- 集体智慧编程 Programming Collective Intelligence 书中代码程序研究
- Programming Collective Intelligence: Building Smart Web 2.0 Applications
- An algorithm for routing control of a tandem automated guided vehicle system
- Given an array of characters which form a sentence of words, give an efficient algorithm to reverse
- 关于《programming collective intelligence》(集体智慧编程)的del.icio.us API无法访问
- 《programming.collective.intelligence》(集体智慧编程)读书笔记
- An example usage of an encryption algorithm (AES, in this case) is:
- 关于《programming collective intelligence》(集体智慧编程)的del.icio.us API无法访问
- Programming Collective Intelligence笔记 - Ranking
- In Search of an Understandable Consensus Algorithm(翻译)