手写算法-Python代码实现非线性回归

2023-11-07

生成非线性数据集

前面我们介绍了Python代码实现线性回归,今天,我们来聊一聊当数据呈现非线性时,这时我们继续用线性表达式去拟合,显然效果会很差,那我们该怎么处理?继续上实例(我们的代码里用到的数据集尽量直接由Python生成,因此,是可以全部跑通的,有需要的同学,建议大家粘贴复现一下,多思考,多动手,才可以学的更好。)

import numpy as np
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

#生成如下数据集
a= np.arange(1,11)
b=np.array([4500,5000,6000,8000,11000,15000,20000,30000,50000,100000])
data = np.c_[a,b]

#给x,y分别添加维度
x = data[:,0,np.newaxis]
y=data[:,1,np.newaxis]
plt.scatter(x,y)
plt.show()

在这里插入图片描述

1、用线性回归拟合

数据的分布如上图所示,这时候如果继续使用线性回归去拟合,这里继续使用上篇文章Python手写的类,和sklearn里面实现是一样的。
链接: 手写算法-Python代码推广多元线性回归

class normal():
    def __init__(self):
        pass

    def fit(self,x,y):
        m=x.shape[0]
        X = np.concatenate((np.ones((m,1)),x),axis=1)
        xMat=np.mat(X)
        yMat=yMat =np.mat(y.reshape(-1,1))

        xTx=xMat.T*xMat
        #xTx.I为xTx的逆矩阵
        ws=xTx.I*xMat.T*yMat
        return ws


model=normal()
w = model.fit(x,y)

#生成2个点画图
x_test=np.array([[1],[10]])
y_test = w[0] + x_test * w[1]


ax1= plt.subplot()
ax1.plot(x_test,y_test,c='r',label='线性回归拟合线')
ax1.scatter(x,y,c='b',label='真实分布')
ax1.legend()
plt.show()

在这里插入图片描述
可以看出拟合的效果很差,这里如果用

在这里插入图片描述
这种表达式去拟合应该会更好

2、多项式拟合

这里和大家介绍一个
#生成多项式
from sklearn.preprocessing import PolynomialFeatures
实现的功能是给X增加维度,具体的可以看官网或者看看我的这篇文章,里面有实现的原理解析,看一下明白了。
链接: 代码系列-python实现PolynomialFeatures(多项式)
我们继续用Python实现:

def multi_feature(x,n):
    c = np.empty((x.shape[0],0)) #np.empty((3,1))并不会生成一个3行1列的空数组,np.empty((3,0))才会生成3行1列空数组
    for i in range(n+1):
        h=x**i
        c=np.c_[c,h]
    return c

#先设置n=2
x_1 = multi_feature(x,2)
x_1   #输出变化后的x

在这里插入图片描述

model=normal()
#用新生成的x作为输入
w = model.fit(x_1,y)

报错了!!!
LinAlgError: Singular matrix
这个错误代表在对numpy的矩阵用np.linalg.inv方法时报错,也就是无法求逆矩阵,难道要屈服用sklearn吗?

不行!!

第一时间返回去看我们写的类,破案了!问题很简单,python写的类里面,我们给x添加了偏置,在这个生成的多项式x_1中,本身就有一列1,这样的话就有2列1,变成了一个非满秩矩阵,因此不需要再添加偏置,修改代码如下:

class normal():
    def __init__(self):
        pass

    def fit(self,x,y):
        #x_1中已经生成了一列1,不需要再加偏置,因此注释掉这2列。
        
        
        #m=x.shape[0]
        #X = np.concatenate((np.ones((m,1)),x),axis=1) 
        xMat=np.mat(x)
        yMat=yMat =np.mat(y.reshape(-1,1))

        xTx=xMat.T*xMat
        #xTx.I为xTx的逆矩阵
        ws=xTx.I*xMat.T*yMat
        return ws

model=normal()
#用新生成的x作为输入
w = model.fit(x_1,y)
w

在这里插入图片描述

这次没有问题了。(为了检查参数是否正确,我又马上调用了sklearn来跑了一遍,先透露结论:系数没错,后面上sklearn的结果)

画图看这次的拟合效果:

#计算x_1的拟合效果,下面是矩阵乘法
y_1 = np.dot(x_1,w) 

