机器学习之KNN(一)K近邻算法sklearn实现详解

K近邻算法

  • 做分类时,顾名思义,该算法的大致思想是把要预测的样本点丢到训练样本空间中,选取距离该样本最近的k个训练数据,然后根据投票的方式看哪个类别多,就觉得该样本是哪类数据。
  • 做回归时,思路差不多,选取k个相近的训练数据,预测值就是他们的y标签的平均值。
  • 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。(百度百科)
  • kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。(百度百科)

KNN的三个基本要素

kNN模型的三个基本要素:(1)距离度量、(2)k值的选择、(3)分类决策规则。
(1)距离度量

在引例中所画的坐标系,可以叫做特征空间。特征空间中两个实例点的距离是两个实例点相似程度的反应(距离越近,相似度越高)。kNN模型使用的距离一般是欧氏距离,但也可以是其他距离如:曼哈顿距离

(2)k值的选择

k值的选择会对kNN模型的结果产生重大影响。选择较大的k值,相当于用较大邻域中的训练实例进行预测,模型会考虑过多的邻近点实例点,甚至会考虑到大量已经对预测结果没有影响的实例点,会让预测出错;选择较小的k值,相当于用较小邻域中的训练实例进行预测,会使模型变得敏感(如果邻近的实例点恰巧是噪声,预测就会出错)。

在应用中,k值一般取一个比较小的数值。通常采用交叉验证法来选取最优的k值。

(3)分类决策规则

kNN中的分类决策规则往往是多数表决,即由输入实例的k个邻近的训练实例中的多数类决定待测实例的类。

sklearn中neighbors的api

from sklearn import neighbors
model = neighbors()
'''
    @param n_neighbors: 指定kNN的k值
    @param weights:  
    'uniform': 本节点的所有邻居节点的投票权重都相等
    'distance': 本节点的所有邻居节点的投票权重与距离成反比
    @param algorithm:  惩罚项系数的倒数,越大,正则化项越小
    'ball_tree': BallTree算法
    'kd_tree': kd树算法
    'brute': 暴力搜索算法
    'auto': 自动决定适合的算法
    @param leaf_size:  指定ball_tree或kd_tree的叶节点规模。他影响树的构建和查询速度
    @param p:  p=1:曼哈顿距离; p=2:欧式距离
    @param metric:  指定距离度量,默认为'minkowski'距离
    @param n_jobs: 任务并行时指定使用的CPU数,-1表示使用所有可用的CPU

    @method fit(X,y): 训练模型
    @method predict(X): 预测
    @method score(X,y): 计算在(X,y)上的预测的准确率
    @method predict_proba(X): 返回X预测为各类别的概率
    @method kneighbors(X, n_neighbors, return_distance): 返回样本点的k近邻点。如果return_distance=True,则也会返回这些点的距离
    @method kneighbors_graph(X, n_neighbors, mode): 返回样本点的连接图
'''

以鸢尾花案例实现代码如下

# -*- coding: utf-8 -*-
# 导入鸢尾花数据集
from sklearn.datasets import load_iris
# 导入knn算法
from sklearn import neighbors

# 加载数据
iris = load_iris()
# 提取数据
trainX = iris.data
trainY = iris.target

# 建立模型
clf = neighbors.KNeighborsClassifier(n_neighbors=6,
                                     weights='uniform', algorithm='auto', leaf_size=30,
                                     p=2, metric='minkowski', metric_params=None, n_jobs=1)
'''
    @param n_neighbors: 指定kNN的k值
    @param weights:  
    'uniform': 本节点的所有邻居节点的投票权重都相等
    'distance': 本节点的所有邻居节点的投票权重与距离成反比
    @param algorithm:  惩罚项系数的倒数,越大,正则化项越小
    'ball_tree': BallTree算法
    'kd_tree': kd树算法
    'brute': 暴力搜索算法
    'auto': 自动决定适合的算法
    @param leaf_size:  指定ball_tree或kd_tree的叶节点规模。他影响树的构建和查询速度
    @param p:  p=1:曼哈顿距离; p=2:欧式距离
    @param metric:  指定距离度量,默认为'minkowski'距离
    @param n_jobs: 任务并行时指定使用的CPU数,-1表示使用所有可用的CPU

    @method fit(X,y): 训练模型
    @method predict(X): 预测
    @method score(X,y): 计算在(X,y)上的预测的准确率
    @method predict_proba(X): 返回X预测为各类别的概率
    @method kneighbors(X, n_neighbors, return_distance): 返回样本点的k近邻点。如果return_distance=True,则也会返回这些点的距离
    @method kneighbors_graph(X, n_neighbors, mode): 返回样本点的连接图
'''
# 训练模型
clf.fit(trainX, trainY)
# 打印准确率
print("训练准确率:" + str(clf.score(trainX, trainY)))

print("测试准确率:" + str(clf.score(trainX, trainY)))


'''
训练准确率:0.973333333333
测试准确率:0.973333333333
'''

你可能感兴趣的:(机器学习算法思想及代码实现)