Python实现的简单线性回归算法实例分析
本文实例讲述了Python实现的简单线性回归算法。分享给大家供大家参考,具体如下:
用python实现R的线性模型(lm)中一元线性回归的简单方法,使用R的women示例数据,R的运行结果:
>summary(fit)
Call:
lm(formula=weight~height,data=women)
Residuals:
Min 1Q Median 3Q Max
-1.7333-1.1333-0.3833 0.7417 3.1167
Coefficients:
EstimateStd.ErrortvaluePr(>|t|)
(Intercept)-87.51667 5.93694 -14.741.71e-09***
height 3.45000 0.09114 37.851.09e-14***
---
Signif.codes: 0‘***'0.001‘**'0.01‘*'0.05‘.'0.1‘'1
Residualstandarderror:1.525on13degreesoffreedom
MultipleR-squared: 0.991,AdjustedR-squared: 0.9903
F-statistic: 1433on1and13DF, p-value:1.091e-14
python实现的功能包括:
- 计算pearson相关系数
- 使用最小二乘法计算回归系数
- 计算拟合优度判定系数R2R2
- 计算估计标准误差Se
- 计算显著性检验的F和P值
importnumpyasnp
importscipy.statsasss
classLm:
"""简单一元线性模型,计算回归系数、拟合优度的判定系数和
估计标准误差,显著性水平"""
def__init__(self,data_source,separator):
self.beta=np.matrix(np.zeros(2))
self.yhat=np.matrix(np.zeros(2))
self.r2=0.0
self.se=0.0
self.f=0.0
self.msr=0.0
self.mse=0.0
self.p=0.0
data_mat=np.genfromtxt(data_source,delimiter=separator)
self.xarr=data_mat[:,:-1]
self.yarr=data_mat[:,-1]
self.ybar=np.mean(self.yarr)
self.dfd=len(self.yarr)-2#自由度n-2
return
#计算协方差
@staticmethod
defcov_custom(x,y):
result=sum((x-np.mean(x))*(y-np.mean(y)))/(len(x)-1)
returnresult
#计算相关系数
@staticmethod
defcorr_custom(x,y):
returnLm.cov_custom(x,y)/(np.std(x,ddof=1)*np.std(y,ddof=1))
#计算回归系数
defsimple_regression(self):
xmat=np.mat(self.xarr)
ymat=np.mat(self.yarr).T
xtx=xmat.T*xmat
ifnp.linalg.det(xtx)==0.0:
print('Cannotresolvetheproblem')
return
self.beta=np.linalg.solve(xtx,xmat.T*ymat)#xtx.I*(xmat.T*ymat)
self.yhat=(xmat*self.beta).flatten().A[0]
return
#计算拟合优度的判定系数R方,即相关系数corr的平方
defr_square(self):
y=np.mat(self.yarr)
ybar=np.mean(y)
self.r2=np.sum((self.yhat-ybar)**2)/np.sum((y.A-ybar)**2)
return
#计算估计标准误差
defestimate_deviation(self):
y=np.array(self.yarr)
self.se=np.sqrt(np.sum((y-self.yhat)**2)/self.dfd)
return
#显著性检验F
defsig_test(self):
ybar=np.mean(self.yarr)
self.msr=np.sum((self.yhat-ybar)**2)
self.mse=np.sum((self.yarr-self.yhat)**2)/self.dfd
self.f=self.msr/self.mse
self.p=ss.f.sf(self.f,1,self.dfd)
return
defsummary(self):
self.simple_regression()
corr_coe=Lm.corr_custom(self.xarr[:,-1],self.yarr)
self.r_square()
self.estimate_deviation()
self.sig_test()
print('ThePearson\'scorrelationcoefficient:%.3f'%corr_coe)
print('TheRegressionCoefficient:%s'%self.beta.flatten().A[0])
print('Rsquare:%.3f'%self.r2)
print('Thestandarderrorofestimate:%.3f'%self.se)
print('F-statistic:%don%sand%sDF,p-value:%.3e'%(self.f,1,self.dfd,self.p))
python执行结果:
TheRegressionCoefficient:[-87.51666667 3.45 ]
Rsquare:0.991
Thestandarderrorofestimate:1.525
F-statistic: 1433on1and13DF, p-value:1.091e-14
其中求回归系数时用矩阵转置求逆再用numpy内置的解线性方程组的方法是最快的:
a=np.mat(women.xarr);b=np.mat(women.yarr).T timeit(a.I*b) 99.9µs±941nsperloop(mean±std.dev.of7runs,10000loopseach) timeitata.I*(a.T*b) 64.9µs±717nsperloop(mean±std.dev.of7runs,10000loopseach) timeitnp.linalg.solve(ata,a.T*b) 15.1µs±126nsperloop(mean±std.dev.of7runs,100000loopseach)
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。