用python实现多元线性回归,先不使用sklearn.linear_model模块,编写如下:
#导模块
import numpy as np
import pandas as pd
#变量初始化
X=[]
Y=[]
B=[]
Q_e=0
Q_E=0
#从csv文件中读取数据
def get_data(file_name):
data=pd.read_csv(file_name,header=0)
data=np.array(data)
#数组切片对变量进行赋值
Y=data[:,data.shape[1]-1]#预报对象位于最后一列
X=data[:,0:data.shape[1]-1]
print(X.shape)
return X,Y
X,Y=get_data('Advertising.csv')
X=np.mat(np.c_[np.ones(X.shape[0]),X])#为系数矩阵增加常数项系数
Y=np.mat(Y)#数组转化为矩阵
#print(X)
B=np.linalg.inv(X.T*X)*(X.T)*(Y.T)
print(B)#输出系数,第一项为常数项,其他为回归系数
print(np.mat([1,60,60,60])*B)#预测结果
#相关系数
Y_mean=np.mean(Y)
for i in range(Y.size):
Q_e+=pow(np.array((Y.T)[i]-X[i]*B),2)
Q_E+=pow(np.array(X[i]*B)-Y_mean,2)
R2=Q_E/(Q_e+Q_E)
print(R2)
输出结果:
不直接使用模块主要是一是希望自己熟悉公式及其数学意义,明白计算流程;二是熟悉python进行矩阵运算的函数和各种数据属性,暴露出了不少问题,自己进行矩阵运算时相当不熟练,一个矩阵运算式改正了一个多小时才算出正确结果,在计算式,使用shape属性查看list和matrix的维数,以免计算出现问题,熟记常用的属性和函数可以有效的提高编程效率。
使用sklearn.linear_model模块的代码实现如下:
#导模块
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
#变量初始化
X=[]
Y=[]
#从csv文件中读取数据
def get_data(file_name):
data=pd.read_csv(file_name,header=0)
data=np.array(data)
#数组切片对变量进行赋值
Y=data[:,data.shape[1]-1]#预报对象位于最后一列
X=data[:,0:data.shape[1]-1]
print(X.shape)
return X,Y
X,Y=get_data('Advertising.csv')
regs=LinearRegression()
regs.fit(X,Y)
print(regs.coef_)#输出回归系数
print(regs.predict([[60,60,60]]))#预测值
print(regs.score(X,Y))#输出相关系数
结果输出如下:
经过对照可以知道结果是正确的。