线性回归
线性回归原理
线性回归试图学得一个通过属性的线性组合来进行预测的函数。
有数据集$ {(x_1,y_1),(x_2,y_2),…,(x_n,y_n)}
,
其
中
,
,其中,
,其中, x_i =(x_ {i1}; x_ {i2}; x_ {i3}; …; x_ {id}),y_i \ in R $
其中n表示变量的数量,d表示每个变量的尺寸。
可以用以下函数来描述y和x之间的关系:$ f(x)= \ sum_ {i = 0} ^ {d} \ theta_ix_i $
即我们要通过对数据的学习,得到参数$ \ theta $
线性回归损失函数,代价函数,目标函数
损失函数(损失函数):度量单样本预测的错误程度,损失函数值越小,模型就越好。
代价函数(Cost Function):估计全部样本集的平均误差。
目标函数(对象函数):代价函数和正则化函数,最终要优化的函数。
# 生成数据
import numpy as np
# 生成随机数
np.random.seed(1234)
x=np.random.rand(500,3)
#构建映射关系,模拟真实的数据在预测值,映射关系为y=4.2+5.7*x1+10*x2
y=x.dot(np.array([4.2,5.7,10.8]))
1.先尝试调用sklearn的线性回归模型训练数据
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn .datasets import california_housing
import matplotlib.pyplot as plt
%matplotlib inline
#调用模型
lr=LinearRegression(fit_intercept=True)
#训练模型
lr.fit(x,y)
print("估计的参数值为:%s" %(lr.coef_))
#计算R平方
print('R2:%s' %(lr.score(x,y)))
#任意设定变量,预测目标值
x_test=np.array([2,4,5]).reshape(1,-1)
y_hat=lr.predict(x_test)
print("预测值为:%s" %(y_hat))
估计的参数值为:[ 4.2 5.7 10.8]
R2:1.0
预测值为:[85.2]
2.最小二乘法的矩阵求解
class LR_LS():
def __init__(self):
self.w = None
def fit(self, X, y):
# 最小二乘法矩阵求解
#============================= show me your code =======================
self.w = np.linalg.solve(X.T.dot(X),X.T.dot(y))
#============================= show me your code =======================
def predict(self, X):
# 用已经拟合的参数值预测新自变量
#============================= show me your code =======================
y_pred = X.dot(self.w)
#============================= show me your code =======================
return y_pred
if __name__ == "__main__":
lr_ls = LR_LS()
lr_ls.fit(x,y)
# print("x:%s"%(len(x)))
print("估计的参数值:%s" %(lr_ls.w))
x_test = np.array([2,4,5]).reshape(1,-1)
print("预测值为: %s" %(lr_ls.predict(x_test)))
估计的参数值:[ 4.2 5.7 10.8]
预测值为: [85.2]
3.梯度下降法
class LR_GD():
def __init__(self):
self.w = None
self.count = 0
def fit(self,X,y,alpha=0.02,loss = 1e-10): # 设定步长为0.002,判断是否收敛的条件为1e-10
[m,d] = np.shape(X) #自变量的维度
self.w = np.zeros((d)) #将参数的初始值定为0
tol = 1e5
#============================= show me your code =======================
while tol > loss:
# here
def rmse(predictions, targets):
return np.sqrt(((predictions - targets) ** 2).mean())
error = np.dot(X, self.w) - y
h_x = np.dot(error, X)
self.w -= 1./m*alpha * h_x
tol = rmse(X.dot(self.w), y)
self.count += 1
#============================= show me your code =======================
def predict(self, X):
# 用已经拟合的参数值预测新自变量
y_pred = X.dot(self.w)
return y_pred
if __name__ == "__main__":
lr_gd = LR_GD()
lr_gd.fit(x,y)
print("估计的参数值为:%s" %(lr_gd.w))
x_test = np.array([2,4,5]).reshape(1,-1)
print("预测值为:%s" %(lr_gd.predict(x_test)))
print('train epcoch:', lr_gd.count)
估计的参数值为:[ 4.2 5.7 10.8]
预测值为:[85.2]
train epcoch: 15103