机器学习小白日记:KNN

``一.算法思想
KNN的思路非常简单,一个未知标签的样本通过计算其周围N个有标签样本中,属于哪类样本的个数对此样本进行分类,简而言之“物以类聚,人以群分”

二.算法优缺点
优点:对异常值不敏感(就好比你找离他最近的K=99个样本,异常值起不到决定性因素,实际上K一般不大于20且二分类中通常为奇数)
缺点:计算复杂度高,你需要算待分类样本与每一个带标签样本的距离找出距离最小的N个点,恐怖
下面这张图可以很清楚的了解KNN这张图很直观

三.算法步骤:(1)计算已知类别的点与当前点的之间的距离(大多用欧式距离,就是两点之间距离公式,第一次听的时候还以为多流批。。其他还有曼哈顿距离,LP距离有兴趣可以自己查一下),马氏距离说是可以消除样本之间的相关性,就好像身高与体重之间具有很高的相关性。

参考https://blog.csdn.net/hustqb/article/details/90290232
(2)选取距离最近的前K个点(对应KNN中的K)
(3)统计一哈K个点中属于每个类别的个数,决定最终结果(比如,选了13个·点,属于红色一类的点有3个,绿色有2个,蓝色有8个,这个未知的点就被归为蓝色一类)

四.注意事项
需要注意的是关于K值的选择:
(1)K值较小会导致近似误差(对现有训练集的训练误差)减小,估计误差(对测试集的测试误差)增大,同时容易发生过拟合(泛化能力特别差),对噪声的敏感度上升。
(2)K值较大,则与上面正好相反,想象一下,如果你K值取得非常非常大,那任一个待分类样本都会被归为一类!!

五.补充
补充一下李航老师讲的马氏距离的内容:
***四个样本,算其中两个的距离***
上面是四个样本,每个样本是二维的,通过马氏距离计算两个样本点之间的距离。


补充一下KD树(我看很多博客上没有专门讲这个数据结构,对我这种非计算机出身的不太友好啊)
参考https://www.cnblogs.com/Deribs4/p/4946323.html(侵权必删)
大概就是把数据进行划分,便于范围搜索和最近邻搜索,链接里面讲得很清楚

也是讲KNN,讲得很好
https://www.cnblogs.com/lmcltj/p/11010211.html

如何做好数据可视化https://blog.csdn.net/lglfa/article/details/80705696
在这里插入图片描述

代码展示:别人写得很清楚https://blog.csdn.net/qq_41689620/article/details/82421323

大概照着敲了敲

在这里插入代码片
```import  sklearn  as sk
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
iris=load_iris()
#print(iris)
print(iris.data.shape)
iris.target.shape
#iris_all=np.hstack((iris.data,iris.target))
#print(iris_all)
iris_all=np.c_[iris.data,iris.target]#标签和特征合在一个矩阵里
iris_frame=pd.DataFrame(iris_all)#转化为DataFrame格式能更好的观察数据,之前是numpy格式的

iris_frame.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class']
iris_frame.describe()
import matplotlib.pyplot as plt
import seaborn as sb
sb.pairplot(iris_frame, hue='class')#数据可视化,可以看出在每个特征与label的关系
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=1/5, random_state=0)##划分训练集和测试集
from sklearn.neighbors import KNeighborsClassifier #引入现成的KNN函数
knn = KNeighborsClassifier()
knn.fit(x_train, y_train)  
y_pred = knn.predict(x_test)   # 预测
print(knn.score(x_test, y_test))   # 评分,返回正确分类的比例





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值