预测()期间的Python KNN权重



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

本质上,我们设置了一个树莓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)

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

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

标签设置如下:

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

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

结果不太好,它在弄清楚它在哪里方面做得相对较差

我想知道是否有一种方法可以对knn.predict()的函数进行加权,这样最近位置的邻居的权重会更大,圆周率不会移动到地板的另一边而不与其他点相交。

任何帮助都将不胜感激!

这有点麻烦,但您可以使用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]

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

相关内容

  • 没有找到相关文章

最新更新