python – 需要一个适当的数据结构或索引,以便根据3d点和重要性因素进行快速用户查找
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 需要一个适当的数据结构或索引,以便根据3d点和重要性因素进行快速用户查找,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2891字,纯文字阅读大概需要5分钟。
内容图文
![python – 需要一个适当的数据结构或索引,以便根据3d点和重要性因素进行快速用户查找](/upload/InfoBanner/zyjiaocheng/770/bdc1ce6b810546feb53b38e57592143a.jpg)
我有大量的3D点与重要性因素配对.
每个用户有六分.例如:查理人有6分:(22,44,55)是他的第一个重要因子为3分,(10,0,0)是他的第二个向量,重要因子为2.8,一直到他的第六点是(100,300,200),重要性因子为0.4.
我想做的是找到与查理最相似的人,而不是遍历每一个人.基本上为每个用户最小化此功能(即,将该用户的正确六点与Charlie匹配):
pythagoras(point, point2) * max(importance_factor, importance_factor2) * (abs(importance_factor - importance_factor2) + 1)
然后通过选择成本最低的用户找到与Charlie最相似的用户.我现在已经用愚蠢的方式编写了代码(通过做很多循环),但我正在寻找一种方法来正确处理有多个点和重要性因素的事实.
我开始研究空间索引,但我认为它们不会起作用,因为我有多个点,但也许我可以将这些点展开到更高维度点?那么在3个维度中我不是6个点而是18个维度中有1个点?仍然无法处理重要性因素,但它总比没有好.
不幸的是,我不能在这里使用矢量和余弦,因为(1,1,1)和(400,400,400)是非常相反的东西.
有任何想法吗?
解决方法:
既然你还没有得到任何答案,我想我至少会提出一些想法.我使用了一个python k-d树模块来快速搜索最近的邻居点:
http://code.google.com/p/python-kdtree/downloads/detail?name=kdtree.py
只要它们的大小相同,它就需要任意点长度.
我不确定你将如何应用“重要性”的权重,但这里只是一个关于如何使用kdtree模块至少让最近的“人”到达给定人集的每个点的头脑风暴:
import numpy
from kdtree import KDTree
from itertools import chain
class PersonPoint(object):
def __init__(self, person, point, factor):
self.person = person
self.point = point
self.factor = factor
def __repr__(self):
return '<%s: %s, %0.2f>' % (self.person,
['%0.2f' % p for p in self.point], self.factor)
def __iter__(self):
return self.point
def __len__(self):
return len(self.point)
def __getitem__(self, i):
return self.point[i]
people = {}
for name in ('bill', 'john', 'mary', 'jenny', 'phil', 'george'):
factors = numpy.random.rand(6)
points = numpy.random.rand(6, 3).tolist()
people[name] = [PersonPoint(name, p, f) for p,f in zip(points, factors)]
bill_points = people['bill']
others = list(chain(*[people[name] for name in people if name != 'bill']))
tree = KDTree.construct_from_data(others)
for point in bill_points:
# t=1 means only return the 1 closest.
# You could set it higher to return more.
print point, "=>", tree.query(point, t=1)[0]
结果:
<bill: ['0.22', '0.64', '0.14'], 0.07> =>
<phil: ['0.23', '0.54', '0.11'], 0.90>
<bill: ['0.31', '0.87', '0.16'], 0.88> =>
<phil: ['0.36', '0.80', '0.14'], 0.40>
<bill: ['0.34', '0.64', '0.25'], 0.65> =>
<jenny: ['0.29', '0.77', '0.28'], 0.40>
<bill: ['0.24', '0.90', '0.23'], 0.53> =>
<jenny: ['0.29', '0.77', '0.28'], 0.40>
<bill: ['0.50', '0.69', '0.06'], 0.68> =>
<phil: ['0.36', '0.80', '0.14'], 0.40>
<bill: ['0.13', '0.67', '0.93'], 0.54> =>
<jenny: ['0.05', '0.62', '0.94'], 0.84>
我想结果,你可以看看最常见的匹配“人”或者然后考虑权重.或者也许你可以总结结果中的重要因素,然后取最高评分.那样的话,如果玛丽只匹配一次,但有10个因子,而菲尔有3个匹配,但只总计5,玛丽可能更相关?
我知道你有一个更强大的功能来创建一个索引,但它需要遍历你的集合中的每个点.
内容总结
以上是互联网集市为您收集整理的python – 需要一个适当的数据结构或索引,以便根据3d点和重要性因素进行快速用户查找全部内容,希望文章能够帮你解决python – 需要一个适当的数据结构或索引,以便根据3d点和重要性因素进行快速用户查找所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。