我试图在python中运行最近邻居排序。我有一个充满点的dataFrame,例如:
x y
1 10 10.0
2 26 11.0
3 27 20.0
4 36 19.0
...
高达1000分。我试图通过与dataFrame中任何未使用的点的最短距离对这些点进行排序。我目前用于执行此操作的代码如下所示。
for j in range(0, len(data)-2):
minDist = 1000000
k = j+1
for i in range(k, len(data)-1):
#dist1 = distance.euclidean(j, i+1)
dist2 = distance.euclidean(j, i)
if(dist2<minDist):
minDist = dist2
print(minDist)
minI = data.iloc[i]
b, c = data.iloc[j+1].copy(), data.iloc[i].copy()
data.iloc[j+1],data.iloc[i] = c, b
但是,当我运行此代码时,我的输出数据文件只移动一个数据点,并且它不是正确的数据点,如下所示:
x y
1 10.0 10.0
2 624.0 436.0
3 26.0 11.0
4 27.0 20.0
我认为嵌套for循环存在一些问题,但我不确定。我的for循环有任何错误吗?或者这只是我在Python中如何解决问题的一个问题?
答案 0 :(得分:0)
如果你试图嵌套for循环,那么你做错了,因为第一个for循环使用的缩进是不正确的。要嵌套它们,你必须做这样的事情:
for j in range(0, len(data)-2):
minDist = 1000000
k = j+1
for i in range(k, len(data)-1):
#dist1 = distance.euclidean(j, i+1)
dist2 = distance.euclidean(j, i)
if(dist2<minDist):
minDist = dist2
print(minDist)
minI = data.iloc[i]
b, c = data.iloc[j+1].copy(), data.iloc[i].copy()
data.iloc[j+1],data.iloc[i] = c, b
答案 1 :(得分:0)
解决问题的方法:
第二个循环没有针对第一个循环进行迭代,因此添加了“k = j + 1”行。
还添加了minDist = 10000000,以确保第一次比较正确并且没有跳过初始点。
for j in range(0, len(data)-1):
minDist = 1000000
k = j+1
for i in range(k, len(data)):
#dist1 = distance.euclidean(j, i+1)
dist2 = distance.euclidean(data.iloc[j], data.iloc[i])
if(dist2<minDist):
minDist = dist2
#print(minDist)
minI = i
b, c = data.iloc[j+1].copy(), data.iloc[minI].copy()
data.iloc[j+1],data.iloc[minI] = c, b