如何根据K近邻计算平均值?

问题描述 投票:0回答:1

我想编写一个函数来根据 K 个最近邻(在本例中 K=2)计算平均“z”值。我有索引,但有人可以帮我编写一个函数来计算所有邻居的平均 z 值吗?

这是我到目前为止所拥有的:

from sklearn.neighbors import NearestNeighbors

X = array([[6,-3, 0.1], [-5,-9, 0.5], [3,-7, 0.8], [-10,6, 0.5], [-4,-16, 0.9], [1,-0.5, 0]])
# X is an array containing x,y,z values
# nbrs reads in the x,y values only

nbrs = NearestNeighbors(n_neighbors=2).fit(X)
distances, indices = nbrs.kneighbors(X)

print(indices)
# psuedocode below
[[0, index for neighbor1, index for neighbor2]
 [1, index for neighbor1, index for neighbor2]
 [2, index for neighbor1, index for neighbor2]
 [3, index for neighbor1, index for neighbor2]
......
# etc. for all 6 points in X
] 

现在我有了索引,我想计算所有邻居的平均 z 值?我知道这里只有 2 个,所以很容易平均,但如果我们将其更改为 50 个邻居,有人可以帮助我扩大规模吗?

python scikit-learn average nearest-neighbor
1个回答
0
投票

要找到 X 中每个点的邻居的平均

z
值,你可以这样做:

all_z_pairs = [[X[index][2] for index in row] for row in indices]
mean_values = [sum(z_pair)/len(z_pair) for z_pair in all_z_pairs]

X[index]
代表每个邻居,
X[index][2]
是邻居的 z 值。因此 all_z_pairs 是每个点的每个邻居的所有 z 值。

sum(z_pair)/len(z_pair)
求平均值。您也可以这样做以使其更具可读性:

from statistics import mean

...
mean_values = [mean(z_pair) for z_pair in all_z_pairs]

如果更容易理解,您可以将 all_z_pairs 计算重写如下。

for row in indices:
   for index in row:
      all_z_pairs.append(X[index][2])

索引列表对于 X 中的每个点都有一行。一行基本上是该点的所有邻居。因此,第一个列表在所有邻居集合上循环,第二个列表在每个邻居集合上循环。

© www.soinside.com 2019 - 2024. All rights reserved.