基于机器学习线性回归算法实现的模型研究

一、一元线性回归

1.概念

        线性回归模型是利用线性拟合的方式探寻数据背后的规律。如下图,先通过搭建线性回归模型寻找这些散点(也称样本点)背后的趋 势线(也称回归曲线),再利用回归曲线进行一些简单的预测分析或因果关系分析。

       在线性回归中,我们根据特征变量(也称自变量)来预测反应变量 (也称因变量)。根据特征变量的个数可将线性回归模型分为一元线性回归和多元线性回归

2.数学中一元线性回归的数学原理

一元线性回归模型又称为简单线性回归模型,其形式可以表示为如 下所示的公式。

y=ax+b

其中,y为因变量,x为自变量,a为回归系数,b为截距。

如下图所示,其中y(i)为实际值, 为预测值,一元线性回归的 目的就是拟合出一条线来使得预测值和实际值尽可能接近,如果大部分 点都落在拟合出来的线上,则该线性回归模型拟合得较好。

二、一元线性回归的python实现代码

1.绘制散点图

首先利用之前学过的Matplotlib库绘制几个散点,代码如下。

import matplotlib.pyplot as plt
X = [[1], [2], [4], [5]]
Y = [2, 4, 6, 8]
plt.scatter(X, Y)
plt.show()

需要注意的是,这里的自变量集合要写成二维结构形式,即大列表 里包含小列表。这一点其实是符合之后要学习的多元回归的逻辑的,因 为在多元回归中,一个因变量Y可能对应多个自变量X。例如,三元线 性回归(即有3个特征变量)的自变量集合X就要写成类似如下形式。

X = [[1, 2, 3], [2, 4, 5], [4, 6, 8], [5, 7, 9]]

2.引入Scikit-Learn库搭建模型

有了原始数据后,引入Scikit-Learn库便可快速搭建线性回归模型, 代码如下。

from sklearn.linear_model import LinearRegression
regr = LinearRegression()
regr.fit(X, Y)

第1行代码从Scikit-Learn库引入线性回归的相关模块 LinearRegression;

第2行代码构造一个初始的线性回归模型并命名为 regr;

第3行代码用fit()函数完成模型搭建,此时的regr就是一个搭建好的线性回归模型。

3.模型预测

接着就可以利用搭建好的模型regr来预测数据。假设自变量是1.5, 那么使用predict()函数就能预测对应的因变量y,代码如下。

 y = regr.predict([[1.5]])

注意这里的自变量还是要写成二维结构形式。获得的预测结果y为 一个一维数组,其内容如下。

 [2.9]

如果想同时预测多个自变量,则可以使用如下代码。

 y = regr.predict([[1.5], [2.5], [4.5]])

预测结果如下。

 [2.9 4.3 7.1]

4.模型可视化

还可以将搭建好的模型以可视化的形式展示出来,代码如下。

plt.scatter(X, Y)

plt.plot(X, regr.predict(X))

plt.show()

绘制效果如下图所示,此时的一元线性回归模型就是中间形成的一 条直线。

5.线性回归方程构造

通过coef_和intercept_属性可以得到此时趋势线的系数和截距,代 码如下。

print('系数a:' + str(regr.coef_[0]))
print('截距b:' + str(regr.intercept_))

        因为通过regr.coef_获得的是一个列表,所以要通过regr.coef_[0]选 取其中的元素,又因为该元素为数字,所以进行字符串拼接时需要利用 str()函数将其转换成字符串,运行结果如下。

因此,拟合得到的一元线性回归方程为y=1.4x+0.8。

三、实战不同行业工龄与薪水的线性回归模型

1.读取数据并查看前五条

import pandas as pd
df = pd.read_excel('F:\\dada-bishe\\IT行业收入表.xlsx')
df.head( )
print(df.head( ))

2.对工龄和薪水赋值并打印结果

X = df[['工龄']]
Y = df['薪水']

print(X)
print(Y)

打印结果省略

3.绘制散点图对数据进行简单分析

