我在类中使用KNN算法(指示使用此算法,可能不是您对应用程序的期望,请参阅下文)
基本上,我们设置了raspberry 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不会移动到地板的另一侧没有穿过其他点。
任何帮助将不胜感激!
答案 0 :(得分:0)
有点hacky,但您可以使用weights
中的KNeighborsClassifier
参数执行此操作。如果您将时间添加为额外功能,然后编写自定义距离功能,则可以使用时间对样本之间的距离进行加权。这里显示了一个非常简单的例子:
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]
这也是我期望看到的。所以看起来并不太痛苦。我建议花点时间考虑如何设置距离函数,因为这会影响结果。