当前位置: 首页 新闻详细

怎样用学考计算器求线性回归方程?机器学习入门 8 线性回归算法:正则化 岭回归-实例应用(房价预测)

一、怎样用学考计算器求线性回归方程?

且为观测值的样本方差.

线性方程称为关于的线性回归方程,称为回归系数,对应的直线称为回归直线.顺便指出,将来还需用到,其中为观测值的样本方差.

利用公式求解:b=

a=y(平均数)-b*(平均数)

线性同余方程

在数论中,线性同余方程是最基本的同余方程,“线性”表示方程的未知数次数是一次,即形如:

的方程。此方程有解当且仅当b能够被a与n的最大公约数整除(记作gcd(a,n)|b)。这时,如果x0是方程的一个解,那么所有的解可以表示为:

其中d是a与n的最大公约数。在模n的完全剩余系{0,1,…,n-1}中,恰有d个解。

目录

1例子

2求特殊解

3线性同余方程组

4参见

例子

在方程

3x≡2(mod6)

中,d=gcd(3,6)=3,3不整除2,因此方程无解。

在方程

5x≡2(mod6)

中,d=gcd(5,6)=1,1整除2,因此方程在{0,1,2,3,4,5}中恰有一个解:x=4。

在方程

4x≡2(mod6)

中,d=gcd(4,6)=2,2整除2,因此方程在{0,1,2,3,4,5}中恰有两个解:x=2andx=5。

求特殊解

对于线性同余方程

ax≡b(modn)(1)

