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 个最近点的索引数组的第一列。但目前的问题是,它出现的位置是随机的,有时甚至不出现。有任何想法吗?
正如我从元组的第二个列表中看到的,示例的排序顺序与 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)
| 归档时间: |
|
| 查看次数: |
966 次 |
| 最近记录: |