我是python的新手,我有一个包含数百个条目的数据集,并且我想查找每个点的第6个最近邻居的欧几里得距离并将其保存。
条目如下:
362.240997 242.054993
505.821014 159.210007
420.803986 134.830002
504.035004 314.125000
356.670013 199.093994
326.545990 91.766998
214.477005 63.821999
351.351013 86.885002
216.041000 242.024994
441.700012 277.333008
68.678001 203.095001
547.051025 99.218002
405.983002 141.934006
402.239990 247.876007
197.134003 260.622009
163.141006 66.302002
561.950989 172.966995
340.036987 115.315002
63.076000 78.059998
261.072998 268.122009
319.376007 65.832001
.......
我不知道从哪里开始,我试图环顾四周,但一无所知,因为这太具体了。 任何帮助表示赞赏。
非常感谢大家!
答案 0 :(得分:0)
首先,您应该从文件中读取输入并将每个点存储在列表中。请注意,您的文件可能被视为csv
文件,使用空格而不是逗号作为分隔符。有关使用Python读取csv
文件的信息,请参见the documentation。
接下来,如果没有太多的点,我建议计算任何两个点之间的Euclidean distance并将其存储在2D列表中,这样dist[i][j]
包含点之间的距离i
和j
。有了n
点,时间复杂度将为O(n²)
。您可以通过仅计算一半的距离来优化这一步骤(因为dist[i][j]
和dist[j][i]
相同)。
然后对于每个点,通过在距离列表的一列或一条线上循环(请记住,它是对称的)来找到最接近的6点,以找到最小的距离。即:对于i
的固定值,找到j
的六个值,它们产生dist[i][j]
的最小值。或者,对于j
的固定值,找到i
的六个值,它们产生dist[i][j]
的最小值。
答案 1 :(得分:0)
这是使用sklearn来实现所需目标的一种简单方法。
>>> from sklearn.neighbors import NearestNeighbors
>>> import numpy as np
>>> values = [[1, 2], [2, 3], [4.5, 2.5], [1.5, 3], [5, 2], [8, 9], [10, 10]]
>>> nbrs = NearestNeighbors(n_neighbors=6, algorithm='ball_tree', metric='euclidean').fit()
>>> distances, indices = nbrs.kneighbors(values)
>>> distances[0]
array([0. , 1.11803399, 1.41421356, 3.53553391, 4. ,
9.89949494])
distances[0]
包含从您最近的6个邻居到第一个数据点euclidean
的{{1}}距离。您只需从完整结果中提取最后一个值即可。
有关更多信息,请参阅sklearn documentation。
编辑以获取所有数据点到第六个邻居的距离:
(1, 2)
您只需要在文件中保存>>> sixth_nnd = [d[5] for d in distances]
>>> sixth_nnd
[9.899494936611665, 8.48528137423857, 7.3824115301167, 8.845903006477066, 7.615773105863909, 8.845903006477066, 11.01135777277262]
。
答案 2 :(得分:0)
这是仅使用python的另一种方法。我只是用熊猫来导入数据。因此,首先根据您的数据创建一个csv:
import pandas
# Read your csv :
df = pd.read_csv('your_file.csv')
# Consider your points as tuples in a list
data = [(float(x),float(y)) for x, y in df[['x', 'y']].values ]
nearest_points = []
for point in data:
# Compute the distance between the current point and all others
distances = [math.sqrt((point[0]-x[0] )**2+ (point[1]-x[1])**2) for x in data]
# Use np.argsort() to sort the array and keep the three closest points
nearest_points.append([data[i] for i in np.argsort(distances)[1:4]])
答案 3 :(得分:0)
您要尝试创建的业务是成对距离矩阵。
您可以使用scipy.spatial.distance.pdist
函数轻松实现这一目标,而使用scipy.spatial.distance.squareform
将使输出易于阅读。
from scipy.spatial.distance import pdist, squareform
import pandas as pd
#load the dataset in a panda DataFrame
df_dataset=pd.DataFrame(dataset)
# use the pdist() function to calculate the
# Eucledian Distance between all pairs of rows in the dataframe
# and then pass the distances to the squareform() function that prints
# out the result in a square format with rows and columns
# corresponding to the points (row indexes of the original dataset).
squareform(pdist(df_dataset),columns=df_dataset.index,index=df_dataset.index)
就是这样