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

Python KNN weighting during .predict()?

我正在为 class 使用 KNN 算法(指示使用此算法,可能不是您期望的应用程序,请参见下文)

本质上,我们设置了一个 raspberry pi 来收集 6 个本地 WIFI 路由器 Mac 地址的信号强度。在我们大楼的不同位置,我们在 .csv 文件中记录了这些信号强度。

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

我适合以下 knn:

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

其中 strengths 是这样的嵌套数组:

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

标签设置如下:

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

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

结果不是很好,它在确定位置方面做得相对较差。

想知道有没有办法对knn.predict()的函数进行加权,使得最近位置的邻居权重更大,pi不会移动到另一边地板没有穿过其他点。

如有任何帮助,我们将不胜感激!

这有点老套,但您可以使用 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])))

输出:

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]]))

输出:

[0]
[1]

这又是我期望看到的。所以看起来做起来并不太痛苦。我建议您花一些时间考虑如何设置距离函数,因为这确实会影响结果。