机器学习-线性回归

 

基本概念

在线性模型中通过一个线性组合进行预测, 由W和b根据x得到f(x)的值

即: f(x)=w_{1}x_{1}+w_{2}x_{2}+...+w_{n}x_{n}+b

或者写为: f(x)= \overrightarrow{W}^{T}\overrightarrow{x}+b

线性回归就是为了学得w和b的值, 然后进行回归预测

相关公式

利用最小二乘法可以得到

w=\frac{\sum_{i=1}^{m} y_{i}(x_{i}-\overline{x})}{\sum_{i=1}^{m}x_{i}^{2}-\frac{1}{m}(\sum_{i=1}^{m}x_{i})^{2}}

b=\frac{1}{m}\sum_{i=1}^{m}(y_{i}-wx_{i})

进一步转化:

将w和b合写在一起 \hat{w}=\{w;b\} 矩阵X在最右边添上一列1

回归方程可以改写为y=f(X)=\hat{w}^{T}X

使用方差来估计误差

方差为 \sum_{i=1}^{m}(y_{i}-x_{i}^{T}\hat{w})^{2} 也可以写作 (y-X\hat{w})^{T}(y-X\hat{w})

由于上式为一个凸函数(下凸), 所以对w求导令上式为零可得误差取极小值时的\hat{w}

即 \hat{w}=(X^{T}X)^{-1}X^{T}y

最终可得线性回归模型为 f(\hat{x_{i}})=\hat{x_{i}}^{T}(X^{T}X)^{-1}X^{T}y

具体代码实现

仅利用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')

计算\hat{w}
其中X需要再加上一行1, 以便于生成\hat{w}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值