首页 文章

在.predict()期间Python KNN加权?

提问于
浏览
1

我正在为一个类使用KNN算法(指示使用这个算法,可能不是你期望的应用程序,见下文)

基本上,我们设置了覆盆子pi来收集6个本地WIFI路由器Mac地址的信号强度 . 在我们建筑物楼层的不同位置,我们在.csv文件中记录了这些信号强度 .

使用python我创建了一个使用此页面上的函数的脚本 . http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html

我适合如下:

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1, algorithm = 'auto')
knn.fit(strengths, labels)

其中strength是一个嵌套数组,如下所示:

[[Loc1strengths],[Loc2strengths],[Loc3strengths],[Loc4strengths],[Loc5strengths],[Loc6strengths]]

标签设置如下:

[Loc1, Loc2, Loc3, Loc4, Loc5, Loc6]

稍后在脚本中,我收集了6个本地WIFI路由器Mac地址的信号强度,并尝试使用knn.predict()预测我的pi的位置,并希望获得pi的位置,例如Location1 .

结果不是很好,它确定它的位置相对较差 .

我想知道是否有办法对knn.predict()的功能进行加权,以便最近位置的邻居权重更大,pi不会移动到地板的另一侧而不会越过其他点 .

任何帮助,将不胜感激!

1 回答

  • 0

    它有点hacky,但您可以使用 KNeighborsClassifier 中的 weights 参数执行此操作 . 如果您将时间添加为额外功能,然后编写自定义距离功能,则可以使用时间对样本之间的距离进行加权 . 这里显示了一个非常简单的示例

    def time_weight(x1, x2):
        # I've added my time variable at the end of my features        
        time_diff = np.linalg.norm(x1[-1] - x2[-1])
        feature_diff = np.linalg.norm(x1[:-1]-x2[:-1])
        return time_diff*feature_diff
    

    一些虚拟数据

    X = np.array([[0, 1], [0, 0.5]])
    time = np.array([0, 5]).reshape(-1, 1)
    y = np.array([0, 1])
    X_with_time = np.hstack((X, time))
    

    测试我们的加权距离是否有意义:

    print(time_weight(np.array([0, 1, 0]), np.array([0, 0.75, 2])))
    print(time_weight(np.array([0, 1, 0]), np.array([0, 0.75, 3])))
    print(time_weight(np.array([0, 0.5, 5]), np.array([0, 0.75, 2])))
    print(time_weight(np.array([0, 0.5, 5]), np.array([0, 0.75, 3])))
    

    Output:

    0.5
    0.75
    0.75
    0.5
    

    这就是我期望看到的,如果某个东西的时间距离是原来的两倍,它就是距离的两倍 . 所以现在检查它是否适用于 KNeighborsClassifier

    X_with_time = np.hstack((X, time))
    knn = KNeighborsClassifier(metric=time_weight, n_neighbors=1)
    knn.fit(X_with_time, y)
    print(knn.predict([[0, 0.75, 2]]))
    print(knn.predict([[0, 0.75, 3]]))
    

    Output:

    [0]
    [1]
    

    这也是我期望看到的 . 所以看起来并不太痛苦 . 我建议花点时间考虑如何设置距离函数,因为这会影响结果 .

相关问题