kNN回归
kNN常用作分类任务,但是也可以做回归任务。
做法:使用kNN计算某个数据点的预测值时,模型会从训练数据集中选择离该数据点最近的k个数据点,并且把他们的y值取均值,把该均值作为新数据点的预测值。
代码
此次代码演示使用数据库中的鸢尾花数据集,通过前三个的特征值,预测第四个特征值。
根据前三个特征找出新数据的k个最近邻,将这些邻居的第四个特征的平均值赋给该数据,就可以得到该数据对应第四个特征的值。
分为两个部分讲解,数据处理部分相同
# 导包
from numpy import *
import numpy as np
import pandas as pd
from sklearn import datasets
import matplotlib as mpl
import matplotlib.pyplot as plt
# 防止画图出现中文乱码
mpl.rcParams['font.family'] = 'simHei'
mpl.rcParams['axes.unicode_minus'] = False
# 加载数据
iris = datasets.load_iris()
data = pd.DataFrame(iris.data)
data = data.sample(len(data),random_state=20)
#print(len(data)) # 150
train_x = np.asarray(data.iloc[:120,:-1])
train_y = np.asarray(data.iloc[:120,-1])
test_x = data.iloc[120:,:-1]
test_y = data.iloc[120:,-1]
#print(len(test_x))
plt.figure(figsize=(10,10))
plt.plot(test_y.values,'go--',label='真实值')
plt.title('kNN连续值预测')
plt.xlabel('节点序号')
plt.ylabel('花瓣宽度')
plt.legend()
plt.show()
![](https://img-blog.csdnimg.cn/20210307131218210.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xhZHlfY2hlbg==,size_16,color_FFFFFF,t_70)
一、手写kNN回归
# 手写kNN回归代码
def predict(test_X,train_X,train_y,k):
result = []
dataSetSize = train_X.shape[0]#查看矩阵的维度
test_X = np.asarray(test_X)
for x in test_X:
'''
diffMat = tile(x,(dataSetSize,1)) - train_X
#tile(数组,(在行上重复次数,在列上重复次数))
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
#sum默认axis=0,是普通的相加,axis=1是将一个矩阵的每一行向量相加
distances = sqDistances**0.5
'''
distances = np.sqrt(np.sum((x-train_X)**2,axis=1))
sortedDistIndicies = distances.argsort()
index = sortedDistIndicies[:k]
#sort函数按照数组值从小到大排序
#argsort函数返回的是数组值从小到大的索引值
result.append(np.mean(train_y[index]))
return np.asarray(result)
# 进行预测
result = predict(test_x,train_x,train_y,4)
print(result)
# 第四个属性的真实值
plt.figure(figsize=(10,10))
plt.plot(result,'ro--',label='预测值')
plt.plot(test_y.values,'go--',label='真实值')
plt.title('kNN连续值预测')
plt.xlabel('节点序号')
plt.ylabel('花瓣宽度')
plt.legend()
plt.show()
![](https://img-blog.csdnimg.cn/20210307131538771.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xhZHlfY2hlbg==,size_16,color_FFFFFF,t_70)
二、调用sklearn库函数
sklearn库中实现kNN回归的模型有两个:
KNeighborsRegressor(n_neighbors):根据每个查询点的最近邻的k个数据点的均值作为预测值。
RadiusNeighborsRegressor(radius):基于查询点的固定半径内的数据点的均值作为预测值,radius一般指定浮点数。
from sklearn.neighbors import KNeighborsRegressor
kng = KNeighborsRegressor(n_neighbors=4)
kng.fit(train_x,train_y)
prediction = kng.predict(test_x)
plt.figure(figsize=(10,10))
plt.plot(result,'ro--',label='预测值1')
plt.plot(prediction,'bo--',label='预测值2')
plt.plot(test_y.values,'go--',label='真实值')
plt.title('kNN连续值预测')
plt.xlabel('节点序号')
plt.ylabel('花瓣宽度')
plt.legend()
plt.show()
![](https://img-blog.csdnimg.cn/20210307132709187.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xhZHlfY2hlbg==,size_16,color_FFFFFF,t_70)
from sklearn.neighbors import RadiusNeighborsRegressor
kng1 = RadiusNeighborsRegressor(radius=1.0)
kng1.fit(train_x,train_y)
prediction1 = kng1.predict(test_x)
plt.figure(figsize=(10,10))
plt.plot(result,'ro--',label='预测值1')
plt.plot(prediction,'bo--',label='预测值2')
plt.plot(prediction1,'yo--',label='预测值3')
plt.plot(test_y.values,'go--',label='真实值')
plt.title('kNN连续值预测')
plt.xlabel('节点序号')
plt.ylabel('花瓣宽度')
plt.legend()
plt.show()
![](https://img-blog.csdnimg.cn/20210307132533557.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xhZHlfY2hlbg==,size_16,color_FFFFFF,t_70)
总结
kNN不仅可以用于分类算法,还可以用于回归,这节以后可以认真思考分类和回归的区别。
参考 https://blog.csdn.net/xzy53719/article/details/83185253