前提・実現したいこと
pythonで最近傍法を行いたいのですが、自分が考える方法では正解座標と予測座標をうまく1対1対応させることができません。
該当のソースコード
まず予測座標配列をループし、その中で正解座標配列をさらにループします。
そして、閾値以内の正解座標とその距離をを新しい配列に追加し、距離で昇順ソートします。
最後に上の配列に要素がひとつでもあれば距離が最も近い配列の1番目の要素をまた新しい配列に追加します。
python
1 2truth = [[130,30], [130,35], [140,35], [150,40]] 3pred = [[130,29], [130,32], [140,36]] 4 5neighbors = [] 6for y in pred: 7 distance = [] 8 for x in truth: 9 dist = mes_distance(y, x) 10 if dist <= 3: 11 distance.append([x, dist]) 12 distance.sort(key=itemgetter(1)) 13 print(distance) 14 if len(distance) > 0: 15 neighbors.append(distance[0][0])
距離計算、いま即席で作ったため、間違えていたらすみません。
とりあえず、動くはずです。。
python
1def mes_distance(p1, p2): 2 p_x = (p1[0]-p2[0])**2 3 p_y = (p1[1]-p2[1])**2 4 dis = np.sqrt(p_x+p_y) 5 return dis
ここまでが自分でできた範囲なのですが、
おそらく、この書き方ではすでに選択された正解座標をtruthから削除しない限り、正解座標と予測座標で1対1対応しないと思われます。
output
1# 上のコードの出力 2''' 3distance 4[[[130, 30], 1.0]] 5[[[130, 30], 2.0], [[130, 35], 3.0]] 6[[[140, 35], 1.0]] 7 8neighbors(予測に対する正解が重複:1番目と2番目) 9[[130, 30], [130, 30], [140, 35]] 10''' 11 12# 理想の出力 13''' 14distance 15[[[130, 30], 1.0]] 16[[[130, 30], 2.0], [[130, 35], 3.0]] 17[[[140, 35], 1.0]] 18 19neighbors(2番目が変わってほしい) 20[[130, 30], [130, 35], [140, 35]] 21'''
試したこと
- .remove()で一度選択された正解座標をtruthから削除しようとしましたが、pythonの仕様上それはできませんでした。
1対1対応というと少し語弊があるかもしれません(予測と正解の数が一致しているわけではないため)。
要するに、ある予測座標1点に対して一意な正解座標1点を閾値以内であれば取得したいです。
ご教授よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー