- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
以下问题:通过填写表明个性、生活方式、兴趣等的个人资料提供的数据,根据兼容性得分来匹配用户。
每个属性都是标签(例如,性格的属性冷静),要么为 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/
我正在尝试检索用户兴趣列表。所以我正在调用 graph api 来检索书籍、音乐等内容。似乎“喜欢”下的所有内容也包括书籍、音乐等下列出的所有内容。他们有任何异常(exception)吗,或者我可以调
这是一道代码组织题。我有将渐变背景放在 View 上的代码。我想在多个 View 上使用相同的代码 - 因此,我想将代码放在一个函数中,并在配置相关 View 时调用它。 我的问题是,放置这样一个函数
我是一名优秀的程序员,十分优秀!