目录

1 线性回归

1.1 定义

1.2 目标函数(损失函数)的由来

2 最小二乘法

3 为什么线性回归要求假设因变量符合正态分布

4 python实现​​​​​​​


1 线性回归

1.1 定义

线性回归到底要干什么,顾名思义很简单,即在已有数据集上通过构建一个线性的模型来拟合该数据集特征向量的各个分量之间的关系,对于需要预测结果的新数据,我们利用已经拟合好的线性模型来预测其结果。关于线性回归的方法,现在使用得比较广泛的就是梯度下降最小二乘法。

线性模型在二维空间中就是一条直线,在三维空间是一个平面,高维空间的线性模型不好去描述长什么样子;如果这个数据集能够用一个线性模型来拟合它的数据关系,不管是多少维的数据,我们构建线性模型的方法都是通用的。

吴恩达机器学习视频,第一节课讲的就是线性回归算法,课程里面提到了一个非常简单的案例:房屋估价系统。房屋估价系统问题就是当知道房屋面积、卧室个数与房屋价格的对应关系之后,在得知一个新的房屋信息后如何得到对应的新房屋价格,如果我们将房屋面积用x1表示,卧室个数用x2表示,即房屋价格h(x)可以被表示为房屋面积与卧室个数的一维线性方程:
                   

这就是我们所说的线性模型,当然这个案例中只有房屋面积和卧室个数两个特征分量作,现实情况下我们要拟合的模型可能有相当多的特征分量,那么线性模型中对应的权重值θ也会有相同多的数量。为了方便表示我们使用矩阵和向量来表示这些数据:

向量θ(长度为n)中每一个分量都是估计表达式函数h(x)中一个参数,矩阵X(m*n)表示由数据集中每一个样本的特征向量所组成的矩阵。其实这样一个看起来很简单的式子,它的本质经常就是一个规模极其庞大的线性方程组。如果我们用向量Y(长度为m)来表示数据集的实际值,如果用实际值来建立一个方程组,参数向量θ中的每一个值就是我们要求的未知量;大多数情况下建立的是一个超定方程组(没有确定的解),这个时候我们只能求出超定方程组的最优解。

通过建立一个损失函数来衡量估计值和实际之间的误差的大小,我们将最小化损失函数作为一个约束条件来求出参数向量的最优解。                   
                   

函数J(θ)即为损失函数,它计算出数据集中每一个样例的估计值和实际值的平方差并求取平均。然后就是我们的最小二乘法了,最小二乘法通过数学推导(后面给出证明)可以直接得到一个标准方程,这个标准方程的解就是最优的参数向量。

1.2 目标函数(损失函数)的由来

先忽略什么是目标函数。对于上面的结论我们显然可以延展,对于n维的特征,如果用线性模型来求解的话,有:

而对于某个特征 i,其实际值与理论值肯定存在误差

此时,我们做第二个假设,我们假设每个特征值的误差都满足:独立、同分布。那么y可以写成:

由于我们假设了误差满足独立同分布,因此由 中心极限定理 可知误差之和必定能满足一个均值为0,误差为的高斯分布。因此,对于误差,其概率密度函数都可以写出:

把误差代入上述概率密度函数中,其结果就变成,在指定x下y关于的函数。也就是这样:

这样对于m个样本我们可以求它的似然函数L,经过一系列化简后得到

求似然函数的最大值,前一项为固定值,因此我们提取后一项,得到一个关于的函数,我们把这个函数叫做损失函数或者目标函数,因此我们只需要求目标函数的最小值即可。目标函数会贯穿整个机器学习的几乎所有模型中,几乎所有模型都在找它的目标函数,有了这个目标函数就可以对进行求解了。

2 最小二乘法

我们定义观测结果 y 预测结果 y' 之间的差别为Rss(和上文提到的J(θ)是一个意思):

设若参数的矩阵为θθ=(θ1,θ3……,θd,θ0)是一个((d+1)*1)的矩阵,θ0是常数参数。d代表样本由d个属性描述。

把数据集 D 表示一个 m*(d+1) 大小的矩阵 X。

    h(X) = X * θ

那么

按照我们的定义,这个Rss的意思是yy'之间的差,那么当Rss无限趋近于0的时候,则y≈y',即我们求得的预测结果就等于实际结果。

于是,令Rss等于某一极小值,则

对参数求导θ,得:

展开,得

进而就可以得到

于是我们就得到正规方程了。

附上机器学习西瓜书的讲解:

