【问题标题】:confused with the output of sklearn.neighbors.NearestNeighbors与 sklearn.neighbors.NearestNeighbors 的输出混淆
【发布时间】:2020-04-05 17:41:30
【问题描述】:

这里是代码。

from sklearn.neighbors import NearestNeighbors
import numpy as np
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(X)
distances, indices = nbrs.kneighbors(X)


>indices

>array([[0, 1],[1, 0],[2, 1],[3, 4],[4, 3],[5, 4]])

>distances

>array([[0.        , 1.        ],[0.        , 1.        ],[0.        , 1.41421356], [0.        , 1.        ],[0.        , 1.        ],[0.        , 1.41421356]])

我不太了解“指数”和“距离”的形状。我如何理解这些数字的含义?

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    其实很简单。对于kneighbors()(此处为X)输入中的每个数据样本,它将显示 2 个邻居。 (因为您已指定 n_neighbors=2indices 将为您提供训练数据的索引(此处再次为 X),distances 将为您提供训练数据中相应数据点的距离(索引到指的是)。

    以单个数据点为例。假设X[0]作为第一个查询点,答案将是indices[0]distances[0]

    所以对于X[0]

    • 训练数据中第一近邻的索引为indices[0, 0] = 0,距离为distances[0, 0] = 0。您可以使用此索引值从训练数据中获取实际数据样本。

      这是有道理的,因为你使用相同的数据进行训练和测试,所以每个点的第一个最近邻是它自己,距离是0

    • 第二近邻的索引是indices[0, 1] = 1,距离是distances[0, 1] = 1

    对于所有其他点也是如此。 indicesdistances 中的第一个维度对应于查询点,第二个维度对应于询问的邻居数。

    【讨论】:

      【解决方案2】:

      也许一个小草图会有所帮助

      例如,与索引为0 的训练样本最近的点是1,由于您使用的是n_neighbors = 2(两个邻居),因此您希望在结果中看到这对。实际上,您会看到 [0, 1] 对出现在输出中。

      【讨论】:

        【解决方案3】:

        我将对上述内容发表评论,即如何在 pandas 数据框中使用索引数组获取 "n_neighbors=2" 邻居。所以,

        import pandas as pd
        
        df = pd.DataFrame([X.iloc[indices[row,col]] for row in range(indices.shape[0]) for col in range(indices.shape[1])])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多