您的位置:首页 > 其它

机器学习---knn分类器

2016-06-13 19:48 357 查看
     knn这个分类器,原理很简单,可以说是机器学习里面最简单的一个分类器。

  工作原理:存在一个训练样本集,这些样本集都是有标签,也就是我们知道样本集中每个数据与其类别的对应关系。输入没有标签的新数据后,将新数据与样本集的数据特征进行比较,然后按照特定算法提取样本集中最相似的数据分类标签。举个例子:

     电影名称           打斗镜头                    接吻镜头             电影类型

   california            3                           100                  爱情片

   kevin longbal         101                          10                  动作片

    beautiful            1                            80                  爱情片

   he likes flying       2                            100                 爱情片

   robo slayer          99                             5                  动作片

ok,大概就举这么多例子,这里有5个电影,给出了两个特征就是打斗镜头和接吻镜头的数量,最后每个样本都有标签分类是爱情片还是动作片。好的,现在我手头有一个电影,比如是taitanic,我知道接吻镜头90个,打斗镜头10个,采用knn怎么去知道这部电影是爱情片还是动作片?计算这部电影与样本集中所有电影的距离,然后递增排序,设定k值,找出这K个电影属于类别最多的作为titanic的分类标签。

     计算步骤如下:
    1)算距离:给定测试对象,计算它与训练集中的每个对象的距离
    2)找邻居:圈定距离最近的k个训练对象,作为测试对象的近邻
    3)做分类:根据这k个近邻归属的主要类别,来对测试对象分类

距离衡量:欧氏距离,夹角余弦都可以。

优点:简单,易于理解,精度高,对异常值不敏感,易于实现,无需估计参数,无需训练,适合用在多分类上面

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

常见的几个问题:

1、k值设定为多?
k太小,分类结果易受噪声点影响;k太大,近邻中又可能包含太多的其它类别的点。(对距离加权,可以降低k值设定的影响)
k值通常是采用交叉检验来确定(以k=1为基准)
经验规则:k一般低于训练样本数的平方根

2、类如何判定?
投票法没有考虑近邻的距离的远近,距离更近的近邻也许更应该决定最终的分类,所以加权投票法更恰当一些。

3、如何选择合适的距离衡量?
高维度对距离衡量的影响:众所周知当变量数越多,欧式距离的区分能力就越差。
变量值域对距离的影响:值域越大的变量常常会在距离计算中占据主导作用,因此应先对变量进行标准化(不同属性会有不同的区间,比如有的是(0,1),有的(1000,5000),这样在距离计算时候会偏向大值一边,需要归一化或者标准化)。

4、性能问题?
kNN是一种懒惰算法,不需要训练,拿来即用。
构造模型很简单,但在对测试样本分类地的系统开销大,因为要扫描全部训练样本并计算距离。
已经有一些方法提高计算的效率,例如压缩训练样本量,kd树等。

ok,贴个小代码作为结尾:

x=[[0],[1],[2],[3]]

y=[0,0,1,1]

from sklearn.neighbors import KNeighborsClassifier

neigh=KNeighborsClassifier(n_neighbors=3)

neigh.fit(x,y)

print(neigh.predict([[1.1]]))

很简单吧,一看就能理解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  knn算法