关于矩阵求导,详见:矩阵的求导_意念回复的博客-CSDN博客_前导不变后导转置

3 为什么线性回归要求假设因变量符合正态分布

3指数分布族函数与广义线性模型(Generalized Linear Models,GLM)_意念回复的博客-CSDN博客_广义线性模型连接函数

4.3节。

广义线性模型不是一个模型,而是一类模型的总称,当一个模型属于指数分布族时,我们认为该模型是广义线性模型的一个特例,每一个特定的广义线性模型对应一个特定的分布,比如我们现在提到的线性回归模型,对应的是正态分布

与之相似的,我们熟悉的逻辑斯蒂回归也是广义线性模型的特例,其对应的分布是伯努利分布。其他的还有泊松回归对应泊松分布等。

广义线性模型中,每一个分布都对应存在一个正则联结函数(Canonical Link Function),这一函数的反函数可以将线性函数映射到该分布的期望。

举个例子,通过正态分布的正则联结函数的反函数,我们可以将线性模型映射到正态分布的期望值μ,这正是我们所熟悉的线性回归模型中所做的事情。

对于其他的模型,比如逻辑斯蒂回归,正是通过 sigmoid 函数将其映射到了伯努利分布的期望P其实说到这里,答案已经出来了,为什么线性回归要求假设因变量符合正态分布?这是因为线性回归对一个新的数据的预测值,其本身就是正态分布的期望,如果我们所使用的数据本身不符合正态分布,那么强行使用线性回归显然会得到一个很差的结果

4 python实现

使用sklearn上的boston房价预测数据集,对预测集进行预测,得到预测结果的评估结果RMSE。

# -*- coding: utf-8 -*-from sklearn import datasets
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as pltclass LinearRegression:trained = Falsedef __init__(self):passdef fit(self, feature, target):'''使用最小二乘法进行训练'''self.X = np.mat(feature)tem_max = np.ones((len(feature),1)) # 每个向量添加一个分量1,用来对应系数θ0self.X = np.hstack((self.X, tem_max))self.Y = np.mat(target).Tprint(np.shape(self.Y))X_T = self.X.T # 计算X矩阵的转置矩阵self.theta = (X_T * self.X).I * X_T * self.Y # 通过最小二乘法计算出参数向量print(self.theta)self.trained = Truedef predict(self, feature):if not self.trained:print("You haven't finished the regression!")returnpre_X = np.mat(feature)tem_max = np.ones((len(feature), 1))pre_X = np.hstack((pre_X, tem_max))predict_result = np.matmul(pre_X, self.theta)return predict_resultdef rmse(predict, test):MSE = np.sum(np.power((predict-test.reshape(-1, 1)), 2))/len(test)RMSE = np.sqrt(MSE)# MSE = np.sum(np.power((predict - test), 2)) / len(test)return RMSEdef plot(test_feature, result):# 设置matplotlib 支持中文显示mpl.rcParams['font.family'] = 'SimHei'  # 设置字体为黑体mpl.rcParams['axes.unicode_minus'] = False  # 设置在中文字体是能够正常显示负号(“-”)plt.figure(figsize=(10,10))# 绘制预测值plt.plot(result, 'ro-', label="预测值")plt.plot(test_feature, 'go--', label="真实值")plt.xlabel("样本序号")plt.ylabel("房价")plt.title("线性回归预测-梯度下降法")plt.legend()plt.show()if __name__ == "__main__":# 加载数据boston = datasets.load_boston()train_feature, test_feature, train_target, test_target = train_test_split(boston.data, boston.target, test_size=0.3, random_state=o)# print(train_feature, test_feature, train_target, test_target,sep="\n")# print(train_feature.shape, test_feature.shape, train_target.shape, test_target.shape, sep="\n")lr = LinearRegression()# 模型训练lr.fit(train_feature, train_target)# 模型预测predict_result = lr.predict(test_feature)# print(predict_result.shape, test_target.shape)# print(type(predict_result), type(test_target))# rmsermse_value = rmse(predict_result,test_target)print(rmse_value)plot(test_target, predict_result)

