基本概念
在线性模型中通过一个线性组合进行预测, 由W和b根据x得到f(x)的值
即: f(x)=
或者写为: f(x)=
线性回归就是为了学得w和b的值, 然后进行回归预测
相关公式
利用最小二乘法可以得到
进一步转化:
将w和b合写在一起 矩阵X在最右边添上一列1
回归方程可以改写为
使用方差来估计误差
方差为 也可以写作
由于上式为一个凸函数(下凸), 所以对w求导令上式为零可得误差取极小值时的
即
最终可得线性回归模型为
具体代码实现
仅利用numpy实现
首先生成一些近似于线性的数据用于测试
import numpy as np
np.random.seed(42)
x=2*np.random.rand(100,1)#从均匀分布中抽取样本
y=4+3*x+np.random.randn(100,1)#从均值0方差1的正态分布中抽取样本
import matplotlib.pyplot as plt
plt.plot(x,y,'o',color='black')
计算
其中X需要再加上一行1, 以便于生成
X_b=np.c_[np.ones((100,1)),x]#向X矩阵添加一 列1
w_best=np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
w_best
array([[4.21509616], [2.77011339]])
X_new=np.array([[0],[2]])
X_new_b=np.c_[np.ones((2,1)),X_new]
y_predict=X_new_b.dot(w_best)
y_predict
array([[4.21509616], [9.75532293]])
plt.plot(X_new,y_predict,'r-',label='predict')#r代表红色, -代表将两点连成线
plt.plot(x,y,'b.',label='scatter')#b代表蓝色, .代表散点图
plt.axis([0,2,0,15])#控制横纵轴范围, 横轴为0到2, 纵轴0到15
plt.xlabel('x')
plt.ylabel('y')
plt.title('Linear Regression')
plt.legend()
利用sklearn实现
from sklearn.linear_model import LinearRegression
lr=LinearRegression().fit(x,y)
lr.intercept_, lr.coef_
(array([4.21509616]), array([[2.77011339]]))
构建test set ,X设置为0和2, Y为predict值
不再需要自己构建w_best
y_predict直接使用LinearRegression().predict()得到
X_new=np.array([[0],[2]])
print(lr.predict(X_new))#y_predict
plt.plot(X_new,lr.predict(X_new),'r-',label='predict')
plt.plot(x,y,'b.',label='scatter')
plt.show()
[[4.21509616] [9.75532293]]
可以通过corcoef的命令来计算预测值和真实值直接的相关性
但是必须保证两个向量都是行向量
yHat=X_b.dot(w_best)
#print(yHat)
#print(y)
print(np.corrcoef(yHat.T,y.T))#要保证两个向量都是行向量
[[1. 0.8770824] [0.8770824 1. ]]
正对角线上的是自己跟自己的相关系数, 所以是1
而反对角线上的就是预测值和实际值之间的相关系数, 比较接近1