机器学习之K-近邻算法(KNN)

概述

KNN是通过测量不同特征值之间的距离进行分类。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。KNN算法没办法百分百预测,增加数据维度可提高预测成绩。

k-近邻算法原理

优点:精度高,对异常值不敏感、无数据输入假定
缺点:时间复杂度高O(n),空间复杂度高
适用数据范围:数值型和标称型

KNN简单应用

from sklearn.neighbors import KNeighborsClassifier #knn fenleiqi

x_train=[[182,78,45],[162,48,40],[187,50,41],
         [178,65,44],[158,50,38],[185,67,44]]
y_train=['男','女','男','男','女','男']

knn=KNeighborsClassifier(n_neighbors=3)#KNN 对象
knn.fit(x_train,y_train)#训练数据,建立自适应模型

Test_data=[[182,75,44],[159,49,40]]
knn.predict(Test_data) #预测分类

KNN分类(sklearn)和回归

回归线拟合在数据点上,残差最小的是最优拟合

import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier #knn fenleiqi
from sklearn.neighbors import KNeighborsRegressor
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import datasets

iris = datasets.load_iris()
x=iris.data[:,:2]
y=iris.target
print(x)
print(y)
# K=15,计算周围邻近的15个点
K=15
# 图片x,y轴的歩长
h=0.02
cmap_light=ListedColormap(["#FF0FFF","#0FFFFF","#00F0FF"])
cmap_bold=ListedColormap(["#FF0000","#00FF00","#0000FF"])
myknn=KNeighborsClassifier(n_neighbors=K)
myknn.fit(x,y)

#确定范围
xmin,xmax=x[:,0].min()-1,x[:,0].max()-1
ymin,ymax=x[:,1].min()-1,x[:,1].max()-1
#网格化
xx,yy=np.meshgrid(np.arange(xmin,xmax,h),
                  np.arange(ymin,ymax,h))
#预测
z=myknn.predict(np.c_[xx.ravel(),yy.ravel()])
z=z.reshape(xx.shape)

#背景颜色
plt.pcolormesh(xx,yy,z,cmap=cmap_light)

#画散点图
plt.scatter(x[:,0],x[:,1],c=y,cmap=cmap_bold)
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title("fenlei")
# plt.show()
plt.savefig("show.png")


# knn 回归
np.random.seed(0)
x = np.sort(5*np.random.rand(40,1),axis=0)
y=np.sin(x).ravel()

y[::5]+=1*(0.5-np.random.rand(8))

T=np.linspace(0,5,100)[:,np.newaxis]
# print(T)

knn=KNeighborsRegressor(n_neighbors=5)
knn.fit(x,y)
newy=knn.predict(T)

plt.scatter(x,y,c="k",label="data")
plt.plot(T,newy,c="b",label="predict")
plt.legend()
plt.savefig("show.png")

模型保存

from sklearn.externals import joblib
joblib.dump(knn,r"path/1.m") #保存模型
mynewknn=joblib.load(r"path/1.m") #加载模型

总结

  KNN对于样本不均衡的数据效果不好,需要进行改进。改进的方法时对k个近邻数据赋予权重,比如距离测试样本越近,权重越大。KNN很耗时,时间复杂度为O(n),一般适用于样本数较少的数据集,当数据量大时,可以将数据以树的形式呈现,能提高速度,常用的有kd-tree和ball-tree。

猜你喜欢

转载自www.cnblogs.com/focusTech/p/12299749.html