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