KNN算法


KNN算法(K-NearestNeighbor)或者叫最近邻算法

算法原理:

  找到k个与新数据最近的样本,取样本中最多的一个类别作为新数据的类别

算法的优点:

  1.简单易实现

            实际上并没有抽象出任何模型,而是把全部数据直接当作模型本身,当一条新数据来了之后跟数据集里的每一条数据进行对比

  2.对于边界不规则的数据效果较好

             最终的预测是把未知数据作为中心点,然后画一个圈,使得圈里有k个数据,所以对边界不规则的数据要比线性的分类器效果要好

              (线性分类器可以理解为画一条直线来分类不规则的数据,则很难找到一条线将其分成左右两边)

算法的缺点:

  1.只适合小数据集

        每次预测新数据都需要使用全部数据集

  2.数据不平衡效果不好

    有的数据特别多,有的特别少,数据多的更占竞争优势

  3.必须要做数据标准化

    由于使用距离来进行计算,由于数据的量纲不同,数值较大的字段影响就会变大,所以需要进行标准化

  4.不适合特征维度太多的数据

    由于只能处理小数据集,如果数据维度太多,那么样本在每个维度上的分布就很少

关于k的选取

  k值的选取会影响到模型的效果。

  当k值越小的时候越容易过拟合(因为结果的判断与某一个点强相关),k越大的时候越容易欠拟合(因为要考虑所有样本的情况)

  合适的k值需要根据经验和效果进行尝试(一般k从1开始不断地尝试查看准确率,随着k的增加,一般情况下准确率会先变大后变小,然后选取效果最好的k值就可以了)

#knn算法
from sklearn import datasets #sklearn的数据集
from sklearn.neighbors import KNeighborsClassifier #sklearn模块的KNN类
import numpy as np #矩形运算库numpy

np.random.seed(0)
#设置随机种子,不设置的话默认是按系统时间作为参数,设置后可以保证我们每次产生的随机数是一样的

iris = datasets.load_iris() #获取鸢尾花数据集
iris_x = iris.data #数据部分
iris_y = iris.target #类别部分

#从150条数据中选取140条作为训练集,10条作为测试集。permutation接收一个数作为参数(这里为数据集长度150),
#产生一个0-149乱序一维数组
randomarr = np.random.permutation(len(iris_x))
iris_x_train = iris_x[randomarr[:-10]]  #训练集数据
iris_y_train = iris_y[randomarr[:-10]]  #训练集标签
iris_x_test = iris_x[randomarr[-10:]]   #测试集数据
iris_y_test = iris_y[randomarr[-10:]]   #测试集数据

#定义一个KNN分类器对象
knn = KNeighborsClassifier()

#调用该对象的训练方法,主要接收两个参数:训练数据集及其类别标签
knn.fit(iris_x_train,iris_y_train)

#调用预测方法,主要接收一个参数:测试数据集
iris_y_predict = knn.predict(iris_x_test)

#计算个测试样本预测的概率值。这里没有用概率值。但实际生活中可能会参考拉进行最后结果的筛查,
#而不是直接使用给出的预测标签
probility = knn.predict_proba(iris_x_test)

#计算与最后一个测试样本距离最近的5个点,返回的是这些样本的序号组成的数组

neighborpoint = knn.kneighbors([iris_x_test[-1]],5)

#调用该对象的打分方法,计算出准确率
score = knn.score(iris_x_test,iris_y_test,sample_weight=None)

#输出测试结果
print('iris_y_predict=')
print(iris_y_predict)

#输出原始测试数据集的正确标签,以方便对比
print('iris_y_test=')
print(iris_y_test)

#输出准确率计算结果
print('Accuracy:',score)
#knn算法
from sklearn import datasets #sklearn的数据集
from sklearn.neighbors import KNeighborsClassifier #sklearn模块的KNN类
import numpy as np #矩形运算库numpy

np.random.seed(0)
#设置随机种子,不设置的话默认是按系统时间作为参数,设置后可以保证我们每次产生的随机数是一样的

iris = datasets.load_iris() #获取鸢尾花数据集
iris_x = iris.data #数据部分
iris_y = iris.target #类别部分

#从150条数据中选取140条作为训练集,10条作为测试集。permutation接收一个数作为参数(这里为数据集长度150),
#产生一个0-149乱序一维数组
randomarr = np.random.permutation(len(iris_x))
iris_x_train = iris_x[randomarr[:-10]]  #训练集数据
iris_y_train = iris_y[randomarr[:-10]]  #训练集标签
iris_x_test = iris_x[randomarr[-10:]]   #测试集数据
iris_y_test = iris_y[randomarr[-10:]]   #测试集数据

#定义一个KNN分类器对象
knn = KNeighborsClassifier()

#调用该对象的训练方法,主要接收两个参数:训练数据集及其类别标签
knn.fit(iris_x_train,iris_y_train)

#调用预测方法,主要接收一个参数:测试数据集
iris_y_predict = knn.predict(iris_x_test)

#计算个测试样本预测的概率值。这里没有用概率值。但实际生活中可能会参考拉进行最后结果的筛查,
#而不是直接使用给出的预测标签
probility = knn.predict_proba(iris_x_test)

#计算与最后一个测试样本距离最近的5个点,返回的是这些样本的序号组成的数组

neighborpoint = knn.kneighbors([iris_x_test[-1]],5)

#调用该对象的打分方法,计算出准确率
score = knn.score(iris_x_test,iris_y_test,sample_weight=None)

#输出测试结果
print('iris_y_predict=')
print(iris_y_predict)

#输出原始测试数据集的正确标签,以方便对比
print('iris_y_test=')
print(iris_y_test)

#输出准确率计算结果
print('Accuracy:',score)