如何在Sklearn近邻中排除点本身



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

A1 A2 ... A40
0         xx xx ... xx
1         xx xx ... xx
2         xx xx ... xx
...       ...
399,999   xx xx ... xx

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

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

然后,我使用最近邻居来计算每个点的前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
)

元组的第一项是距离数组,第二项是前6个最近点的索引数组。每个项目中都有6个元素,因为我最初认为,通过删除第一列(点本身(,剩下的5列就是结果。

如您所见,对于情况a情形b实例e案例f来说,这是可以的,它们的第一个元素是点iteself,对应的距离是0。

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

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

那么,如何删除前6个最近点中的点本身呢?如果所有情况都像情况a情形b案例e病例f那样,我可以简单地删除前6个最近点的索引数组的第一列。但目前的问题是,它出现在一个随机的位置,有时甚至没有出现。有什么想法吗?

正如我从元组的第二个列表中看到的,示例的排序顺序与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]

最新更新