连载|线性回归

线性模型|线性回归

基本形式

给定由d个属性描述的示例 X = ( x 1 ; x 2 ; . . . ; x d ) X=(x_1;x_2;...;x_d) X=(x1;x2;...;xd),其中 x i x_i xi X X X在第i个属性上的取值,线性模型想要通过一个属性的线性组合来得到一个预测的函数,即:

f ( x ) = w 1 x 1 + w 2 x 2 + . . . + w d x d + b f(x)=w_1x_1+w_2x_2+...+w_dx_d+b f(x)=w1x1+w2x2+...+wdxd+b

一般用向量的形式可以写成:

f ( x ) = w T X + b f(x)=w^TX+b f(x)=wTX+b

其中 w = ( w 1 ; w 2 ; . . . ; w d ) w=(w_1;w_2;...;w_d) w=(w1;w2;...;wd),当w和b学得之后,模型就得以确定。

回归分析

回归分析是用来评估变量之间关系的统计过程,用来解释自变量x与因变量y之间的关系,即当自变量x发生改变时,因变量y会如何发生改变。

线性回归

线性回归是回归分析的一种,评估的自变量x和因变量y之间是一种线性关系。当只有一个自变量时,称为简单线性回归,当具有多个自变量时,称为多元线性回归。

对线性关系的理解:

  • 画出来的图像是直的。
  • 每个自变量的最高次项是1。

简单的线性回归我们可以直接表示成如下形式:

y ^ = w x + b \widehat{y}=wx+b y =wx+b

注:此时的自变量只有一个值。

多元线性回归有多个自变量的值,而对于每一个自变量x都有一个与其对应的参数w,我们可以把x和w表示出向量或者矩阵的形式,表示方法如下:

y ^ = w T X + b \widehat{y}=w^TX+b y =wTX+b

对于向量来说可以展开成下面的形式:

w T = w 1 , w 2 , . . . , w n w^T={w_1,w_2,...,w_n} wT=w1,w2,...,wn

X = x 1 , x 2 , . . . , x n X=x_1,x_2,...,x_n X=x1,x2,...,xn

y ^ = w 1 x 1 + w 2 x 2 + . . . + w n x n + b \widehat{y}=w_1x_1+w_2x_2+...+w_nx_n+b y =w1x1+w2x2+...+wnxn+b

简单线性回归的代码展示如下

import numpy as np
# 线性回归函数
from sklearn.linear_model import LinearRegression
# 用于切分数据集
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

# 加载鸢尾花数据集
iris = load_iris()
# 使用花瓣长和花瓣宽作为x,y
X, y = iris.data[:, 2].reshape(-1, 1), iris.data[:, 3]

lr = LinearRegression()
X_train, X_test, y_train, y_test = train_test_split(X,
                                                    y,
                                                    test_size=0.25,
                                                    random_state=0)
lr.fit(X_train, y_train)
print("权重:", lr.coef_)
print("截距:", lr.intercept_)
y_hat = lr.predict(X_test)
print("拟合函数:", 'y={}x+{}'.format(lr.coef_[0], lr.intercept_))
import matplotlib.pyplot as plt

# mac下使用中文
plt.rcParams["font.family"] = 'Arial Unicode MS'
# win下使用中文
# plt.rcParams["font.family"] = 'SimHei'
plt.rcParams["axes.unicode_minus"] = False
plt.rcParams["font.size"] = 15

plt.figure(figsize=(10, 6), dpi=300)
plt.scatter(X_train, y_train, c='orange', label='训练集')
plt.scatter(X_test, y_test, c='blue', marker='D', label='测试集')
plt.plot(X, lr.predict(X), 'r-')
plt.legend()
plt.xlabel("花瓣长")
plt.ylabel("花瓣宽")
plt.figure(figsize=(15, 6), dpi=300)
plt.plot(y_test, label="真实值", color='r', marker='o')
plt.plot(y_hat, label="预测值", ls='--', color='g', marker='o')
plt.xlabel("测试集数据序号")
plt.ylabel("数据值")
plt.legend()

多元线性回归的代码如下:

import numpy as np
# 线性回归函数
from sklearn.linear_model import LinearRegression
# 用于切分数据集
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

# 加载鸢尾花数据集
iris = load_iris()
# 使用鸢尾花的data和target作为x和y
X, y = iris.data, iris.target