ax1= plt.subplot()
ax1.plot(x,y_1,c='r',label='n=2时,拟合效果图')
ax1.scatter(x,y,c='b',label='真实分布图')
ax1.legend(prop = {'size':15}) #此参数改变标签字号的大小
plt.show()

在这里插入图片描述
效果好很多了,设置n=5

#设置n=5
x_2 = multi_feature(x,5)


model=normal()
#用新生成的x_2作为输入,重新拟合
w = model.fit(x_2,y)


#计算x_2的拟合效果,下面是矩阵乘法
y_2 = np.dot(x_2,w) 
ax1= plt.subplot()
ax1.plot(x,y_2,c='r',label='n=5时,拟合效果图')
ax1.scatter(x,y,c='b',label='真实分布图')
ax1.legend(prop = {'size':15}) #此参数改变标签字号的大小
plt.show()

在这里插入图片描述

已经很完美了,由于点太少,显得拟合曲线不是那么平滑,多传入一些x值,

x_test = np.linspace(1,10,100)
x_3 = multi_feature(x_test,5)

#生成预测值y_3
y_3 = np.dot(x_3,w) 
ax1= plt.subplot()
ax1.plot(x_test,y_3,c='r',label='n=5时,拟合效果图')
ax1.scatter(x,y,c='b',label='真实分布图')
ax1.legend(prop = {'size':15}) #此参数改变标签字号的大小
plt.show()

sklearn实现,校验系数的结果

最后附上sklearn检验系数的结果,完全一样的:

from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x_2, y)
print('截距为:',model.intercept_,'\n')
print('系数为:',model.coef_,'\n')
print(w)

在这里插入图片描述

总结

1、这篇文章主要告诉我们,做回归模型时,要了解数据,不能上来就调用sklearn里面的线性回归包,要根据数据的分布,选择合适的算法包,有时候还要对X特征进行一些预处理工作。

2、平时做机器学习还是调包,因为自己写的有很多不足的地方,且很难做到推广,但是,学习的过程中,还是建议多研究一下原理,这样可以走得更远。

3、大家有什么问题需要交流,我一定知无不言,期待一起进步。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手写算法-Python代码实现非线性回归 的相关文章

