本文将简要介绍将matlab中的线性回归算法迁移至Python中,即重构。因为今后的工作将越来越多地借助Python与其十分awesome的库,所以使用Python编程显得尤为重要。
本文将包括如下几个部分:
1、预备知识
2、线性回归算法
3、代码实现
4、情绪化的个人表达(可以略去)
5、参考文献及下载资料
1、预备知识
在进入线性回归的美妙时光之前,你需要掌握以下知识:
Ⅰ.Python基本语法及numpy、matplotlib.pyplot、xlrd库。
Ⅱ.线性代数基础
Ⅲ.高等数学(主要是微分与导数)基础
Ⅳ.熬夜精神与可能不充足但没有办法只能挤出来的时间
Ⅴ.学长的鼓舞(这条选修)
2、线性回归算法
在该部分,我们将回顾主要的线性回归运算,但由于之前的博文已经写过,故略去。
3、代码实现
由于大部分与matlab中的程序相同,故主要选择不同之处与没有提及的地方讲解,关于之前的回归算法我在博文中有较为详细的说明,欢迎阅读。
Ⅰ.导入数据
导入数据需要用到xlrd库[1],本文中不赘述(悄悄说句,matlab导入数据比Python好像更方便耶)
Ⅱ.矩阵化
由于matlab导入数据时可以选择矩阵,而Python莫得此功能,故我们需要苦逼地在本该是美好夜晚的时候让输入数据矩阵化(如果不这么做将导致后续处理数据时按列表处理,会产生求矩阵秩与乘法的问题,注意注意)。代码如下
1
2#矩阵化初始数据,须提前导入numpy库(这有时可用np.array代替,具体我没找到原因,留作思考题)
np.matrix(x)
Ⅲ.转置矩阵
这在matlab中十分方便,但是在这里,我们需要这个函数。
1
2#转置括号里那个可怜弱小又无助的矩阵QAQ
np.transpose(x)
Ⅳ.求行列值、增扩矩阵、矩阵置零
这几个功能在matlab中很好实现,但Python确实要费点脑子,主要是这几个函数。
1
2
3
4
5
6
7
8#进行求矩阵行列值的操作
x.shape
#进行求矩阵行值或列值的操作(n取0为行值,n取1为列值)
x.shape[n]
#生成零矩阵的函数[2]
np.zero()
#矩阵增扩函数,y在左边则左增扩,右边则右增扩
x = np.c_[x,y]
Ⅵ.矩阵运算
还是matlab方便,但是我选择了Python,就要负责到底!加法和矩阵乘法和matlab类似,使用x*y或np.dot(x,y)函数,但我实在不明白为啥点乘就表示不出来,后来发现是要用这个函数[3]
1
np.multiply(a1, x1[:,i])
Ⅶ.作图
你终于来到了这一步,但是摆在你眼前的是作图,没有关系,我们plt库可以当此重任!眼下的这几个函数与matlab中的这几个函数是等价的。
1
2
3
4
5
6#等价于scatter(x,y)
plt.scatter(x,y)
#等价于plot(x,y)
plt.plot(x,y)
#等价于hold on加上display
plt.show()
Ⅷ.其他
这可太棒了,我们解决了所有问题,但是等等,有一个注意点需要我们考虑。
这个注意点在这里比较坑,我调了半天,从头开始才调出来,那就是减肥时,如果有两个列向量(列数一致),一个为矩阵,另一个为列表,则相减将得到意想不到的结果[4],这就是之前所说的按列表处理的危害性。对了,来看看Python作的图!

散点图(初始数据集)
迭代100次的收敛图像
迭代轨迹图(从下往上,每条线代表每一次迭代产生的回归直线)4、情绪化的个人表达
其实像做这篇博文很久了,但因为懒和各种事情拖到现在,重构也是我花了3小时学了Python得出的结果(其实不能说学了,因为很多东西是现查的,而且有些东西需要摸索,网络上没有)。今天的重构是新的开始,之后的各类模型(除了数学建模)我都会使用Python写。人生苦短,我用Python!我今晚想起学长说的要猛学的话,决定要重新开始,不能再颓废了,于是我决定今晚一定要把重构代码搞出来,而且我做到了!有志者,事竟成!我决定在一周内发布逻辑回归的博客!
5、参考资料及下载文件
①参考资料
[1]https://zhuanlan.zhihu.com/p/92678052
[2]https://blog.csdn.net/cpc784221489/article/details/82885590
[3]https://blog.csdn.net/Cherry_Blossom_/article/details/79259804?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
[4]https://blog.csdn.net/dake13/article/details/80917932
②下载资料
基于Python实现的线性回归
Kaggle数据集(二元)