lr = LinearRegression()
X_train, X_test, y_train, y_test = train_test_split(X,
                                                    y,
                                                    test_size=0.25,
                                                    random_state=0)
lr.fit(X_train, y_train)
print("权重:", lr.coef_)
print("截距:", lr.intercept_)
y_hat = lr.predict(X_test)
print(
    "拟合函数:",
    'y={}x1+{}x2+{}x3+{}x4+{}'.format(lr.coef_[0], lr.coef_[1], lr.coef_[2],
                                      lr.coef_[3], lr.intercept_))

线性回归的损失函数

损失函数:

理论值于观测值之差(误差、残差)的平方和。

L = ∑ i = 1 n ( y i ^ − y i ) 2 L=\sum _{i=1}^{n}(\widehat{y_{i}}-y_i)^2 L=i=1n(yi yi)2

其中 y i ^ \widehat{y_i} yi 表示预测值, y i y_i yi表示真实值。

损失函数的求解

  1. 列出目标函数E(损失函数 j ( θ ) j(\theta) j(θ)),此时的样本值用 y i ^ = h θ ( x ( i ) ) = x θ \widehat{y_{i}}=h_{\theta}(x^{(i)})=x\theta yi =hθ(x(i))=xθ来表示。

  2. 求损失函数关于参数的导数,使导数为0,代表损失函数最小。

  3. 此时的参数即为我们所求未知解的参数。

矩阵下最小二乘法的求解过程:

首先明确一下向量和矩阵的导数:

  • ∂ A X ∂ X = A T \frac{\partial AX}{\partial X}=A^T XAX=AT
  • ∂ X T A X ∂ X = ( A + A T ) X \frac{\partial X^TAX}{\partial X}=(A+A^{T})X XXTAX=(A+AT)X

假设一个条件 :满足正定矩阵 ( X T Y ) T = ( X Y T ) T (X^TY)^T=(XY^T)^T (XTY)T=(XYT)T

  • 第一步(这里的1/2)是为了方便后面的计算。

J ( θ ) = ∑ i = 1 n ( y i ^ − y i ) 2 = 1 2 ( X θ − Y ) T ( X θ − Y ) J(\theta)=\sum _{i=1}^{n}(\widehat{y_{i}}-y_i)^2=\frac{1}{2}(X\theta-Y)^T(X\theta-Y) J(θ)=i=1n(yi yi)2=21(XθY)T(XθY)

J ( θ ) = 1 2 ( X T θ T X θ − X T θ T Y − Y T X θ + Y T Y ) J(\theta)=\frac{1}{2}(X^T\theta^TX\theta-X^T\theta^TY-Y^TX\theta+Y^TY) J(θ)=21(XTθTXθXTθTYYTXθ+YTY)

∂ J ( θ ) ∂ θ = 1 2 ( 2 X T X θ − X T Y − X T Y ) \frac{\partial J(\theta)}{\partial \theta}=\frac{1}{2}(2X^TX\theta-X^TY-X^TY) θJ(θ)=21(2XTXθXTYXTY)

∂ J ( θ ) ∂ θ = X T X θ − X T Y \frac{\partial J(\theta)}{\partial \theta}=X^TX\theta-X^TY θJ(θ)=XTXθXTY

  • 第二步

X T X θ − X T Y = 0 X^TX\theta-X^TY=0 XTXθXTY=0

  • 第三步

解得: θ = ( X T X ) − 1 X T Y \theta=(X^TX)^{-1}X^TY θ=(XTX)1XTY

最小二乘法的求解代码

import numpy as np
import matplotlib.pyplot as plt

# 在直线 y = 5x+3 附近生成随机点
X = np.arange(0, 5, 0.1)
Z = [5 * x + 3 for  x in X]
Y = [np.random.normal(z, 0.5) for z in Z] 
plt.plot(X, Y, 'ro')
plt.show()
from scipy.optimize import leastsq

# 需要拟合的函数func :指定函数的形状
def func(p,x):
    k,b=p
    return k*x+b
 
# 误差函数:
def error(p,x,y):
    # yi-y
    return func(p,x)-y

# 设置函数的初始参数
p0=[1,20]
Para=leastsq(error,p0,args=(X,Y))
print(Para)
k,b=Para[0]

_X = [0, 5]  
_Y = [b + k * x for x in _X]

plt.plot(X, Y, 'ro', _X, _Y, 'b', linewidth=2)  
plt.title("y = {}x + {}".format(k, b))  
plt.show()

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二哥不像程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值