最近学金融的妹妹要处理数据写论文,对一个文科妹子来说,数学学不会,公式看不懂怎么破~作为姐姐的我看在眼里,疼在心里,打算帮妹妹解决掉数据计算这方面的问题。原来就是求三元线性回归的残差啊,害,这有什么难的,妹妹就是不会算权重,一直在网上寻找已经算好权重的数据,为此特意开通了什么会员,咱也不知道咱也不敢问。于是乎,利用自己所学的python,写下了这个程序。

简单介绍一下什么是线性回归?

答:线性回归是通过一个或多个自变量因变量之间进行建模的回归分析。其中可以为一个或多个自变量之间的线性组合

一元线性回归涉及到的变量只有一个;多元线性回归涉及到的变量有两个及两个以上。

线性关系模型为:

python 残差时序图 python残差检验_python

w 为权重,b 为偏置项,其中 wx 为矩阵。转换成矩阵如下:

python 残差时序图 python残差检验_权重_02


话不多说,上案例。妹妹论文中的公式是:

python 残差时序图 python残差检验_python 残差时序图_03


可简化为:

python 残差时序图 python残差检验_线性回归_04


根据推导得到:

python 残差时序图 python残差检验_python_05


典型的多元线性回归方程,具体推导就不详细说明了,大家自行百度。接下来上代码。

如果不怕麻烦想试一下’.txt’文件转 ‘.csv’ 文件,就看方法一,想直接用.xlsx转.csv的看方法二。

第一步,首先需要numpy 库和 pandas 库,不会安装的戳下面链接,安装过的略过。


方法一:先将excel表转换成.txt文件

python 残差时序图 python残差检验_python_06


python 残差时序图 python残差检验_python_07


接下来打开.txt文件,另存为’utf-8’格式,如果不是,会报错。

python 残差时序图 python残差检验_数据_08

from numpy.linalg import inv  # 矩阵求逆
from numpy import dot  # 求矩阵点乘
import numpy as np
import pandas as pd

txt = np.loadtxt('file.txt')
txtDF = pd.DataFrame(txt)
txtDF.to_csv('file.csv', index=False)
data = pd.read_csv('file.csv')
dataset = pd.DataFrame(data,copy = True)
test = dataset.iloc[:, 0:4]
test = test.copy()
X = test.iloc[:, [1,2,3]]
Y = test.iloc[:, 0]
theta = dot(dot(inv(dot(X.T, X)), X.T), Y)
y = dot(theta, X.T)
print('权重',theta) # 权重
loss = np.array(Y-y)  # 残差
print('残差',loss)

运行结果:

python 残差时序图 python残差检验_权重_09


权重和残差都可以算出来了。

方法二:’.xlsx’ 转 ‘.csv’

from numpy.linalg import inv  # 矩阵求逆
from numpy import dot  # 求矩阵点乘
import numpy as np
import pandas as pd
data = pd.read_excel('1.xlsx',index_col=0)
data.to_csv('data.csv',encoding='utf-8')
data = pd.read_csv('data.csv')
dataset = pd.DataFrame(data,copy = True)
test = dataset.iloc[:, 0:4]
test = test.copy()
X = test.iloc[:, [1,2,3]]
Y = test.iloc[:, 0]
theta = dot(dot(inv(dot(X.T, X)), X.T), Y)
y = dot(theta, X.T)
print('权重',theta) # 权重
loss = np.array(Y-y)  # 残差
print('残差',loss)

运行结果跟上面是一样的

python 残差时序图 python残差检验_数据_10