我目前有一个reddit-clone类型的网站。我正在尝试根据用户之前喜欢的帖子推荐帖子。
看起来K最近邻居或k意味着最好的方法。
我似乎无法理解如何实际实现这一点。我已经看到了一些数学公式(例如k上的那个就意味着维基百科页面),但它们对我来说并没有意义。
有人可能会推荐一些伪代码,或者看看这些地方,以便我能更好地了解如何做到这一点吗?
答案 0 :(得分:8)
K-Nearest Neighbor(又名KNN)是一种分类算法。
基本上,您需要一个由N个项目组成的训练组并对其进行分类。您如何对它们进行分类完全取决于您的数据,以及您认为该数据的重要分类特征是什么。在您的示例中,这可能是帖子类别,发布项目的人员,赞成项目的人员等等。
一旦对此“培训”数据进行了分类,您就可以评估“未知”数据点。您可以通过在分类系统中找到它的最近邻居来确定未知的“类”。如果您确定3个最近邻居的分类,则可以将其称为3最近邻居算法。
如何确定“最近邻居”在很大程度上取决于您对数据进行分类的方式。将数据绘制到N维空间中非常常见,其中N表示您正在检查的不同分类特征的数量。
一个简单的例子:
假设您拥有可以在世界任何地方的任何陆地上的位置的经度/纬度坐标。我们还假设您没有地图,但是做有一个非常大的数据集,可以为您提供世界上许多不同城市的经度/纬度,您也知道那些国家/地区城市在。
如果我问你哪个国家有一个随机经度纬度点,你能算出来吗?你会怎么做才能搞清楚?
经度/纬度数据自然地落入X,Y图中。那么,如果你将所有城市划分到这个图表上,然后是未知点,那么你将如何找出未知国家?您可能会开始围绕该点绘制圆圈,越来越大,直到圆圈包含地块上最近的10个城市。现在,您可以查看这10个城市的国家/地区。如果所有10个人都在美国,那么你可以相当肯定地说你的未知点也在美国。但如果只有6个城市在美国,而其他4个城市在加拿大,你能说出你未知的地方吗?你可能仍然猜测美国,但不太确定。
KNN最棘手的部分是弄清楚如何对数据进行分类,以便确定质量相近的“邻居”以及与这些邻居之间的距离。
答案 1 :(得分:2)
你所描述的听起来像recommender system引擎,而不是像k-means这样的聚类算法,它本质上是一种无监督的方法。我无法清楚地知道reddit实际上使用了什么,但我通过Google搜索“推荐者+ reddit”找到了一些有趣的帖子,例如: Reddit, Stumbleupon, Del.icio.us and Hacker News Algorithms Exposed!无论如何,可能会使用k-NN算法(在top ten data mining algorithm中描述,在维基百科上使用伪代码),或其他技术,如Collaborative filtering({{3}使用例如,在这个好的Amazon中描述。
答案 2 :(得分:1)
k-Means最简单形式的聚类是对值进行平均,并将其他平均值保持在一个中心平均值附近。假设您有以下值
1,2,3,4,6,7,8,9,10,11,12,21,22,33,40
现在,如果我进行k-means聚类并记住k-means聚类将具有偏置(均值/平均)机制,该机制要么将值放在靠近中心或远离它的位置。我们得到以下内容。
cluster-1
1,2,3,4,5,6,7,8
cluster-2
10,11,12
cluster-3
21,22
cluster-4
33
cluster-5
40
请记住,我刚刚组成了这些集群中心(集群1-5)。 因此,接下来,当您进行聚类时,数字将最终围绕任何这些中心方式(也称为k中心)。以上数据是单维的。
当您对大型数据集执行kmeans聚类时,多维度(多维数据是一个值数组,您将拥有数百万个相同维度的数据集),您将需要更大且可扩展的东西。您将首先平均一个数组,您将得到一个单独的值,就像明智的一样,您将对其他数组重复相同的操作,然后执行kmean聚类。
阅读我的一个问题Here
希望这有帮助。
答案 3 :(得分:1)
要做k近邻,你最需要一个距离的概念,以及找到你能负担得起的k个最近邻居的方法(你可能不希望逐个搜索所有的数据点) 。在http://www.cs.umd.edu/~mount/ANN/有一个近似最近邻居的图书馆。这是一个非常简单的分类算法 - 对新点p进行分类,找到它的k个最近邻点,并根据这些k个邻居中最受欢迎的类对p进行分类。
我想在你的情况下,你可以在你决定最接近意味着什么的时候为某人提供类似帖子的列表,然后监控点击这一点并尝试从中学习以预测哪些替代方案最为合适受欢迎。
如果您有兴趣为您的目的找到一个特别好的学习算法,请查看http://www.cs.waikato.ac.nz/ml/weka/ - 它允许您尝试大量不同的算法,并编写您自己的插件 - 插件。
答案 4 :(得分:0)
以下是MINST数据集的一个非常简单的KNN示例 一旦您能够计算文档之间的距离,相同的算法就可以正常工作
http://shyamalapriya.github.io/digit-recognition-using-k-nearest-neighbors/