当前位置:   article > 正文

【python机器学习】KNN算法实现回归(基于鸢尾花数据集)_dist = np.sqrt(np.sum((x - z[i])**2, axis=1))

dist = np.sqrt(np.sum((x - z[i])**2, axis=1))
本文基于鸢尾花数据集

本文基于鸢尾花 数据集实现
数据集:数据集网盘下载
提取码:p2v9
用前3个特征实现第4个特征的回归预测

导入库
import numpy as np
import pandas as pd
  • 1
  • 2
读取数据集
data = pd.read_csv(r"dataset/iris.arff.csv")
#删除不需要的class列,因为现在进行回归预测,类别信息就没用了。
data.drop("class",axis=1,inplace=True)
#删除重复的记录
data.drop_duplicates(inplace=True)
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

KNN算法实现
class KNN:
    """使用python实现K近邻算法。(回归算法)
    get_ipython算法用于回归预测,根据前三个前三个特征属性,寻找最近的k个邻居,
    然后在根据k个邻居的第4个特征值,去预测当前样本的第4个特征值。
    """
    def __init__(self,k):
        """初始化方法
        
        Parameters
        ----------
        k: int
           邻居的个数
        """
        self.k = k
        
    def fit(self,X,y):
        """训练方法
        
        Parameters
        ------------------
        X:类数组类型。形状:[样本数量,特征数量]
           待训练的样本特征
        y:类数组类型。形状:[样本数量]
           每个样本的目标值(标签)。
        """
        
        #将X和y转换成ndarray数组形式,方便统一操作
        self.X = np.asarray(X)
        self.y = np.asarray(y)
        
    def predict(self,X):
        """据参数传递的x,对样本数据进行预测
        
         Parameters
        ------------------
        X:类数组类型。形状:[样本数量,特征数量]
           待测试的样本特征
        
        Return
         ------------------
        result:数组类型。
                预测结果值。
        """
        
        # 转换成数组类型
        X = np.asarray(X)
        #保存预测的结果
        result = []
        for x in X:
            #计算距离。(计算与训练集中每个X的距离)
            dis = np.sqrt(np.sum((x - self.X)**2,axis=1))
            #返回数组排序后,每个元素在原数组中的索引
            index = dis.argsort()
            #取前k个距离最近的索引(在原数组中的索引)
            index = index[:self.k]
            #计算均值,加入到返回的结果列表中
            result.append(np.mean(self.y[index]))
        return np.asarray(result)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
对原始数据集打散,并创建训练集测试集
t = data.sample(len(data),random_state=0)
train_X = t.iloc[:120,:-1]
train_y = t.iloc[:120,-1]

test_X = t.iloc[120:,:-1]
test_y = t.iloc[120:,-1]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
训练&测试&相关参数
knn = KNN(k=3)
knn.fit(train_X,train_y)
result = knn.predict(test_X)
display(result)

print(np.sum((result-test_y)**2))
display(test_y.values)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

可视化
import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False
  • 1
  • 2
  • 3
  • 4
  • 5
plt.figure(figsize=(10,8))
#绘制预测值
plt.plot(result,"ro-",label="预测值")
#绘制真实值
plt.plot(test_y.values,"go--",label="实值")
plt.title("KNN连续值预测")
plt.xlabel("节点序号")
plt.ylabel("花瓣宽度")
plt.legend()
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/131488
推荐阅读
相关标签
  

闽ICP备14008679号