KNN算法全称是:K-NearestNeighbor
顾名思义,KNN算法就是用离这个样本最近的K的个样本对这个样本进行预测
算法流程:
1. 设定参数K
2.计算样本与所有样本之间的距离并将这距离进行排序
3.取前K个样本
4.
回归:用这K个样本拟合一条直线(说法不是很准确,理解就好),然后将这个样本放进直线去预测
分类:计算K个样本的类别数量,类别数目最多的即为预测的类别
# -*- coding: utf-8 -*-
"""
Created on Sat May 11 11:10:02 2019
@author: admin
"""
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
iris = load_iris()
iris_x=iris.data
iris_y=iris.target
trainX,testX,trainY,testY = train_test_split(iris_x,iris_y,test_size=0.3,random_state = 0)
#----------------------
def evaluate(predict,testY):
k = 0
for i in range(len(predict)):
if predict[i] == testY[i]:
k+=1
print(k/len(predict))
def KNN_Classification(trainX,trainY,testX,k):#KNN近邻分
testX = testX.reshape(1,4)
an = trainX-testX
an = an**2
distance = np.sum(an,axis=1)
distance = distance.reshape(trainX.shape[0],1)
con = np.c_[distance,trainY]
sor_arg = np.argsort(con[:,0])
sor = con[sor_arg]
tag = sor[:k]
dic = {}
for i in range(k):
if tag[i][-1] in dic:
dic[tag[i][-1]] += 1
else:
dic[tag[i][-1]] = 1
re = 0
m = 0
for i in dic:
if dic[i] > m:
m = dic[i]
re = i
return int(re)
#----------------------
n=4
model = KNeighborsClassifier(n_neighbors=n)
model.fit(trainX,trainY)
predict = model.predict(testX)
evaluate(predict,testY)
lis = []
for i in range(len(predict)):
pre = KNN_Classification(trainX,trainY,testX[i],n)
lis.append(pre)
predic = np.array(lis)
evaluate(predic,testY)
print(predict)
print(predic)
print(testY)
优点1. KNN分类器虽然简单,但已证明它的泛化错误率小于等于2*贝叶斯最优分类器错误率2. 可用于非线性分类3. KNN主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法更适合4. 类别决策时,KNN仅依赖小部分样本,在不平衡样本集上表现较优。举个极端一点例子:答案只有A与B,但是训练样本中A的个数占99%,而B只有1%,svm、Bayes和NN训练出来的结果,恐怕预测任何数据给出的答案都是A,但是KNN不会。
缺点
1. (维数灾难)KNN属于密采样,它有一个重要假设:任何一个样本点x附近的小领域总能找到一个训练样本,维数太多的话,需要的计算样本太多
2. 距离计算在高维空间里比较麻烦
3. 相比决策树模型,KNN模型可解释性不强
4. 基本不学习,导致预测时速度比逻辑回归等算法慢