zzl_Kevin 2024-02-22 11:33 采纳率: 100%
浏览 6
已结题

k近邻算法疑问,分类错误,为什么与计算有差


from sklearn.neighbors import KNeighborsClassifier

# 样本数据
X = [[1, 6], [1, 2], [3, 5], [3, 6],[5, 2], [6, 5], [7, 7], [7, 1], [8, 3]]  # 每个样本有两个特征

# 标签
y = ['Left', 'Left', 'middle','middle', 'middle', 'top right', 'top right', 'bottom right', 'bottom right']  # 每个样本对应的标签

# 创建并训练K最近邻模型
estimator = KNeighborsClassifier(n_neighbors=3)
estimator.fit(X, y)

# 使用模型进行预测
ret = estimator.predict([[4, 1]])

print(ret)

输出是 ['Left']

img

如图所示,应该是离middle更近呀,为什么是left,随后问了一下文心一言,他算出来的也是middle:

img


文心一言的三个最小的说错了,最近的三个是[5, 2](距离=(\sqrt{2})),[7,1] (距离=(3))和 [1, 2](距离=(\sqrt{10}))
这三个的标签分别是 middle、bottom right、Left , 那么按照多个不同的标签,随机取一个的说法应该是随机的,但是运行很多次都是left。为什么呢
而且为啥不是取三个中最近的middle
求大家指点,哪里有问题

  • 写回答

3条回答 默认 最新

  • GISer Liu 2024-02-22 15:10
    关注

    该回答引用自GPT-3.5,由博主GIS_Liu编写:

    问题出在 K 最近邻算法中的距离度量方式。在默认情况下,sklearn 中的 KNeighborsClassifier 使用的是欧式距离来计算样本之间的距离。而在欧式距离下,样本 (4, 1) 更接近于左上角的点 [1, 2] 而不是中间的点 [3, 5]。

    如果要根据你的直觉判断最近的点,可以使用曼哈顿距离(Manhattan Distance)来替代欧式距离,因为曼哈顿距离更符合你的直觉。你可以在创建 KNeighborsClassifier 时指定参数 metric='manhattan',这样就会使用曼哈顿距离进行距离度量,代码如下:

    from sklearn.neighbors import KNeighborsClassifier
    
    # 样本数据
    X = [[1, 6], [1, 2], [3, 5], [3, 6],[5, 2], [6, 5], [7, 7], [7, 1], [8, 3]]
    # 每个样本有两个特征
    
    # 标签
    y = ['Left', 'Left', 'middle','middle', 'middle', 'top right', 'top right', 'bottom right', 'bottom right']
    # 每个样本对应的标签
    
    # 创建并训练K最近邻模型
    estimator = KNeighborsClassifier(n_neighbors=3, metric='manhattan')
    estimator.fit(X, y)
    
    # 使用模型进行预测
    ret = estimator.predict([[4, 1]])
    print(ret)
    

    这样应该可以得到更符合你直觉的结果。

    img

    如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月28日
  • 已采纳回答 3月20日
  • 修改了问题 2月23日
  • 创建了问题 2月22日

悬赏问题

  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?
  • ¥15 QQ邮箱过期怎么恢复?
  • ¥15 登录他人的vue项目显示服务器错误
  • ¥15 (标签-android|关键词-app)
  • ¥15 comsol仿真压阻传感器