KNN回归算法
KNN回归算法就是给定数据集与结果,预测后面新出的数据集的结果。与前面KNN最邻近算法比较类似,最临近算法是求出预测数据集与训练数据集的每个点之间的距离,取前k个数据集的结果集,把结果集中占比大的结果作为预测结果。但是KNN回归算法,就是将前k个数据集的结果进行求平均作为预测的数据集。
图文演示
去除Id列和对应的Species列,将其他的4列特征集的前三列作为数据集,后一列作为结果集
案例演示
写KNN回归算法前的数据准备
# 导入jar包
import numpy as np
import pandas as pd
# 获取数据
data = pd.read_csv("iris.csv")
# 随机去前10条数据
data.sample(10)
# 删除两列
data.drop(["Id","Species"],axis=1,inplace=True)
data
# 去重,排除线性相关
data.drop_duplicates(inplace=True)
len(data)
KNN回归算法编写
class KNN:
"""KNN 回归算法
使用鸢尾花的四个特征进行训练 花瓣长度、宽度 花萼长度、宽度
算法的目标是 根据鸢尾花的三个特征,预测最后一个特征的 度量 (预测值)
"""
def __init__(self,k):
"""初始化方法
k:int
设置k的值,找出相邻数据的个数
"""
self.k = k
def fit(self,X,y):
"""根据参数传递过来的X,对样本数据进行预测
-------
返回一个数组类型,预测结果
"""
self.X = np.asarray(X)
self.y = np.asarray(y)
result = []
def predict(self,V):
V = np.asarray(V)
result = []
for v in V:
# 计算距离 测试几种某一个数据到训练集中没一个点的距离
# 数学模型就是 计算空间中某一点(含 x,y,z坐标) 到空间中一个含有多个点的集合中()
dis = np.sqrt(np.sum((v - self.X)**2,axis=1))
index = dis.argsort()
index = index[:self.k]
# 计算训练的平均值作为预测结果
#disavg = np.mean(self.y[index])
# 将disavg的最大下标的数据添加到result数组中
#result.append(disavg.argmax())
result.append(np.mean(self.y[index]))
return np.asarray(result)
def predict2(self,V):
""" 加权重 """
V = np.asarray(V)
result = []
for v in V:
# 计算距离 测试几种某一个数据到训练集中没一个点的距离
# 数学模型就是 计算空间中某一点(含 x,y,z坐标) 到空间中一个含有多个点的集合中()
dis = np.sqrt(np.sum((v - self.X)**2,axis=1))
index = dis.argsort()
index = index[:self.k]
# 求k个距离的倒数和
he = np.sum(1/(dis[index]+0.0001))
# 计算权重(倒数/倒数和)
weight = (1/(dis[index]+0.0001)) / he
# 计算训练的平均值作为预测结果
#disavg = np.mean(self.y[index])
# 将disavg的最大下标的数据添加到result数组中
#result.append(disavg.argmax())
# 将前面K的计算结果(计算结果要与该店所占的权重比相乘)求均值后放入result数组中
result.append(np.mean(self.y[index] * weight))
return np.asarray(result)
准备KNN回归算法的训练数据集与预测数据集
X = data.sample(len(data),random_state=0)
len(X)
train_X = X.iloc[:120, :-1]
train_y = X.iloc[:120, -1]
test_X = X.iloc[120:, :-1]
test_y = X.iloc[120:, -1]
# 创建KNN对象
knn = KNN(k = 3)
knn.fit(train_X,train_y)
result = knn.predict(test_X)
display(result)
display(test_y.values)
np.mean((result-test_y)**2)
进行折线图展示预测结果
import matplotlib as mpl
import matplotlib.pyplot as plt
# matplotlib 不支持中文,需要配置一下,设置一个中文字体
mpl.rcParams["font.family"] = "SimHei"
# 能够显示 中文 ,正常显示 "-"
mpl.rcParams["axes.unicode_minus"] = False
plt.figure(figsize=(10,10))
plt.plot(result,"ro-",label="预测值")
plt.plot(test_y.values,"bo--",label="真实值")
plt.title("KNN回归算法预测展示")
plt.xlabel("序号")
plt.ylabel("度量值")
plt.legend()
plt.show()