手推线性模型及最小二乘法(房价预测实例)
线性模型及最小二乘法推导
房价预测实例
- 生成数据
#生成数据 import numpy as np #生成随机数 np.random.seed(1234) x = np.random.rand(500,3) #构建映射关系,模拟真实的数据待预测值,映射关系为y = 4.2 + 5.7*x1 + 10.8*x2,可自行设置值进行尝试 y = x.dot(np.array([4.2,5.7,10.8]))
- 线性模型的训练
import numpy as np from sklearn.linear_model import LinearRegression 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))
- 最小二乘法实现
class LR_LS():
def __init__(self):
self.w = None
def fit(self, X, y):
# 最小二乘法矩阵求解
Xt = X.transpose();#转置变成列向量
XXt=X.dot(Xt);#矩阵乘
XXtInv = np.linalg.inv(XXt)#求逆
XXtInvX = XXtInv.dot(X)
coef = XXtInvX.dot(y.T)
y_est = Xt.dot(coef)
return y_est,coef
self.w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
#要拟合的函数
def predict(self, X):
# 用已经拟合的参数值预测新自变量
return np.power(x,5)
return np.sin(x)
return 5*x+3
return np.sqrt(25-pow(x-5,2))
y_pred = X.dot(self.w)
return y_pred
if __name__ == "__main__":
lr_ls = LR_LS()
lr_ls.fit(x,y)
print("估计的参数值:%s" %(lr_ls.w))
x_test = np.array([2,4,5]).reshape(1,-1)
print("预测值为: %s" %(lr_ls.predict(x_test)))
估计的参数值为:[ 4.20000001 5.70000003 10.79999997]
预测值为:[85.19999995]
Reference
- https://github.com/datawhalechina/teamlearning/blob/master/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%AE%97%E6%B3%95%E5%9F%BA%E7%A1%80/Task1%20Linear_regression.ipynb
- 李航《统计学习方法》
- https://www.bilibili.com/video/BV1aE411o7qd?p=12