如何在 Sklearn NearestNeighbors 中排除点本身?

Zha*_*ang 5 python numpy nearest-neighbor pandas scikit-learn

我有40万个客户数据,每个客户有40个属性。DataFame 看起来像:

          A1 A2 ... A40
0         xx xx ... xx
1         xx xx ... xx
2         xx xx ... xx
...       ...
399,999   xx xx ... xx
Run Code Online (Sandbox Code Playgroud)

我首先通过 sklearn 的 StandardScaler 对这些数据进行标准化。现在我们得到处理后的数据X_data。

所以现在我们有 400,000 个客户(点/向量),每个客户有 40 个维度。

然后我使用 NearestNeighbors 来计算前 5 个最近点。到目前为止,一切都很好。

但结果有一点问题。

结果包含点本身,并且它出现在随机位置,并不总是第一个。

结果如下:

(
 [[0,0.04,0.06,0.09,0.1,0.12],        ---case a
  [0,0.01,0.05,0.07,0.08,0.09],       ---case b
  [0,0,0,0.04,0.05,0.06,0.08],        ---case c
  ...
  [0,0,0,0,0,0],                      ---case d
  [0,0.06,0.07,0.09,0.1,0.12],        ---case e
  [0,0.01,0.03,0.05,0.07,0.,8]],      ---case f

 [[0,2143,14134,54253,242425,3423],   ---case a
  [1,43242,132,34324,31234,44355],    ---case b
  [343245,32113,2,32435,23451,54131]  ---case c
  ...
  [231413,21597,74958,7923,13988,98137],  ---case d
  [399998,13145,54361,48831,94813,41873], ---case e
  [399999,88213,43431,31414,42313,87481]] ---case f
)
Run Code Online (Sandbox Code Playgroud)

元组的第一项是距离数组,第二项是前 6 个最近点的索引数组。每一项有6个元素,因为我原本以为去掉第一列(点本身),剩下的5个列就是结果。

如您所见,对于情况 a、情况 b、情况 e和情况 f,是可以的,它们的第一个元素是点本身,对应的距离是 0。

但对于情况 c,因为有 3 个距离为 0 的点,所以索引为2不会出现在第一个位置,而是出现在第三个位置。

而对于情况 d,由于距离 0 的点太多,索引399997甚至没有显示在前6 个中最近的点中。

那么如何删除前 6 个最近点中的点本身呢?如果所有情况都类似于情况 a、情况 b、情况 e和情况 f ,我可以简单地删除前 6 个最近点的索引数组的第一列。但目前的问题是,它出现的位置是随机的,有时甚至不出现。有任何想法吗?

Ale*_*iuk 0

正如我从元组的第二个列表中看到的,示例的排序顺序与 DataFrame 中的原始顺序相同。因此,对于第二个列表,需要从每个示例中删除等于列表中示例索引的元素。对于第一个列表,需要删除索引等于元素索引的元素。

for idx_example, example in enumerate(tuple_with_items[1]):
    try: 
        idx_element = example.index(idx_example)
    except ValueError:
        idx_element = 0
    del example[idx_element]
    del tuple_with_items[0][idx_example][idx_element]
Run Code Online (Sandbox Code Playgroud)