线性回归

1.含义

线性回归是一种以线性模型来建立因变量与自变量关系的方法,通常分为一元线性回归和多元线性回归。线性回归模型根据定数据集D= {(x1, y1), (x2,y3),…,(xm,ym)},其中xi(xi1; xi2. . . ; xid(d个维度)), yi∈R"线性回归"(linear regression)试图学得一个线性模型以尽可能准确地预测连续型实值输出标记.

2.一般形式

f(x)=ω1x12x23x3+…+ωdxd+b
矩阵形式
f(x)=ωTx+b
ω直观表达了各属性在预测中的重要性,因此线性模型有很好的可解释性

3.误差分析

在这里插入图片描述
上面的红点表示预测值,我们都想让预测值尽可能的去靠近真实值。
线性回归有个很重要的点,假设误差ℇ(i)是独立并且具有相同的分布,并服从均值为0方差为2的正态分布(又叫高斯分布)举个例子 小米和小明都去了银行贷款 独立:小米和小明贷多少钱与对方并没有任何关系,同分布:小米和小明都去了同一家银行。

常用误差平方和来表示线性回归问题的损失函数
在这里插入图片描述

4.一元线性回归

当属性只有一个时,学习得到的模型可以简化成f(xi)=ωxi+b,实际上表示的是一条直线,我们要让这条直线尽可能地拟合每个数据点,将ω和b求出就可以得到模型了。但ω和b可以有很多组,我们希望得到比较好的一组ω和b使得预测效果更好,通过衡量预测的准确性,即衡量 f(xi)于真实值 yi之间的差异可以使用最小二乘法来求,将它们的均方误差最小化。

即(ω,b)= argmin∑mi=1 ( f(xi) - yi )2=argmin∑mi=1 (ωxi+b - yi )2

要最小化,分别对ω和b进行求偏导,凸函数极值点处取到最小值,令偏导都等于0,求得ω和b的最优解
在这里插入图片描述
加粗样式
在这里插入图片描述
在这里插入图片描述

5.多元线性回归

实际生活当中一元线性回归用的不多,没有太大的价值,因为能够影响预测值的属性往往不止一个,可能几十个甚至上百的。ω=(ω1, ω2, … , ωd),ω是一个d x 1的列向量。多元线性求解参数有两种方法,一种是梯度下降,另一种利用最小二乘法来对ω和b进行估计。这里使用最小二乘法利用矩阵进行求解,为了便于运算与表达将 f(x)=ωTx+b中的b收进ω中,变成了f(x)=ωTx,此时ω=(ω1, ω2, … , ωd,ωd+1),其中ωd+1表示b,相应的在x后面添加一个维度,值都为1,下面进行推导:

首先,把数据集D表示成一个m x (d + 1)大小的矩阵X,每一行代表一个样本的特征,也便于建立模型时对数据的使用,Y表示真实值的一个m x 1的列向量Y=(y1, y2, y3,…, ym)

先看看这些要用到的变量
在这里插入图片描述
进行推导
1.实际上这里是对矩阵装置的变化过程,也可以直接利用线性代数转置的性质进行变化
在这里插入图片描述
2.对ω求偏导
L(ω) = ( ωT XT - YT )( X ω - Y)

= ωT XTX ω - ωT XTY - YT X Y + YT Y

因为ωT XTYYT X Y均表示一个一维的数,所以转置一样
L(ω) = ωT XTX ω - 2ωT XTY + YT Y

在这里插入图片描述
最终得到ω = (XTX)-1XTY,但这个公式有一定的局限性,当(XTX)不满秩时,有一个比较简单的情况,属性个数大于样本数时一定不满秩,就会得到多个ω ,它们都能使均方误差最小化.

这个时候可以采取什么办法?

  1. 增加样本数
  2. 剔除一些不重要的特征或共线性特征,进行降维
  3. 常见的做法是引入正则化(regularization)项
    处理1和2往往治标不治本,而且数据也不能随随便便的增删,一般进行正则化处理。本质上是对权重W的约束,将某些无关紧要的特征的权重调小,该特征就越不能起决定作用,就可以让模型更专注于有决定性作用的那些特征。

6.简单的多元线性回归实现

导入模块

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split

简单实现

class LinearReg(): 
    def __init__(self):
        self.coef = None
        self.interception = None 
        self.theta = None
    #模型
    def fit(self,x_train,y_train):
        b0 = np.ones((len(x_train),1))
        x = np.column_stack((b0,x_train))#增加一个维度
        x_T = x.T
        self.theta = np.linalg.inv(x_T.dot(x)).dot(x_T).dot(y_train)
        self.coef = self.theta[1:]
        self.interception = self.theta[0]
    #预测
    def predict(self,x_test):
        b0 = np.ones((len(x_test),1))
        x = np.column_stack((b0,x_test))
        pred = np.ones((len(x),1))
        for i in range(len(x)):
            sum = 0
            for j in range(len(x[0])):
                sum += x[i][j]*self.theta[j]
            pred[i] = sum
        return pred
    #评分
    def R_square_score(self,y,y_pred):
        res = ((y_pred-y)**2).sum()/len(y_pred)
        tot = ((y-y.mean(axis=0))**2).sum()/len(y_pred)
        score_R = 1 - res/tot
        return score_R

利用库里的boston数据建立模型

###引入数据###
load_data=datasets.load_boston()
data_x=load_data.data
data_y=load_data.target.reshape(len(load_data.target),1)
print(data_x.shape)
x_train,x_test,y_train,y_test = train_test_split(data_x,data_y,test_size=0.3)

#训练数据得到模型
model = LinearReg()
model.fit(x_train,y_train)#得到模型
print(model.coef)
print(model.interception)
test_pred = model.predict(x_test)
test_score = model.R_square_score(y_test,test_pred)
print('test_score:',test_score)

test_score: 0.7647573944406656

【初次尝试,有什么不对的欢迎指出】

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值