随机推荐

  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • php-SER-libs-main反序列化靶场通关详细思路

    目录 说明 第一关 基础序列化 第二关 construct与 destruct 第三关 cookie传参 第四关 create fucntion 第五关 wakeup 第六关 私有属性 第七关 call 第八关 增量逃逸 第九关 pop链构
  • Hexo更换主题

    使用Hexo更换主题还算方便 先使用克隆命令安装好主题 然后更改一下博客的配置文件D hexo config yml里面的主题名称就好了 1 安装主题 在博客目录D hexo下右键点击Git Bash 输入以下命令 其他的主题也类似操作 g
  • WIN10下怎么找到MYSQL5.7数据库中存储数据的位置以及重装mysql数据复盘

    由于我换了个m 2的固态硬盘 我重装系统 但是重装系统之后 我mysql之前的版本是5 5的 然后不能启动 我想这重装吧 我想在重装肯定装5 7的了 我就从官网下载了5 7版本 安装完毕 但是我想把我的之前的数据库以及表数据都复盘到mysq
  • 用了TCP协议,就一定不会丢包嘛?

    表面上我是个技术博主 但没想到今天成了个情感博主 我是没想到有一天 我会通过技术知识 来挽救粉丝即将破碎的感情 掏心窝子的说 这件事情多少是沾点功德无量了 事情是这样的 最近就有个读者加了我的绿皮聊天软件 女生 头像挺好看的 就在我以为她要
  • 使用安信可IDE开发ESP8266时出现error: ld returned 1 exit status

    在 app Makefile中COMPONENTS eagle app v6 后面添加driver libdriver a 并在 app driver中添加Makefile文件 这里建议直接复制 examples IoT Demo文件夹并删
  • css苹果手机字号变大,css – 智能手机字体大小不一致

    我正在调整一个网页 使其在智能手机上看起来不错 我已经在CSS文件中声明了一个 media部分 所以我可以指定这个页面的字体大小 这是媒体部分 media screen and max device width 640px TermsOfU
  • 【计算机网络系列】网络层②:详解网际协议IP中的IP地址

    网际协议IP 网际协议IP Internet Protocol 是TCP IP体系中两个最主要的协议之一 也是最重要的互联网标准协议之一 与协议IP配套使用的还有三个协议 地址解析协议ARP Address Resolution Proto
  • win10下 + cuda10.2 + 双目相机zed 2i sdk的安装

    zed 2i 环境搭建 1 安装cuda和cudnn 2 安装zed sdk 3 安装API 本实验用的是pycharm平台 python3 7 主要讲解zed 2i sdk的安装以及遇到的问题 1 安装cuda和cudnn 我们实验之前已
  • qt中在QMultiMap中删除自定义数据类的元素

    引言 当我们使用QMultiMap的remove函数来删除容器中的某一个元素时 若是容器中存放的是基本数据类型 则程序编译的时候没有任何问题 但是当容器中存放的是自定义的数据 这时若是C 基础比较扎实的 应该不会出现编译报错的问题 但是C
  • 桥接模式下虚拟机连不上网络的解决方法

    新建的虚拟机 开启虚拟机后 无法ping到网络 ping www baidu com 显示如下 无法连接到网络 或者输入命令 ifconfig ens33网卡显示像下面这样 没有自动分配ip地址 也可能是ens0网卡 正常连上网络 会自动为
  • 精确计算-BigDecimal类

    基本方法 加法 add 函数 减法 subtract 函数 乘法 multiply 函数 除法 divide 函数 绝对值 abs 函数 重点介绍除法 使用除法函数在divide的时候要设置各种参数 要有除数 精确的小数位数和舍入模式 舍入
  • BUUctf-web:[ACTF2020 新生赛]Exec1

    1 就是按位或 直接执行 后面的语句 2 就是逻辑或 如果前面命令是错的那么就执行后面的语句 否则只执行前面的语句 3 就是按位与 前面和后面命令都要执行 无论前面真假 4 就是逻辑与 如果前面为假 后面的命令也不执行 如果前面为真则执行两
  • Form表单之get提交与post提交

    Form表单之get提交与post提交 Form表单的属性action 与method 属性 值 描述 action URL 规定当提交表单时向何处发送数据 method get post 规定用于发送form data的HTTP方法 提交
  • 兆易创新嵌入式软件工程师笔试题目解析

    哈喽 大家好 今天分享的是兆易创新的嵌入式软件开发工程师的笔试题目 这份题目中等难度 考察基础知识的偏多 最后的编程题只考了一个结构体数组的初始化 所以 在准备校招时 将重点还是要放在基础知识上 下面看下这份题目你可以答几分 本文已同步更新
  • Connect Dynamics 365 and Social Engagement

    Establish a connection between Social Engagement and Dynamics 365 To connect Dynamics 365 online and Social Engagement b
  • 通达信四色谱四量图源码_通达信指标公式源码波段抄底副图指标

    入市建仓 VAR2 REF LOW 1 VAR3 SMA ABS LOW VAR2 13 1 SMA MAX LOW VAR2 0 13 1 100 VAR4 EMA IF CLOSE 1 2 VAR3 13 VAR3 13 13 VAR5
  • 飞书文档导出pdf不带书签/大纲 问题

    问题 我在飞书上整理了很多笔记 有天想把它导出本地 主要原因是有时候网络不好时 网页版的飞书加载比较慢 此外 我还想将其打印成纸质版来看 比较有感觉 飞书我是可以看到各个大纲级别的标题的 一级大纲 二级大纲这样整理非常方便 但是当我导出为p
  • 交叉编译tslib (正确版)

    1 下载安装交叉编译器 编译器版本不限 需要与系统移植时的编译器保持一致即可 2 下载tslib1 4 3 交叉编译tslib 1 4 下载的tslib 1 4 tar gz放到 home driver ts 目录下 cd home dri
  • 手写算法-Python代码实现非线性回归

    手写算法 Python代码实现非线性回归 生成非线性数据集 1 用线性回归拟合 2 多项式拟合 sklearn实现 校验系数的结果 总结 生成非线性数据集 前面我们介绍了Python代码实现线性回归 今天 我们来聊一聊当数据呈现非线性时 这