机器学习算法(十):线性回归之最小二乘法相关推荐

  1. [机器学习-回归算法]一元线性回归用最小二乘法的推导过程

    一元线性回归用最小二乘法的推导过程 在数据的统计分析中,数据之间即变量x与Y之间的相关性研究非常重要,通过在直角坐标系中做散点图的方式我们会发现很多统计数据近似一条直线,它们之间或者正相关或者负相关. ...

  2. 机器学习算法之线性回归

    一.什么是回归算法 回归算法是一种有监督算法 回归算法是一种比较常用的机器学习算法,用来建立"解释"变量(自变量X)和观测值(因变量Y)之间的关系:从机器学习的角度来讲,用于构建一 ...

  3. 机器学习 线性回归算法_探索机器学习算法简单线性回归

    机器学习 线性回归算法 As we dive into the world of Machine Learning and Data Science, one of the easiest and f ...

  4. 机器学习算法之——线性回归

    线性回归是最简单的机器学习模型,其形式简单,易于实现,以下是它的2种原生实现方式及通过sklearn库实现方式,供比较. 线性回归模型假设函数:                             ...

  5. 机器学习算法1_线性回归

    通俗描述 线性回归模型是利用线性函数对一个或多个自变量和因变量(y)(y)(y)之间关系进行拟合的模型. 公式推导 数据输入 给定数据集D={(x1,y1),(x2,y2),-,(xm,ym)},yi ...

  6. 机器学习算法总结--线性回归和逻辑回归

    1. 线性回归 简述 在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析.这种函数是一个或多个称为回 ...

  7. 机器学习算法基础——线性回归

    39.线性回归的定义以及矩阵的运算 回归--目标值连续 线性模型 试图学得一个通过属性的线性组合来进行预测的函数: f(x)=w1x1+w2x2+-+wdxd+b w为权重,b称为偏置项,可以理解为: ...

  8. 机器学习(3) 一元线性回归(最小二乘法实现)

    一元线性回归是分析只有一个自变量x 和 因变量y 线性相关关系的方法.一个经济指标的数值往往受许多因素影响,若其中只有一个因素是主要的,起决定性作用,则可用一元线性回归进行预测分析. 一元线性回归分析 ...

  9. 机器学习算法_五分钟了解机器学习十大算法

    本文为有志于成为数据科学家或对此感兴趣的读者们介绍最流行的机器学习算法. 机器学习是该行业的一个创新且重要的领域.我们为机器学习程序选择的算法类型,取决于我们想要实现的目标. 现在,机器学习有很多算法 ...

  10. Machine Learning:十大机器学习算法

    转载自 Machine Learning:十大机器学习算法 摘要: - 机器学习算法分类:监督学习.无监督学习.强化学习 - 基本的机器学习算法:线性回归.支持向量机(SVM).最近邻居(KNN).逻 ...

最新文章

  1. 自己实现Java RPC框架一:RMI
  2. 各浏览器驱动下载地址
  3. 安装class-dump
  4. LeetCode Algorithm 22. 括号生成
  5. 保存模型后无法训练_如何解决推荐系统工程难题——深度学习推荐模型线上serving?...
  6. hash算法_到底什么是Hash?Hash算法的原理和实际应用讲解
  7. jgroups_JGroups:无需额外基础架构的领导人选举
  8. js不用reverse反转数组代码_JavaScript 数组排序
  9. (计算机组成原理)第四章指令系统-第一节2:扩展操作码
  10. 重磅!国内公司欧卡智舶发布全球首个「城市内河无人船」数据集
  11. python装饰器代码简洁_Python基础知识之装饰器(示例代码)
  12. sed截取连接数升高时的慢日志
  13. 怎么在线制作gif动图?推荐一款gif表情包在线制作生成器
  14. C语言基础(七)字符串 类型重定义 结构体
  15. 区块链技术指2.3 基于区块链的电子货币
  16. 1125 斐波那契数列
  17. etcd教程(二)—clientv3简单使用
  18. 快应用开发工具黑屏解决方案
  19. springboot项目搭建0051-通用mapper使用mapper.xml
  20. yolov7_obb在WIN10下训练自己的数据集

热门文章

  1. vue项目每次更新后清除浏览器缓存
  2. SecureCRT安装破解教程
  3. 【转载】英语动词第三人称s的发音规则
  4. 薪资16K,进华为外包怎么样?
  5. 基于UDP的简易网络聊天室
  6. Catia二次开发:数组,局部变量等,msgbox,背景颜色,enable属性,图片模块,vb的common dialog控件,键盘鼠标事件,text操作
  7. 小白如何快速绘制原型图
  8. 模重复平方计算法的C实现
  9. 百度地图开发 —— 去除百度地图左下角Logo
  10. 什么是网站跳出率?一招教你如何处理高跳出率?