KNN算法
KNN算法是一个用于对数据样本进行分类预测的算法
KNN算法就是根据样本之间的距离,来对新的样本来进行分类
计算过程:将新的样本点,与历史样本点中的每一个样本点进行距离的计算 取前k个距离最近的样本点的分类结果 取分类结果频次最好的二分类项作为新样本的分类。
网络搜索:手动指定不同参数的检索范围,通过网络搜索来寻找最优的超参数或者模型参数
K就表示要取离新样本最近的K个样本进行分类决策
通常我们只提供已有数据的 90 %作为训练样本来训练分类器 ,而使用其余的 10% 数据去测试分类器(测试数据占总数据比例不同也会影响到算法的测试结果),且数据划分是随机的
机械学习中的两种类型参数
超参数:
在训练之前,需要设置的参数
k值
距离权重
P值
对于寻找最优超参数的过程,称之为网络搜索
模型参数
通过样本训练处的参数
数据归一化:将所有数据的量纲映射到同一尺度下。
1.最值归一化:把所有数据映射到0~1上(数据边界确定,例如学生分数,最低0,最高1)
2.均值方差归一化:把数据归一到均值为0,方差为1的分布中(数据分布没有明确边界,有可能存在极端数据值)
优点:
简单,易于理解,易于实现,无需参数估计,无需训练;
对异常值不敏感(个别噪音数据对结果的影响不是很大);
适合对稀有事件进行分类;
适合于多分类问题(multi-modal,对象具有多个类别标签),KNN要比SVM表现要好;
缺点:
对测试样本分类时的计算量大,内存开销大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本;
可解释性差,无法告诉你哪个变量更重要,无法给出决策树那样的规则;
K值的选择:最大的缺点是当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进;
KNN是一种消极学习方法、懒惰算法。
KNN算法是一个用于对数据样本进行分类预测的算法
#KNN算法
import numpy as np
import matplotlib.pyplot as plt
a_x = [np.random.random() * 10 for i in range(10)]
a_y = [np.random.random() * 10 for i in range(10)]
b_x = [np.random.random() * 10 for i in range(10)]
b_y = [np.random.random() * 10 for i in range(10)]
plt.scatter(a_x,a_y,color = 'r' , marker='+')
plt.scatter(b_x,b_y,color = 'b' , marker='o')
plt.show()
#新增样本
new_data = [np.random.random() * 10 for i in range(10)]
plt.scatter(a_x,a_y,color = 'r' , marker='+')
plt.scatter(b_x,b_y,color = 'b' , marker='