KNN回归算法【配有案例演示】

KNN回归算法

KNN回归算法就是给定数据集与结果,预测后面新出的数据集的结果。与前面KNN最邻近算法比较类似,最临近算法是求出预测数据集与训练数据集的每个点之间的距离,取前k个数据集的结果集,把结果集中占比大的结果作为预测结果。但是KNN回归算法,就是将前k个数据集的结果进行求平均作为预测的数据集。

图文演示

去除Id列和对应的Species列,将其他的4列特征集的前三列作为数据集,后一列作为结果集
KNN回归算法【配有案例演示】_第1张图片

案例演示

写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()

KNN回归算法【配有案例演示】_第2张图片

你可能感兴趣的:(算法,算法,python,机器学习,数据分析,深度学习)