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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。