画图的目的是为了分析数据的分布情况及其特点,方便选取合适的的算法,建立合理的模型,进一步用模型对新的数据进行预测。

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

plt.scatter(X, Y)
plt.xlabel('工龄')
plt.ylabel('薪水')
plt.title('不同工龄的薪水分布情况\n')

plt.show()

4.建模

from sklearn.linear_model import LinearRegression
regr = LinearRegression()

regr.fit(X, Y)

5.模型可视化

plt.scatter(X, Y)
plt.plot(X, regr.predict(X), color='red')
plt.xlabel('工龄')
plt.ylabel('薪水')

plt.show()

6.线性回归方程构造

print('系数a:' + str(regr.coef_[0]))
print('截距b:' + str(regr.intercept_))

系数a:8837.375954198473


截距b:10733.350190839696
 

 因此,拟合得到的一元线性回归方程为y=8837x+ 10733

7.模型优化

一元线性回归模型其实还有一个进阶版本——一元多次线性回归模 型,比较常见的是一元二次线性回归模型,其形式可以表示为如下所示 的公式。

y=ax^2+bx+c

之所以还需要研究一元多次线性回归模型,是因为有时真正契合的 趋势线可能不是一条直线,而是一条曲线。如下图所示,根据一元二次 线性回归模型绘制的曲线更契合散点图呈现的数据变化趋势。

那么如何在Python中搭建一个一元二次线性回归模型呢?

首先,通 过如下代码生成二次项数据。
 

from sklearn.preprocessing import PolynomialFeatures

poly_reg = PolynomialFeatures(degree=2)

X_ = poly_reg.fit_transform(X)

第1行代码引入用于增加一个多次项内容的模块 PolynomialFeatures。

第2行代码设置最高次项为二次项,为生成二次项数据(x 2)做准 备。

第3行代码将原有的X转换为一个新的二维数组X_,该二维数组包 含新生成的二次项数据(x 2)和原有的一次项数据(x)。

X_的内容为如下图所示的一个二维数组,其中第1列数据为常数项 (其实就是x 0),没有特殊含义,对分析结果不会产生影响;第2列数 据为原有的一次项数据(x);第3列数据为新生成的二次项数据(x^2)。

import pandas as pd
df = pd.read_excel('F:\\dada-bishe\\IT行业收入表.xlsx')

# print(df.head( ))
X = df[['工龄']]
Y = df['薪水']

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

from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree=2)
X_ = poly_reg.fit_transform(X)
from sklearn.linear_model import LinearRegression
regr = LinearRegression()
regr.fit(X_, Y)

plt.scatter(X, Y)
plt.plot(X, regr.predict(X_), color='red')

plt.xlabel('工龄')
plt.ylabel('薪水')

plt.show()

到这里也许会问到这也没优化啊,跟上面的不是一样的吗,其实并不是所有的模型都需要优化的,对于本案例模型就很好了,所以优不优化得看实际情况,具体情况具体分析。

print(regr.coef_) # 获取系数a、b
print(regr.intercept_) # 获取常数项c

第1行为系数,有3个数:第1个数0对应X_中常数项的系数,这也 是为什么之前说X_的常数项不会对分析结果产生影响;

第2个数对应X_ 中一次项(x)的系数,即系数b;

第3个数对应X_中二次项(x 2)的系 数,即系数a。

第2行的数对应常数项c。

因此,拟合得到的一元二次线 性回归方程为y=463x 2 +8461x+10787。 

 四.线性回归模型评估

       模型搭建完成后,还需要对模型进行评估,这里主要以3个值作为 评判标准:R-squared(即统计学中的R 2)、Adj.R-squared(即Adjusted R 2)、P值。其中R-squared和Adj.R-squared用来衡量线性拟合的优劣,P 值用来衡量特征变量的显著性

1.模型评估的编程实现

       因为模型评估的数学原理比较复杂,而这里侧重于实战应用,所以这里先讲解在实战中如何通过编程来评估模型。 在实战应用中,我们只需要记住这两条规则:R-squared和Adj.Rsquared的取值范围为0~1,它们的值越接近1,则模型的拟合程度越高;

