使用KNN与数据帧进行比较

时间:2017-01-10 15:00:16

标签: python knn

我有以下两个数据集:

import pandas as pd
from scipy.spatial import distance

all = {'test' : [0.3, 0.9],
 'call' : [0.2, 1.3],
 'category': ["A", "B"]}

all = pd.DataFrame(all)

df = pd.DataFrame()
df = df.append({'test': 0.2, 'call': 0.4}, ignore_index=True)

基于这些data.frames,我想检查哪个类别df更接近:A类或B类。

因此我做了以下事情:

制作所有data.frame数字

all_numeric = all[[ 'test', 'call']]

计算欧氏距离

euclidean_distances = all_numeric.apply(lambda row: distance.euclidean(row, df), axis=1)
distance_frame = pd.DataFrame(data={"dist": euclidean_distances, "idx": euclidean_distances.index})
distance_frame.sort("dist", inplace=True)
print(distance_frame)

接下来我想在all data.frame

中查找值
lookup_value = distance_frame.iloc[0]['idx']
question = all['category'][0]
print("This customer content is labeled as %s" % question)

但是,如果我尝试使用

df = pd.DataFrame()
df = df.append({'test': 0.9, 'call': 1.3}, ignore_index=True)

我应该打印“标记为B”,所以我假设出了问题。有人告诉我,我错了吗?

1 个答案:

答案 0 :(得分:0)

你在做:

question = all['category'][0]选择“类别”列中的第一行,而不是您选择的索引(lookup_value)。

你应该改为:

question = all['category'].loc[lookup_value]

总的来说,虽然这有效,但我鼓励你用numpy重写它。熊猫是非常强大的,但如果你发现你自己的成对记录(笛卡尔积的所有和df),那么numpy将导致更清洁和更快的解决方案。如果您需要一个例子,请告诉我,我很乐意在这里提供一个。

编辑:

当然,这是一种方式:

    import numpy as np
    from scipy.spatial import distance

    center_features = np.array([[0.3, 0.9], [0.2, 1.3]])
    center_labels = ["A", "B"]

    test_features = np.array([[0.2, 0.4], [0.9, 1.3]])

    for t in test_features:
        print t, center_labels[np.argmin([distance.euclidean(t, c) for c in center_features])]

循环[distance.euclidean(t, c) for c in center_features]计算固定示例(df)与标记矢量之间的距离。

np.argmin(x)为您提供最小元素的索引。因此,np.min([3,1,0,2])给出0但是`np.argmin([3,1,0,2])给出2,这是0的索引。