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