K 近邻法 小结

一、原理概述:

K 近邻法(KNN)是一中基本的分类与回归方法。其原理:假设给定一个训练数据集,其中各个数据的类别已知,当给定一个未知类别的数据 x 时候,可以得到训练数据集中 “ 距离 ” x 最近的K 个数据的类别,再根据这K个数据的类别,来决定 x 的最终类别。简单的讲就是:你周围的人是什么样子,我们就认为你是什么样子。

二、模型基本要素

基本要素分三个,分别为:K 值的选择;距离的度量;决策规则的选择

1、K 值:也就是选择多少个数据来影响最终结果。k 值对结果影响重大,
如果 K 值较小,则只有与输入实例较近(相似)的数据才会影响结果,那么近似误差小,但是估计误差大,结果对邻近点非常
敏感,容易发生过拟合。
如果 K 值较大,则可以减少学习的估计误差,但是缺点是学习的近似误差会增大,模型简单。

所以在应用中,一般取比较小的值,然后通过交叉验证法来选取最优K 值

2、距离的度量:两个点相似度的测量标准
特征空间一般是n维实数向量。使用的距离是欧氏距离(两点之间的最短距离),也可以使用其他距离

这里写图片描述

3、决策规则的选择
使用最多的往往是多数表决,即K个邻近训练示例多数类决定输入示例的类,这里注意,表决意味着每一个邻近数据的权重一样,这会影响准确度,理想的情况应该是根据距离,进行加权,距离越近权重越高。

三、算法优缺点

优点:
原理简单,易于理解,易于实现,无需估计参数,无需训练,特别适合于多分类问题

缺点:
1.懒惰算法,对测试样本分类地的系统开销大,因为要扫描全部训练样本并计算距离。
2. K的不同取值会造成样本的不同分类,因此需要验证不同K值
3. 样本分类结果受噪声 或者不相关特征的影响较大
4. 总的来说 K值越大,噪声的影响越小,但是会让分类边界变的不明确

sklearn 中KNN 的简单实现

# KNN  的简单实现
# 导入相关模块
import numpy as np
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier

#导入使用的数据
iris = datasets.load_iris()
iris_x = iris.data
iris_y = iris.target
np.unique(iris_y)            #array([0,1,2])一共三种

np.random.seed(0)
indices = np.random.permutation(len(iris_x))
len(iris_x)
#使用最后十个数据作为最终的验证数据集  其他的作为训练集
iris_x_train = iris_x[indices[:-10]]
iris_y_train = iris_y[indices[:-10]]
iris_x_test = iris_x[indices[-10:]]
iris_y_test = iris_y[indices[-10:]] 


#创建分类器
knn = KNeighborsClassifier(weights = 'distance')
knn.fit(iris_x_train,iris_y_train)

knn.predict(iris_x_test)     #预测的结果
【out】:array([1, 2, 1, 0, 0, 0, 2, 1, 2, 0])

print(iris_y_test)           #实际结果
【out】:[1 1 1 0 0 0 2 1 2 0]


可以看到最终的结果只有一个不同,说明分类器的准确度还是相当高的,
其实在运算过程中,根据随机取的训练集的不同,最终的结果有时候是
全部预测正确的
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值