作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题的背景信息:
如果两个对象在彼此的 k-最近邻之间,则它们被称为彼此的 k-倒数最近邻。我只对属于不相交组的对象感兴趣。例如,考虑两组数字 S = {0, 1, 2},T = {0.1, 1.1, 1.9} 和 k=2。
对于 S 组,
distmat = np.array([[5, 1, 4, 7.5],
[3, 10, 2, 11],
[9, 2.5, 8, 3],
[1, 3, 5.5, 5],
[4, 6, 3.5, 8]])
np.argsort(distmat)
然后检索索引小于 k 的对象。
distmat
并检查第 N 行。如果 A 是 N 的 k 最近邻,则它们是倒数;否则他们不是。一些粗略的代码:
for index_N, N in enumerate(knn_A):
knn_N = get_knn(distmat.T[index_N]
if A in knn_N:
print("{} and {} are {}-reciprocals".format(A, N, k))
最佳答案
您将不得不检查这是否更快,因为我在您提供的代码中没有看到任何嵌套的 for 循环。使用您的示例(我认为由于“T 中 2 的 k 最近邻居是 1.9, 2.1”这一行,我认为它的倒数邻居是错误的。 - 其中 2.1 不在集合中,如果您的意思是 1.1,则 (2, 1.1) 也是互惠邻居。
import numpy as np
import itertools
# set k and make the example set
k = 2
s1 = [0, 1, 2]
s2 = [.1, 1.1, 1.9]
#create the distance matrix
newarray = [ [ abs(s2j-s1i) for s2j in s2] for s1i in s1]
distmat = np.array( newarray )
#get the nearest neighbors for each set
neighbors_si = np.argsort( distmat )
neighbors_sj = np.argsort( distmat.T )
#map element of each set to k nearest neighbors
neighbors_si = { i: neighbors_si[i][0:k] for i in range(len(neighbors_si)) }
neighbors_sj = { j: neighbors_sj[j][0:k] for j in range(len(neighbors_sj)) }
#for each combination of i and j determine if they are in each others neighbor list
for i, j in itertools.product( neighbors_si.keys(), neighbors_sj.keys() ):
if j in neighbors_si[i] and i in neighbors_sj[j]:
print( '{} and {} are {}-reciprocals'.format( s1[i], s2[j], k ))
关于python - 获取 k 倒数最近邻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56523543/
我是一名优秀的程序员,十分优秀!