我正在为一个类使用KNN算法(指示使用此算法,可能不像您所期望的那样,见下面)
本质上,我们有一个树莓皮设置收集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)其中的优势是这样的嵌套数组:
[[Loc1strengths],[Loc2strengths],[Loc3strengths],[Loc4strengths],[Loc5strengths],[Loc6strengths]]标签设置如下:
[Loc1, Loc2, Loc3, Loc4, Loc5, Loc6]在脚本的后面,我收集了6个本地WIFI路由器Mac地址的信号强度,并尝试使用knn.predict()预测我的pi的位置,并希望得到pi的位置,例如Location1。
结果不是很好,它在找出它在哪里方面做得比较差。
我想知道是否有一种方法来加权knn.predict()的函数,以便最近位置的邻居加权得更重,如果不跨越其他点,圆周率就不会移动到地板的另一边。
任何帮助都将不胜感激!
发布于 2017-11-07 17:42:56
这有点麻烦,但是您可以使用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]这也是我所期望看到的。所以看起来做起来不太痛苦。我建议您花一些时间考虑如何设置您的距离函数,因为这将真正影响结果。
https://stackoverflow.com/questions/47149085
复制相似问题