我对机器学习还比较新手。我试图根据兴趣评分(1=低,10=高)将SetA中的人与SetB中的人进行匹配。我的实际数据集有40个特征(后来我想对某些特征以及不太常见的兴趣设置更高的权重,我相信这个会对我有帮助?)。
示例数据集:
>>> dfA = pd.DataFrame(np.array([[1, 1, 1], [4, 4, 4], [8, 8, 8]]), columns=['interest1', 'interest2', 'interest3'], index=['personA1','personA2','personA3'])>>> dfB = pd.DataFrame(np.array([[4, 4, 3], [2, 2, 1], [1, 2, 2]]), columns=['interest1', 'interest2', 'interest3'], index=['personB1','personB2','personB3'])print(dfA, "\n", dfB)>>> interest1 interest2 interest3personA1 1 1 1personA2 4 4 4personA3 8 8 8 interest1 interest2 interest3personB1 4 4 3personB2 2 2 1personB3 1 2 2
我使用sklearn的最近邻算法来做这件事:
knn = NearestNeighbors(n_neighbors = 2).fit(dfA)distances, indicies = knn.kneighbors(dfB)>>> print(distances, "\n \n", indicies)>>>[[1. 4.69041576] [1.41421356 4.12310563] [1.41421356 4.12310563]] [[1 0] [0 1] [0 1]]
我无法理解这个输出?我知道有一个类似问题的解释,但是我不知道如何将其应用到这种情况,因为有两个不同的数据集。
最终,我想要一个匹配的最终数据框,如下所示:
SetA SetBpersonA1 personB2personA2 personB1personA3 personB3
回答:
你得到的结果是SetB中给定人的最近邻居,从SetA中的人中选出。
换句话说,第一个元素distances[0]
告诉你personB1与其在SetA中的两个最近邻居的距离。indicies[0]
告诉你这两个人的索引。
在这个例子中:indicies[0] = [1, 0]
意味着personB1在SetA中的最近邻居是SetA[1] = personA2和SetA[0] = personA1。distances[0] = [1. 4.69041576]
告诉我们personB1和personA2之间的距离是1,而personB1和personA1之间的距离是4.69041576(你可以手动计算欧几里得距离来验证这一点)。
几点说明:
-
从你的问题描述来看,你似乎只对SetB中的人在SetA中找到最近邻居感兴趣(而不是两个最近邻居)。如果是这样的话,我建议将knn参数中的n_neighbors=2改为n_neighbors=1。
-
注意你的索引:在你的数据集中,标签是从1开始的(personA1, personA2, …),但是在knn中,索引总是从0开始。当事情变得更复杂时,这可能会导致混淆,因为SetA[0]=personA1,所以要注意这一点。