首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python在.predict()期间的加权?

Python在.predict()期间的加权?
EN

Stack Overflow用户
提问于 2017-11-07 02:33:14
回答 1查看 1.6K关注 0票数 1

我正在为一个类使用KNN算法(指示使用此算法,可能不像您所期望的那样,见下面)

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

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

我安装了knn如下:

代码语言:javascript
复制
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1, algorithm = 'auto')
knn.fit(strengths, labels)

其中的优势是这样的嵌套数组:

代码语言:javascript
复制
[[Loc1strengths],[Loc2strengths],[Loc3strengths],[Loc4strengths],[Loc5strengths],[Loc6strengths]]

标签设置如下:

代码语言:javascript
复制
[Loc1, Loc2, Loc3, Loc4, Loc5, Loc6]

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

结果不是很好,它在找出它在哪里方面做得比较差。

我想知道是否有一种方法来加权knn.predict()的函数,以便最近位置的邻居加权得更重,如果不跨越其他点,圆周率就不会移动到地板的另一边。

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-07 17:42:56

这有点麻烦,但是您可以使用weights参数在KNeighborsClassifier中完成这个任务。如果将时间添加为额外功能,然后编写自定义距离函数,则可以使用时间来衡量样本之间的距离。下面是一个非常简单的例子:

代码语言:javascript
复制
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

一些虚拟数据

代码语言:javascript
复制
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))

测试我们的加权距离是否有意义:

代码语言:javascript
复制
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])))

输出:

代码语言:javascript
复制
0.5
0.75
0.75
0.5

这就是我所期望看到的,如果某物的距离是时间的两倍,那就是距离的两倍。所以现在检查它是否适用于KNeighborsClassifier

代码语言:javascript
复制
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]]))

输出:

代码语言:javascript
复制
[0]
[1]

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47149085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档