机器学习——K邻近算法

1、原理:

对于一个给定的训练集,我们知道训练样本中的每组数据特征及其分类标签。然后输入没有标签的新数据,将新数据的每个特征与训练集中的每个特征进行比较,选取特征最相似(最近邻:k=1)的分类标签,一般来说,我们只选取前 k 个最相似的分类标签,这也是 k-近邻算法中 k 的由来,通常 k 不超过 20。最后,选择 k 个数据中出现次数最多的分类标签作为新数据的分类结果。

K值的设定
K值设置过小会降低分类精度;若设置过大,且测试样本属于训练集中包含数据较少的类,则会增加噪声,降低分类效果。
通常,K值的设定采用交叉检验的方式(以K=1为基准)
经验规则:K一般低于训练样本数的平方根。

2、一般过程

收集数据:可以使用任何方法
准备数据:距离计算所需要的数值,最好是结构化的数据格式(矩阵)
分析数据:计算测试对象与训练集中所有对象的距离,可以是欧式距离、余弦距离等,比较常用的是较为简单的欧式距离。
测试算法:计算错误率

3、代码实现过程:

对未知类别属性的点依次执行以下操作:
1、计算已知类别数据集中的点与当前点之间的距离;
2、按照距离递增次序排序;
3、选取与当前点距离最小的k个点;
4、确定前k个点所在类别的出现频率;
5、返回当前k个点出现频率最高类别作为当前点的预测分类

python代码如下:
这里有4组数据,每组数据有两个我们已知的属性或者特征值。向量labels包含了每个数据点的标签信息,labels包含的元素个数等于group矩阵行数。这里将数据点(1,1.1)定义为类A,数据点(0,0.1)定义为类B。

from numpy import *
import operator

#创建数据集和标签
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
    
def classify(X,dataSet,labels,k):
    dataSetSize = dataSet.shape[0]
    diffMat = tile(X,(dataSetSize,1)) - dataSet
    temp = diffMat**2
    sqDistances = temp.sum(axis=1)
    distances = sqDistances ** 0.5 #X与数据集中每个元素的距离
    num = distances.argsort() #返回distans中数值从小到大的索引顺序
    classCount = {}
    for i in range(k):
        voteIlabel = labels[num[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1),reverse=True)
    #以k个对象的出现频率为标准从大到小排序
    return sortedClassCount[0][0]
    
print(classify([0,0],group,labels,3))

运行结果:
在这里插入图片描述

4、KNN的优缺点

优点
思想简单,易于理解,易于实现,无需估计参数,无需训练;
精度高、对异常值不敏感、无数据输入假定;
特别适合于多分类问题。
缺点
计算复杂度高、空间复杂度高;
当样本不平衡时,如其中一个类别的样本较大,可能会导致对新样本计算近邻时,大容量样本占大多数,影响分类效果。

扫描二维码关注公众号,回复: 9157625 查看本文章
发布了71 篇原创文章 · 获赞 4 · 访问量 1069

猜你喜欢

转载自blog.csdn.net/qq_44957388/article/details/103092514