gpt4 book ai didi

python - 根据兴趣匹配人员

转载 作者:太空宇宙 更新时间:2023-11-03 21:20:26 24 4
gpt4 key购买 nike

以下问题:通过填写表明个性、生活方式、兴趣等的个人资料提供的数据,根据兼容性得分来匹配用户。

每个属性都是标签(例如,性格的属性冷静),要么为 true (1),要么为 false (0)。假设我们想要找到两个用户的兼容性。

Extract from panda DataFrame for personality

从用户 3 中减去用户 2,对差值进行平方,并将差值之和与最大可能偏差(某个类别的属性数量等个性)联系起来。倒数就是相似度的分数。所有类别(例如生活方式)都是如此

def similarityScore (pandaFrame, name1, name2):

profile1 = pandaToArray(pandaFrame, name1)#function changing DataFrane to array
profile2 = pandaToArray(pandaFrame, name2)

newArray = profile1 - profile2
differences = 0
for element in newArray:
element = (element)**2
differences += element
maxDifference = len(profile1)
similarity = 1 - (differences/maxDifference)
return similarity

每个用户都会与 DataFrame 中的每个其他用户进行比较:

def scorecalc(fileName):
data = csvToPanda(fileName)
scorePanda = pd.DataFrame([], columns=userList, index=userList)
for user1 in userList:
firstUser = user1

for user2 in userList:
secondUser = user2
score = similarityScore(data, firstUser, secondUser)
scorePanda.iloc[[userList.index(firstUser)],[userList.index(secondUser)]] = score
return(scorePanda)

根据特定类别的相似性对用户的重要性,通过将相似性得分乘以偏好数据帧来对相似性得分进行加权:

def weightedScore (personality, lifestyle,preferences):

personality = personality.multiply(preferences['personality'])
lifestyle = lifestyle.multiply(preferences['lifestyle'])

weightscore = (personality + lifestyle)
return(weightscore)

结果将是从 0 到 1 的兼容性分数。

它工作得很好,但是需要相当多的时间来运行它,特别是当比较的用户数量(100+)增加时。有什么建议可以加快速度,使代码更简单吗?

最佳答案

希望我的问题陈述是正确的:

我有 DataFrame X,包含二进制指示符变量。 (0,1)对于 X 的每一行(代表不同的用户),我想找到其他用户/行中最相似的用户/行。

我将使用sklearn中的NearestNeighbors类,from here :

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
from sklearn.neighbors import NearestNeighbors
X = np.array([[0,0,0,0,1],
[0,0,0,0,1],
[1,1,1,0,0],
[1,0,0,1,1]])

观察 X,我们可以看到 idx = 1 和 idx = 2 最相似。他们完美匹配。它们应该彼此匹配为“最相似”。

# two nbrs since first match is self match
nbrs = NearestNeighbors(n_neighbors=2, metric='dice').fit(X)
distances, indices = nbrs.kneighbors(X)
print(indices)

#remember first val in this array per line is self match
[[0 1]
[0 1]
[2 3]
[3 1]]

为了纳入你的加权分数,我不太确定。我的第一个想法是获取二进制数据数组,乘以“这对我来说有多重要”,然后在最近邻居搜索中使用不同的度量,例如“euclidean”或其他。它需要更多关于其他数据帧中包含的具体内容的信息。

假设用户 1 和 2(通过他们的索引位置)表示第三列非常重要(0-10 上的“10”),并且第三列在这里填写如下:

X = np.array([[0,0,0,0,1],
[0,0,1,0,1],
[1,1,1,0,0],
[1,0,0,1,1]])
# notice they match now on that 3rd col, but disagree elsewhere

#ugly hack for replacing two vals
np.put(X[1], [2], [10]) # grab second row, third col, place [10]
np.put(X[2], [2], [10])

print(X)

[[ 0 0 0 0 1]
[ 0 0 10 0 1]
[ 1 1 10 0 0]
[ 1 0 0 1 1]]

现在他们都同意这个问题非常重要。现在尝试使用不同的度量进行邻居计算:

nbrs = NearestNeighbors(n_neighbors=2, metric='euclidean').fit(X)

d, i = nbrs.kneighbors(X)
print(d)
print(i)

[[0. 1.41421356]
[0. 1.73205081]
[0. 1.73205081]
[0. 1.41421356]]
[[0 3]
[1 2]
[2 1]
[3 0]]

[1,2][2,1] 指示第二行和第三行现在彼此距离最近。 (记住数组i中的第一个val是 self 匹配)

这里我掩盖了一些细节,这可能会使最近的邻居不合适,但您可以阅读 them in other various places

关于python - 根据兴趣匹配人员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54310412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com