我与机器学习 - [Today is Knn] - [K-近邻算法]

优点:精度高,对异常值不敏感,无数据输入假定

缺点:计算复杂度高,空间复杂度高

适用数据范围:数值型和标称型

k近邻,也就是KNN算法,他的工作原理是:一个有监督的学习,有一个带有标签的训练集,训练,当我们输入没有标签的的新数据后,将新数据的每个特征与训练集中的每个特征比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签,一般来说只选择样本数据集中,最相似的前K个数据,这就是K的由来,通常不大于20,最后选择k个最相似数据中出现次数最多的分类,作为新数据的分类

伪代码:

对未知类别属性的数据集中的每个点依次之行以下操作:

1. 计算已知类别数据集中的点与当前点的距离

2. 按照距离递增次序排序

3. 选取与当前点距离最小的K个点

4. 确定前K个点所在类别的出现频率

5. 返回前K个点中出现频率最高的的类别作为当前点的预测分类

核心算法思路:

1. 首先确定样本数据的数量,shape(0)

2. 测试数据要确保特征数量和样本数据一致,使用np.tile(array, (a,b))(将array 复制b次后 再复制a行)  将测试数据复制到和样本数据数量相同,行数相同。

3. 将测试数据与样本数据做差,计算测试数据与每个样本之间的差值,获得一个差值矩阵

4. 对差值矩阵运用距离计算公式 对axis = 1 上的元素计算平方和并开方,获得一个距离的列向量

5.对这个列向量进行排序

6.执行for循环,循环K次,记录每个类别出现的次数,并使用字典记录类别对应的出现次数{A:5}

7.for循环结束后,对上一步得到的字典进行排序得到次数出现最多的那个类别返回

用的一些技术:

1. 归一化数值,当某些特征数值较大而某些特征数值较小时,计算距离的时候较大的数值将会产生较大的影响,这是我们不愿意看到的,所以引入了归一化数值,这里用到了将数值取值范围固定在[0, 1]或者[-1, -1],下面的公式可以将值转化为0到1区间:newvalue = (oldvalue - min) / (max - min)

k-近邻算法必须保存全部数据,每次预测需要加载全部数据,这中情况下,如果训练集非常大,必须使用大量的存储空间,此外由于必须对数据集中的每个数据计算距离的值,因此实际使用是可能非常耗时。

k-近邻算法 的另一个缺陷是他无法给出任何数据的基础结构信息,因此我们也无法知晓平均实例样本和典型实例样本具有什么特征。

代码:

https://github.com/HanGaaaaa/MLAProject/tree/master/Knn

猜你喜欢

转载自blog.csdn.net/weixin_43409627/article/details/84745738