机器学习之线性回归

线性回归的原理

线性回归的一般形式

有数据集$\{(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之间的关系:

\begin{align*} f(x) &= \theta_0 + \theta_1x_1 + \theta_2x_2 + ... + \theta_dx_d \\ &= \sum_{i=0}^{d}\theta_ix_i \\ \end{align*}

如何来确定$\theta$的值,使得$f(x)$尽可能接近y的值呢?均方误差是回归中常用的性能度量,即:

$$J(\theta)=\frac{1}{2}\sum_{j=1}^{n}(h_{\theta}(x^{(i)})-y^{(i)})^2$$

我们可以选择$\theta$,试图让均方误差最小化:

极大似然估计(概率角度的诠释)

下面我们用极大似然估计,来解释为什么要用均方误差作为性能度量

我们可以把目标值和变量写成如下等式:

$$ y^{(i)} = \theta^T x^{(i)}+\epsilon^{(i)} $$

ϵ表示我们未观测到的变量的印象,即随机噪音。我们假定𝜖ϵ是独立同分布,服从高斯分布。(根据中心极限定理)$$ p(\epsilon^{(i)}) = \frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(\epsilon^{(i)})^2}{2\sigma^2}\right)$$

因此,

$$ p(y^{(i)}|x^{(i)};\theta) = \frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-\theta^T x^{(i)})^2}{2\sigma^2}\right) $$

我们建立极大似然函数,即描述数据遵从当前样本分布的概率分布函数。由于样本的数据集独立同分布,因此可以写成

$$ L(\theta) = p(\vec y | X;\theta) = \prod^n_{i=1}\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-\theta^T x^{(i)})^2}{2\sigma^2}\right) $$

选择θ,使得似然函数最大化,这就是极大似然估计的思想。

为了方便计算,我们计算时通常对对数似然函数求最大值:

\begin{align*} l(\theta) &= log L(\theta) = log \prod^n_{i=1}\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-\theta^T x^{(i)})^2} {2\sigma^2}\right) \\ & = \sum^n_{i=1}log\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-\theta^T x^{(i)})^2}{2\sigma^2}\right) \\ & = nlog\frac{1}{​{\sqrt{2\pi}\sigma}} - \frac{1}{\sigma^2} \cdot \frac{1}{2}\sum^n_{i=1}((y^{(i)}-\theta^T x^{(i)})^2 \end{align*}

显然,最大化$l(\theta)$即最小化\frac{1}{2}\sum^n_{i=1}((y^{(i)}-\theta^T x^{(i)})^2

2、线性回归损失函数、代价函数、目标函数

损失函数(Loss Function):度量单样本预测的错误程度,损失函数值越小,模型就越好。
代价函数(Cost Function):度量全部样本集的平均误差。
目标函数(Object Function):代价函数和正则化函数,最终要优化的函数

3、线性回归的优化方法

 1、梯度下降法

设定初始参数$\theta$,不断迭代,使得J(\theta)最小化:
\theta_j:=\theta_j-\alpha\frac{\partial{J(\theta)}}{\partial\theta}

\begin{align*} \frac{\partial{J(\theta)}}{\partial\theta} &= \frac{\partial}{\partial\theta_j}\frac{1}{2}\sum_{i=1}^{n}(f_\theta(x)^{(i)}-y^{(i)})^2 \\ &= 2*\frac{1}{2}\sum_{i=1}^{n}(f_\theta(x)^{(i)}-y^{(i)})*\frac{\partial}{\partial\theta_j}(f_\theta(x)^{(i)}-y^{(i)}) \\ &= \sum_{i=1}^{n}(f_\theta(x)^{(i)}-y^{(i)})*\frac{\partial}{\partial\theta_j}(\sum_{j=0}^{d}\theta_jx_j^{(i)}-y^{(i)}))\\ &= \sum_{i=1}^{n}(f_\theta(x)^{(i)}-y^{(i)})x_j^{(i)} \\ \end{align*}

即:

\theta_j = \theta_j + \alpha\sum_{i=1}^{n}(y^{(i)}-f_\theta(x)^{(i)})x_j^{(i)}
将所有的参数以向量形式表示,可得:

\theta = \theta + \alpha\sum_{i=1}^{n}(y^{(i)}-f_\theta(x)^{(i)})x^{(i)}

由于这个方法中,参数在每一个数据点上同时进行了移动,因此称为批梯度下降法,对应的,我们可以每一次让参数只针对一个数据点进行移动,即

\theta = \theta + \alpha(y^{(i)}-f_\theta(x)^{(i)})x^{(i)}

2、最小二乘法矩阵求解

X = \left[ \begin{array} {cccc} (x^{(1)})^T\\ (x^{(2)})^T\\ \ldots \\ (x^{(n)})^T \end{array} \right]

$$Y = \left[ \begin{array} {cccc} y^{(1)}\\ y^{(2)}\\ \ldots \\ y^{(n)} \end{array} \right]$$

$$h_\theta(x)=X\theta$$

$$z^Tz = \sum_i z_i^2$$

$$J(\theta)=\frac{1}{2}(X\theta-Y)^T(X\theta-Y)$$

为了最小化J,求导:

\begin{align*} \frac{\partial{J(\theta)}}{\partial\theta} &= \frac{\partial}{\partial\theta} \frac{1}{2}(X\theta-Y)^T(X\theta-Y) \\ &= \frac{1}{2}\frac{\partial}{\partial\theta} (\theta^TX^TX\theta - Y^TX\theta-\theta^T X^TY - Y^TY) \\ \end{align*}

$$\theta = (X^TX)^{(-1)}X^TY $$

评价指标

常用R2,可避免量纲不一致的问题,

$$R^2: = 1-\frac{\sum^{m}_{i=1}(y^{(i)} - \hat y^{(i)})^2}{\sum^{m}_{i=1}(\bar y - \hat y^{(i)})^2} =1-\frac{\frac{1}{m}\sum^{m}_{i=1}(y^{(i)} - \hat y^{(i)})^2}{\frac{1}{m}\sum^{m}_{i=1}(\bar y - \hat y^{(i)})^2} = 1-\frac{MSE}{VAR}$$

5、sklearn.linear_model参数详解:

fit_intercept : 默认为True,是否计算该模型的截距。如果使用中心化的数据,可以考虑设置为False,不考虑截距。注意这里是考虑,一般还是要考虑截距

normalize: 默认为false. 当fit_intercept设置为false的时候,这个参数会被自动忽略。如果为True,回归器会标准化输入参数:减去平均值,并且除以相应的二范数。当然啦,在这里还是建议将标准化的工作放在训练模型之前。通过设置sklearn.preprocessing.StandardScaler来实现,而在此处设置为false

copy_X : 默认为True, 否则X会被改写

n_jobs: int 默认为1. 当-1时默认使用全部CPUs ??(这个参数有待尝试)

可用属性:

coef_:训练后的输入端模型系数,如果label有两个,即y值有两列。那么是一个2D的array

intercept_: 截距

可用的methods:

fit(X,y,sample_weight=None):
X: array, 稀疏矩阵 [n_samples,n_features]
y: array [n_samples, n_targets]
sample_weight: 权重 array [n_samples]
在版本0.17后添加了sample_weight

get_params(deep=True): 返回对regressor 的设置值

predict(X): 预测 基于 R^2值

score: 评估

import numpy as np 
#建立随机数
np.random.seed(1234)
x =  np.random.rand(500,3)
#建立y与x的映射关系 y = 4.2+5.7X1+10.8X2
y = x.dot(np.array([4.2,5.7,10.8]))
#np.dot()返回数组的点积
#sklearn求解


import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
#调用模型
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):
        temp0 = np.dot(X.T,X)
        temp = np.dot(np.linalg.inv(temp0),X.T)
        self.w = np.dot(temp,y)
    def predict(self,X):
        y_pred = np.dot(X,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)))
#梯度下降法


class LR_GD():
    def _init_(self):
        self.w = None
    def fit(self,X,y,alpha = 0.02,loss = 1e-10):
        y = y.reshape(-1,1)
        [m,d] = np.shape(X)
        self.w = np.zeros((d))
        tol = 1e5
        if tol >loss:
            told= y-np.dot(X,self.w)
            self.w = self.w - 1/m *alpha * (np.dot(told , X))
            tol = np.abs(np.sum(told))
    def predict(self,X):
        y_pred = np.dot(X,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)))

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值