若d=gcd(a,n整除b,那么为整数。由裴蜀定理,存在整数对(r,s)(可用辗转相除法求得)使得ar+sn=d,因此是方程(1)的一个解。其他的解都关于与x同余。

举例来说,方程

12x≡20(mod28)

中d=gcd(12,28)=4。注意到,因此是一个解。对模28来说,所有的解就是{4,11,18,25}。

线性同余方程组

线性同余方程组的求解可以分解为求若干个线性同余方程。比如,对于线性同余方程组:

2x≡2(mod6)

3x≡2(mod7)

2x≡4(mod8)

首先求解第一个方程,得到x≡1(mod3),于是令x=3k+1,第二个方程就变为:

9k≡?6?11(mod7)

解得k≡3(mod7)。于是,再令k=7l+3,第三个方程就可以化为:

42l≡?6?116(mod8)

解出:l≡0(mod4),即l=4m。代入原来的表达式就有x=21(4m)+10=84m+10,即解为:

x≡10(mod84)

对于一般情况下是否有解,以及解得情况,则需用到数论中的中国剩余定理。

参见

二次剩余

中国剩余定理

谈谈解线性同余方程

因为ACM/ICPC中有些题目是关于数论的,特别是解线性同余方程,所以有必要准备下这方面的知识。关于这部分知识,我先后翻看过很多资料,包括陈景润的《初等数论》、程序设计竞赛例题解、“黑书”和很多网上资料,个人认为讲的最好最透彻的是《算法导论》中的有关章节,看了之后恍然大悟。经过几天的自学,自己觉得基本掌握了其中的“奥妙”。拿出来写成文章。

那么什么是线性同余方程?对于方程:ax≡b(modm),a,b,m都是整数,求解x的值。

解题例程:pku1061青蛙的约会解题报告

符号说明:

mod表示:取模运算

ax≡b(modm)表示:(ax-b)modm=0,即同余

gcd(a,b)表示:a和b的最大公约数

求解ax≡b(modn)的原理:

对于方程ax≡b(modn),存在ax+by=gcd(a,b),x,y是整数。而ax≡b(modn)的解可以由x,y来堆砌。具体做法,见下面的MLES算法。

第一个问题:求解gcd(a,b)

定理一:gcd(a,b)=gcd(b,amodb)

实现:古老的欧几里德算法

intEuclid(inta,intb)

{

if(b==0)

returna;

else

returnEuclid(b,mod(a,b));

}

附:取模运算

intmod(inta,intb)

{

if(a>=0)

returna%b;

else

returna%b+b;

}

第二个问题:求解ax+by=gcd(a,b)

定理二:gcd(b,amodb)=b*x'+(amodb)*y'

=b*x'+(a-a/b*b)*y'

=a*y'+b*(x'-a/b*y')

=a*x+b*y

则:x=y'

y=x'-a/b*y'

实现:

tripleExtended_Euclid(inta,intb)

{

tripleresult;

if(b==0)

{

result.d=a;

result.x=1;

result.y=0;

}

else

{

tripleee=Extended_Euclid(b,mod(a,b));

result.d=ee.d;

result.x=ee.y;

result.y=ee.x-(a/b)*ee.y;

}

returnresult;

}

附:三元组triple的定义

structtriple

{

intd,x,y;

};

第三个问题:求解ax≡b(modn)

实现:由x,y堆砌方程的解

intMLES(inta,intb,intn)

{

tripleee=Extended_Euclid(a,n);

if(mod(b,ee.d)==0)

returnmod((ee.x*(b/ee.d)),n/ee.d);

else

return-1;

}//返回-1为无解,否则返回的是方程的最小解

说明:ax≡b(modn)解的个数:

如果ee.d整除b则有ee.d个解;

二、那种计算器可以线性回归

卡西欧fx-991CNX计算器可以线性回归。线性回归属于统计板块的内容,所以进入卡西欧fx-991CNX计算器的统计模式,然后选择y=ax+b线性回归模式,接着在统计编辑器上依次输入数据,确认后就会显示结果的了。

机器学习入门8线性回归算法:正则化岭回归-实例应用(房价预测)

2022-01-1110:00·WEN灬十二灬各位同学好,今天我和大家分享一下python机器学习中线性回归算法的实例应用,并介绍正则化、岭回归方法。在上一篇文章中我介绍了线性回归算法的原理及推导过程:【机器学习】(7)线性回归算法:原理、公式推导、损失函数、似然函数、梯度下降

本节中我将借助Sklearn库完成波士顿房价预测,带大家进一步学习线性回归算法。文末附python完整代码。那我们开始吧。


1.Sklearn库实现1.1线性回归方法选择

(1)正规方程的线性回归

导入方法:fromsklearn.linear_modelimportLinearRegression

当数据量较小时(<10万条),使用该方法的准确率更高

(2)梯度下降法

导入方法:fromsklearn.linear_modelimportSGDClassifier

当数据集很大时,使用该方法准确率更高。(尽量采用岭回归方法,得到的结果会更好)

梯度下降法公式我已经在上一篇文章中推导过,正规化方程的推导本文不做介绍,感兴趣的可自己查阅一下资料。正则化岭回归方法在文末介绍。

1.2模型准确率的评分方法

(1)平均误差

导入方法:fromsklearn.metricsimportmean_absolute_error

计算平均误差方法:mean_absolute_error(真实值,预测值)

(2)均方误差

导入方法:fromsklearn.metricsimportmean_squared_error

计算均方误差:mean_squared_error(真实值,预测值)

2.实例应用--房价预测

2.1数据获取

波士顿房价数据时sklearn中自带的数据,可以直接调用。如果有同学对sklearn内部数据集获取有疑问的话,可以参考我的前几篇文章

#(1)数据获取fromsklearn.datasetsimportload_bostonboston=load_boston()#保存波士顿房价数据集读取数据集的返回值是一个.Bunch类型数据,含有13项特征值,1项房价目标值。data中存放的是特征值数据,DESCR是对该数据集的描述,feature_names是特征值的名称,filename是该数据集的路径,target是房价数据。

2.2数据处理

从.Bunch数据中获取特征值和目标值数据,boston_features存放的是影响房价的13项特征数据,boston_targets存放的是房价。

由于线性规划对特征值比较敏感,数据对预测结果的影响也比较大。为了避免数据单位不统一以及数据跨度较大等问题导致预测结果不准确,因此对特征值数据进行标准化处理。

标准化方法导入:fromsklearn.preprocessingimportStandardScaler

转换方法:scaler.fit_transform()

#(2)数据处理#获取特征值boston_features=boston.data#获取目标值boston_targets=boston.target#标准化处理--正态分布fromsklearn.preprocessingimportStandardScaler#导入标准化处理方法scaler=StandardScaler()#接收标准化方法#将特征值数据传入标准化转换函数中boston_features=scaler.fit_transform(boston_features)

2.3划分训练集和测试集

一般采用75%的数据用于训练,25%用于测试,因此在数据进行预测之前,先要对数据划分。

#(3)划分训练集和测试集fromsklearn.model_selectionimporttrain_test_splitx_train,x_test,y_train,y_test=train_test_split(boston_features,boston_targets,test_size=0.25)如果有同学对测试集和训练集划分方法有疑问的可以看下文的第3.1小节:【机器学习】(1)K近邻算法:原理、实例应用(红酒分类预测)

2.4使用正规方程方法预测

使用linear接收正规方程方法,训练函数.fit()中传入训练值,预测函数.predict()传入测试集的特征值x_test,而测试集的目标值y_test用来计算模型误差。

#导入正规方程方法fromsklearn.linear_modelimportLinearRegression#linear接收正规化方法linear=LinearRegression()#训练,输入训练所需的特征值和目标值linear.fit(x_train,y_train)#预测,输入预测所需的特征值linear_predict=linear.predict(x_test)计算模型误差

分别计算房价预测值linear_predict和真实值y_test之间的平均误差和均方误差,得到模型的平均误差为3.5,均方误差为21.2

#使用平均误差计算模型准确率fromsklearn.metricsimportmean_absolute_error#传入预测结果和真是结果计算平均误差linear_mean_absolute=mean_absolute_error(y_test,linear_predict)#使用均方误差计算模型准确率fromsklearn.metricsimportmean_squared_error#传入预测结果和真是结果计算均方误差linear_mean_squared=mean_squared_error(y_test,linear_predict)

2.5使用梯度下降法预测

与上述方法同理,sgd存放梯度下降方法,训练函数.fit()中传入训练所需的特征值和目标值,预测函数.predict()中传入预测所需的特征值x_test。

!注意!:在sklearn模型训练如果出现如下报错:‘ValueError:Unknownlabeltype:‘unknown’’

这时在训练所需的目标值后面加上.astpye('str')或astype('int')即可

如果训练的目标值y_train是整型数据,写成fit(x_train,y_train.astype('int'))

如果训练的目标值y_train是浮点型数据,写成fit(x_train,y_train.astype('str'))

#(5)使用梯度下降法预测#导入梯度下降法方法fromsklearn.linear_modelimportSGDClassifier#sgd接收梯度下降方法sgd=SGDClassifier()#训练sgd.fit(x_train,y_train.astype('str'))#预测sgd_predict=sgd.predict(x_test)#使用平均误差计算准确率sgd_mean_absolute=mean_absolute_error(y_test,sgd_predict)#使用均方误差计算准确率sgd_mean_squared=mean_squared_error(y_test,sgd_predict)分别计算房价预测值sgd_predict和真实值y_test之间的平均误差和均方误差,得到模型的平均误差为4.2,均方误差为38.4

由此可见,在数据量较少的情况下,正规方程线性回归比梯度下降线性回归的准确率要稍微高一些

3.正则化与岭回归正则化(规整化)出现的目标是为了防止过拟合现象,公式如下:

在上一节中我们证明了推导了损失函数J(θ)的公式由来,MSE(θ)也可以理解为损失函数。只有除的常数项不一样,其他都一样,如下式:

此外,式中

表示正则化,那么正则化的作用是什么呢,我举个例子帮助大家理解。

假设现在有一组特征值x=[1,1,1,1],若在进行线性回归的时候,权重θ可以取两组值,θ?=[1,0,0,0],θ?=[0.25,0.25,0.25,0.25],权重θ?和θ?与x相乘的结果相同。那我们究竟选那一组权重比较好呢,这时带入正则化方法,θ?正则化之后的结果为


,θ?正则化之后的结果为

选择正则化最小的这一组参数,因此我们选择θ?这组参数。因为正则化结果越小,对应的权重越小,对模型越有利。若某一个特征权重很大,那么稍微一点点的变化都会对模型产生很大影响。

回到公式中,λ代表惩罚力度,λ越大,正则化越大,而我们选择正则化后结果最小的那组参数。因此λ越大,说明惩罚力度越大。但惩罚力度并不是越大越好,太大了,可能会导致模型处理拟合得不好,导致最终预测评分低。λ需要不断调试。

岭回归,就是加入了正则惩罚项的回归,可用
sklearn.linear_model.Ridge来实现。

fromsklearn.linear_modelimportRidge

ridge=Ridge(alpha=1)

此处的alpha代表惩罚力度

我们使用岭回归方法再对这个例子进行预测

#(6)使用岭回归预测#导入岭回归方法fromsklearn.linear_modelimportRidge#接收岭回归方法,自定义惩罚力度ridge=Ridge(alpha=10)#训练ridge.fit(x_train,y_train)#预测ridge_predict=ridge.predict(x_test)#误差计算#平均误差ridge_mean_absolute=mean_absolute_error(y_test,ridge_predict)#均方误差ridge_mean_squared=mean_squared_error(y_test,ridge_predict)#输出每一项的权重ridge_coef=ridge.coef_#输出偏移量ridge_intercept=ridge.intercept_

得到房价预测值和真实值的平均误差为3.2,均方误差为20.4

查看每一项的权重θ值:ridge.coef_

查看偏移量θo的值:ridge.intercept_

即线性回归公式中:


完整代码展示:

#(1)数据获取fromsklearn.datasetsimportload_bostonboston=load_boston()#保存波士顿房价数据集#(2)数据处理#获取特征值boston_features=boston.data#获取目标值boston_targets=boston.target#线性回归对特征值比较敏感,数据对结果的影响比较大,如果有某一项过大,会产生很大影响#标准化处理--正态分布fromsklearn.preprocessingimportStandardScaler#导入标准化处理方法scaler=StandardScaler()#接收标准化方法#将特征值数据传入标准化转换函数中boston_features=scaler.fit_transform(boston_features)#(3)划分训练集和测试集fromsklearn.model_selectionimporttrain_test_splitx_train,x_test,y_train,y_test=train_test_split(boston_features,boston_targets,test_size=0.25)#(4)使用正规方程预测#导入正规方程方法fromsklearn.linear_modelimportLinearRegression#linear接收正规化方法linear=LinearRegression()#训练,输入训练所需的特征值和目标值linear.fit(x_train,y_train)#预测,输入预测所需的特征值linear_predict=linear.predict(x_test)#使用平均误差计算模型准确率fromsklearn.metricsimportmean_absolute_error#传入预测结果和真是结果计算平均误差linear_mean_absolute=mean_absolute_error(y_test,linear_predict)#使用均方误差计算模型准确率fromsklearn.metricsimportmean_squared_error#传入预测结果和真是结果计算均方误差linear_mean_squared=mean_squared_error(y_test,linear_predict)#(5)使用梯度下降法预测#导入梯度下降法方法fromsklearn.linear_modelimportSGDClassifier#sgd接收梯度下降方法sgd=SGDClassifier()#训练sgd.fit(x_train,y_train.astype('str'))#预测sgd_predict=sgd.predict(x_test)#使用平均误差计算准确率sgd_mean_absolute=mean_absolute_error(y_test,sgd_predict)#使用均方误差计算准确率sgd_mean_squared=mean_squared_error(y_test,sgd_predict)#(6)使用岭回归预测#导入岭回归方法fromsklearn.linear_modelimportRidge#接收岭回归方法ridge=Ridge(alpha=10)#训练ridge.fit(x_train,y_train)#预测ridge_predict=ridge.predict(x_test)#误差计算#平均误差ridge_mean_absolute=mean_absolute_error(y_test,ridge_predict)#均方误差ridge_mean_squared=mean_squared_error(y_test,ridge_predict)#输出每一项的权重ridge_coef=ridge.coef_#输出偏移量ridge_intercept=ridge.intercept_
最后有惊喜(别错过哦)跻身大厂是每一个程序员的梦想,也希望有机会可以大放异彩,成绩斐然。不过,不积跬步无以至千里,理想和现实的距离是需要努力来不断缩短的。

所以这里我准备了一些礼包,希望能够帮助到各位小伙伴。

★礼包1

如果对学习没有自制力或者没有一起学习交流的动力,欢迎私信或者评论区留言,我会拉你进学习交流群,我们一起交流学习,报团打卡,群内更有众多福利等你来解锁哟,赶快加入我们吧!

★礼包2

?Python全套电子书,200本总共6个G电子书资料,囊括Python各大领域。

?Python练手项目,包括爬虫、数据分析、机器学习、人工智能、小游戏开发。

发布人:rhqianbang88 发布时间:2024-08-03