Python机器学习算法 — KNN分类

KNN简介

       K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。KNN分类算法属于监督学习

       最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类。但是怎么可能所有测试对象都会找到与之完全匹配的训练对象呢,其次就是存在一个测试对象同时与多个训练对象匹配,导致一个训练对象被分到了多个类的问题,基于这些问题呢,就产生了KNN。

算法思路

       KNN是通过测量不同特征值之间的距离进行分类。

       它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别,其中K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

KNN原理

其算法的描述为:

1)计算测试数据与各个训练数据之间的距离;

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

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

5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

距离公式

       在KNN中,通过计算对象间距离来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧氏距离或曼哈顿距离:

算法说明

下面通过一个简单的例子说明一下:

       如下图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果 K = 3,由于红色三角形所占比例为 2/3,绿色圆将被赋予红色三角形那个类,如果 K = 5 ,由于蓝色四方形比例为 3/5,因此绿色圆被赋予蓝色四方形类。

       在利用KNN算法判断类别时K的取值很重要。KNN算法主要依据邻近的 k 个样本来进行类别的判断。然后依据 k 个样本中出现次数最多的类别作为未知的类别。这也就是我们常常说到的“物以类聚,人以群分”、“近朱者赤,近墨者黑”。

代码实现

# ==========k最近邻分类=========
import numpy as np # 快速操作结构数组的工具
from sklearn.neighbors import KNeighborsClassifier  # 导入knn分类器

# 数据集。4种属性,3种类别
data=[
    [ 5.1,  3.5,  1.4,  0.2, 0],
    [ 4.9,  3.0,  1.4,  0.2, 0],
    [ 4.7,  3.2,  1.3,  0.2, 0],
    [ 4.6,  3.1,  1.5,  0.2, 0],
    [ 5.0,  3.6,  1.4,  0.2, 0],
    [ 7.0,  3.2,  4.7,  1.4, 1],
    [ 6.4,  3.2,  4.5,  1.5, 1],
    [ 6.9,  3.1,  4.9,  1.5, 1],
    [ 5.5,  2.3,  4.0,  1.3, 1],
    [ 6.5,  2.8,  4.6,  1.5, 1],
    [ 6.3,  3.3,  6.0,  2.5, 2],
    [ 5.8,  2.7,  5.1,  1.9, 2],
    [ 7.1,  3.0,  5.9,  2.1, 2],
    [ 6.3,  2.9,  5.6,  1.8, 2],
    [ 6.5,  3.0,  5.8,  2.2, 2],
]

# 构造数据集
dataMat = np.array(data)
X = dataMat[:,0:4]
y = dataMat[:,4]

knn = KNeighborsClassifier(n_neighbors=2,weights='distance') #初始化一个knn模型,设置k=2。weights='distance'样本权重等于距离的倒数。'uniform'为统一权重
knn.fit(X, y)             #根据样本集、结果集,对knn进行建模
result = knn.predict([[3, 2, 2, 5]])       #使用knn对新对象进行预测
print(result)

输出结果是:

[ 1.]

 

posted @ 2018-06-20 22:55  ls秦  阅读(405)  评论(0编辑  收藏  举报