P值在本质上是个概率值,其取值范围也为0~1,P值越接近0,则 特征变量的显著性越高,即该特征变量真的和目标变量具有相关性。

2.实现过程。

import statsmodels.api as sm
X2 = sm.add_constant(X_)
est = sm.OLS(Y, X2).fit()
print(est.summary()) 

第1行代码引入用于评估线性回归模型的statsmodels库并简写为 sm。

第2行代码用add_constant()函数给原来的特征变量X_添加常数项,并 赋给X2,这样才有y=ax+b中的常数项,即截距b,注意Scikit-Learn库 不需要这一步。

第3行代码用OLS()和fit()函数对Y和X2进行线性回归方程搭建。

第4行代码打印输出该模型的数据信息,如下图所示

五.多元线性回归

1.多元线性回归的数学原理和代码实现

多元线性回归模型可以表示为如下所示的公式。

y=k0 + k1x1 + k2x2 +k3x3 + ··· ````

其中x1、x2、x3……为不同的特征变量,k1、k2、k3……则为这些 特征变量前的系数,k0为常数项。多元线性回归模型的搭建也是通过数 学计算来获取合适的系数,使得如下所示的残差平方和最小,其中 y(i)为实际值, 为预测值。

 2.实现原理及代码

其实现原理跟实现的核心代码跟一元线性回归方程一样,略,这里只给出数据样列和参考代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
常用的温度检测元件主要有热电偶、热电阻、热敏电阻等。热电偶主要是利用两种不同金属的热电效应,产生接触电势随温度变化而变化,从而达到测温的目的。测量准确,价格适中测温范围宽,线性度较好。但其输出电压受冷端温度影响,需要进行冷端温度补偿,使电路变得复杂,在本题中并非最佳方案。 热敏电阻由金属氧化物或半导体材料制成,灵敏度高、热惰性小、寿命长、价格便宜。但其测量的稳定性和复现性差,测量精度无法满足本题发挥部分0.2℃的要求。而且线性度差,需要进行查表线性拟合,大大浪费控制器的资源,因此不能选用。 热电阻是利用金属的电阻率随温度变化而变化的特性,将温度量转化成电阻量。其优点是准确度高,稳定性高,性能可靠,热惯性小、复现性好,价格适中。但电阻值与温度是非线性关系,Pt100热电阻,当0℃<t<850℃时可用下式表示: 其中A=3.9083╳10-3 /℃;B=-5.775╳10-7 /℃;由此可见,温度越高非线性误差越大,本题目要求温控范围是40℃~90℃,温度较低。经计算当温度为90℃时,非线性误差为0.34%,运用最小二乘法适当的进行零点和增益的调整,还可使此误差降低一倍,而本题要求精度为,0.2/90=0.22%,因此在本题中可以选用Pt100热电阻,并可近似将其电阻值与温度看作线性关系。 2、 放大电路 热电阻所测得的是电阻量,需要转化为电压量才能被控制器采集。最基本的电阻-电压转换电路是将其与另一固定电阻串联,但这种方法,当温度为量程下限时输出不为零,这样不利于小信号的放大和提高A/D转换的精度。因此,本作品采用桥路测量,电路如2所示: 其中R1R2为10kΩ固定电阻,Rt为热电阻,Rw2为调零电阻,由于 ,因此上下两支路电流相等,并保持恒定不变,输出电压 ,可调整Rt0=Rw2,使得 由于在桥路中R1很大,使得输出量uo变化很小,当Rt从0到100℃变化时,输出仅有十几毫伏,因此还需要进行小信号放大。本作品所用低频增益可调放大电路如3: 其中Rw1为增益电阻,用于调整测量满量程,运放采用低噪声NE5532,令R1=R2,R3=R4,R5=R6,则该放大电路总增益为 ,当Rw1从0到50kΩ变化时,Av的变化范围为150至+∞,满足所需增益要求。 3、 A/D转换 题目所要求测量度精度为0.2℃,测温的范围应该为室温到要求的最高温度,即20~90℃,这就决定了A/D转换的最低分辨率不低于0.2/(90-20)=1/350,而普通八位A/D转换芯片只能达到1/256,不能满足要求。而如果选用更高位的芯片,将大大增加成本。温度是一种变化时间常数较大的物理量,对A/D转换速度要求不高,因此,在设计中选用了压控振荡器,先将电压信号转化为频率量,再通过控制器的计数功能转化为数字信号,这样可以大大提高精度,节约成本。 压控振荡器如4所示: 电容器C1充电周期为 ,放电周期为 ,由于 所以 ,所以其振荡频率可近似看作与输入电压Ui成正比。但当频率较高时,仍有较大(约为5%)非线性误差,不能满足题目要求。因此,在作品中利用FPGA的优点,该测频率为测正脉冲宽度,再通过单片机求倒数,这样即可完全消除非线性误差。 4、 控制器 对水温的反馈偏差控制,就必然用到经典控制理论中的PID(Proportional Integral and Derivative比例积分微分)控制,控制器可有多种选择,如模拟电路、单片机、逻辑器件等。 模拟电路控制可对偏差变化进行连续的控制,技术成熟,性能较稳定。但其缺点是不便于显示,调整PID参数需更换元器件,易受到外界干扰等,在现在这个数字化高度发展的时代已趋于淘汰。 单片机作为微型计算机的一个分支,已有二十多年的发展,在各控制领域都有广泛的应用。而近年以FPGA(现场可编程门阵列)为代表的可编程逻辑器件异军突起,其优异的性能大大弥补了单片机响应速度慢、中断源少的缺点。但FPGA的运算能力有限,因此,在我们的设计中采用FPGA与单片机相结合的控制方式,二者优势互补,性能大大提高。 在本作品中,FPGA主要负责接收压控振荡器的信号,通过测量其正脉宽而获得电压量;单片机接收FPGA发送的数据,进行显示、PID运算,和输出。 5、 输出驱动电路 控制器将其PID运算的结果转化为不同占空比的脉冲信号输出,该信号作用于执行机构还需要经过驱动电路。 本作品中采用交流调功电路,即将负载与交流电源接通几个周波,再断开几个周波,通过改变开通与断开周波的比值来调节负载所消耗的平均功率。具体实现电路如5。 将220V/50Hz的市电,经电阻分压到5V以下,输入运放的同相输入端,运放作为过零比较器,当市电过零时,产生跳变,运放输出送到D触发器的时钟端,D触发器的输入接单片机输出的脉冲信号,输出接双向晶闸管的门极。这样,只有当交流电过零时,单片机的输出信号才对晶闸管产生作用,也就是说,只有当交流电过零时,晶闸管才能开通或关断。这样可以大大减小开通关断过程中对晶闸管的冲击,减少开通关断损耗。 二、 控制器软件设计 1、 FPGA程序设计 在本作品中,FPGA的主要功能是测量压控振荡器输出高脉宽的时间。由于压控振荡器的频率较低(0,则输出脉冲的占空比增加1%,反之减小1% 为了确定PID参数,根据容器加热、传热的公式,列出加热容器的微分方程,经拉氏变换后得到一个一阶滞后环节,其传递函数约为 ,对整个控制回路用Matlab中的Simulink工具箱进行方针,其框8 中step为输入阶跃给定信号,step1为干扰量,A中存储输出占空比,scope显示输出波形(9a),scope1显示占空比值(9b)。 9a 9b 当t=10时刻,给定值输入阶跃量,t=100时刻,输入干扰阶跃量。由此可见,本系统可以以较小的超调和较短的调节时间达到稳定状态,并对于干扰有较好的控制作用。
% MATLAB数学建模工具箱 % % 本工具箱主要包含三部分内容 % 1. MATLAB常用数学建模工具的中文帮助 % 2. 贡献MATLAB数学建模工具(打*号) % 3. 中国大学生数学建模竞赛历年试题MATLAB程序 % 数据拟合 % interp1 - 一元函数插值 % spline - 样条插值 % polyfit - 多项式插值或拟合 % curvefit - 曲线拟合 % caspe - 各种边界条件的样条插值 % casps - 样条拟合 % interp2 - 二元函数插值 % griddata - 不规则数据的二元函数插值 % *interp - 不单调节点插值 % *lagrange - 拉格朗日插值法 % % 方程求根 % inv - 逆矩阵 % roots - 多项式的根 % fzero - 一元函数零点 % fsolve - 非线性方程组 % solve - 符号方程解 % *newton - 牛顿迭代法解非线性方程 % %微积分和微分方程 % diff - 差分 % diff - 符号导函数 % trapz - 梯形积分法 % quad8 - 高精度数值积分 % int - 符号积分 % dblquad - 矩形域二重积分 % ode45 - 常微分方程 % dsolve - 符号微分方程 % *polyint - 多项式积分法 % *quadg - 高斯积分法 % *quad2dg - 矩形域高斯二重积分 % *dblquad2 - 非矩形域二重积分 % *rk4 - 常微分方程RungeKutta法 % %随机模拟和统计分析 % max,min - 最大,最小值 % sum - 求和 % mean - 均值 % std - 标准差 % sort - 排序(升序) % sortrows - 按某一列排序(升序) % rand - [0,1]区间均匀分布随机数 % randn - 标准正态分布随机数 % randperm - 1...n 随机排列 % regress - 线性回归 % classify - 统计聚类 % *trim - 坏数据祛除 % *specrnd - 给定分布律随机数生成 % *randrow - 整行随机排列 % *randmix - 随机置换 % *chi2test - 分布拟合度卡方检验 % % 数学规划 % lp - 线性规划 % linprog - 线性规划(在MATLAB5.3使用) % fmin - 一元函数极值 % fminu - 多元函数极值拟牛顿法 % fmins - 多元函数极值单纯形搜索法 % constr - 非线性规划 % fmincon - 非线性规划(在MATLAB5.3使用) % % 离散优化 % *enum - 枚举法 % *monte - 蒙特卡洛法 % *lpint - 线性整数规划 % *L01p_e - 0-1整数规划枚举法 % *L01p_ie - 0-1整数规划隐枚举法 % *bnb18 - 非线性整数规划(在MATLAB5.3使用) % *bnbgui - 非线性整数规划形工具(在MATLAB5.3使用) % *mintreek - 最小生成树kruskal算法 % *minroute - 最短路dijkstra算法 % *krusk - 最小生成树kruskal算法mex程序 % *dijkstra - 最短路dijkstra算法mex程序 % *dynprog - 动态规划 % % % 形 % plot - 平面曲线(一元函数) % plot3 - 空间曲线 % mesh - 空间曲面(二元函数) % *meshf - 非矩形网格 % *draw - 用鼠标划光滑曲线 % %中国大学生数学建模竞赛题解 % jm96a - 捕鱼策略 % jm96b - 节水洗衣机 % jm96bfun - 节水洗衣机优化函数 % jm97a - 零件参数设计 % jm97afun - 零件参数函数 % jm97aoptim - 零件参数设计优化函数 % jm97b - 截断切割 % jm97bcount - 截断切割枚举法 % jm97brule - 截断切割优化准则 % jm98a1 - 风险投资模型求解 % jm98a2 - 风险投资模型讨论 % jm98a3 - 收益与风险非线性模型求解 % jm98a3fun - 收益与风险非线性模型优化函数 % jm98b - 灾情巡视路线(C程序) % jm99a1 - 自动化车床模型一 % jm99a1fun - 自动化车床模型目标函数 % jm99a1simu - 自动化车床模型随机模拟 % jm99asmfun - 自动化车床模型费用函数 % % 演示程序 % funtool - 函数计算器 % tutdemo - MATLAB优化工具箱教程 % mathmodl - 数学建模工具箱演示

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青枫浦上看桃花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值