Pythonでデータ間の距離を計算したい(_distancesとNearestNeighbors)

データ間の距離を取得したり、それによって似たデータが必要な場合、目的によって単純に距離を計算したい場合と、どのデータが近いかを簡単に取得したい場合があります。

データない、データ間の距離を計算する

sklearnのXX_distanceで距離の計算が簡単にできます。
今回はひとまず簡単なユークリッド距離を使います。

from sklearn.metrics.pairwise import euclidean_distances
#cosine_similarityなども

#与えたデータの距離マトリックス
euclidean_distances(iris.data[:3])

#または二つのデータの各距離
euclidean_distances(
    iris.data[:3],
    [iris.data[4]]
)

#array([[0.14142136],
#       [0.60827625],
#       [0.50990195]])

なおスパースマトリックスもそのまま渡せるようです。

NearestNeighborsでインデックスをとる

ただし、上記の方法では、距離の近いデータ群をそのまま、抜き取るのに手間がかかります。
そんなときはNearestNeighborsを用いた方が簡単です。

#距離の種類やデフォルトで取得するデータ数をモデルに渡す
nn = NearestNeighbors(
    metric="euclidean",
    n_neighbors=3
)
#距離が近いものを抜き出したい群をfit
nn.fit(iris.data[:3])

#比較したいデータをkneighborsに渡す
nn.kneighbors(
    [iris.data[4]],
    n_neighbors=3,
    return_distance=True
)

#一つ目に距離、二つ目にインデックスが近い順に帰ってくる
#array([[0.14142136, 0.50990195, 0.60827625]]), 
#array([[0, 2, 1]]))

このとき、距離はいらなくインデックスだけ欲しい時は、return_distance=Falseにします。