【机器学习】(一) 线性模型之Linear Regression

【机器学习】(一) 线性模型之Linear Regression前言一 原理 1 算法含义 2 算法特点二 实现 1 sklearn 中的线性回归 2 用 Python 自己实现算法三 思考 面试常问 参考前言线性回归 LinearRegres 基本上可以说是机器学习中最简单的模型了 但是实际上其地位很重要 计算简单 效果不错 在很多其他算法中也可以看到用其其作为一部分 机器学习所针对的问

前言

一、原理

   1.算法含义

   2.算法特点

二、实现

  1.sklearn中的线性回归

  2.用Python自己实现算法

三、思考(面试常问)

参考


前言

       线性回归(Linear Regression)基本上可以说是机器学习中最简单的模型了,但是实际上其地位很重要(计算简单、效果不错,在很多其他算法中也可以看到用其其作为一部分)。机器学习所针对的问题有两种:一种是回归,一种是分类。回归是解决连续数据的预测问题,而分类是解决离散数据的预测问题。线性回归是一个典型的回归问题。其实中学时期我们就接触过,叫最小二乘法。


一、原理

   1.算法含义

     “线性回归”试图学得一个线性模型以尽可能准确地预测实值输出标记。(《机器学习》–周志华 )

     在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合(自变量都是一次方)。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。(百度百科)

   2.算法特点

二、实现

1.sklearn中的线性回归

(1) sklearn对广义线性模型(Generalized Linear Models)的定义如下:

          拟合一条直线使得损失最小,损失可以有很多种,比如平方和最小等等;

【机器学习】(一) 线性模型之Linear Regression

         【注】y是输出,x是输入,输出是输入的一个线性组合。

【机器学习】(一) 线性模型之Linear Regression
         【注】系数矩阵就是coef_,截距就是intercept_

(2) sklearn对广义线性模型中的线性回归算法(Linear Regression)的定义如下:

          首先sklearn将线性回归称做Ordinary Least Squares ( 普通最小二乘法 ),sklearn定义 LinearRegression 类是拟合系数为  【机器学习】(一) 线性模型之Linear Regression的线性模型, 目的在于最小化样本集中观测点和线性近似的预测点之间的残差平方和

          其实就是解决如下的一个数学问题:【机器学习】(一) 线性模型之Linear Regression

(3)线性回归基本图形

【机器学习】(一) 线性模型之Linear Regression

(4)sklear中LinearRegression的参数与实现

  成员函数:

      fit (X,y)  :  以数组Xy为输入

成员变量:

     coef_     : 存储线性模型的系数 w存储

from sklearn import linear_model reg = linear_model.LinearRegression() reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])

结果如下:

【机器学习】(一) 线性模型之Linear Regression

reg.coef_

 结果如下:

【机器学习】(一) 线性模型之Linear Regression

(5) 特殊情况

       然而,最小二乘的系数估计依赖于模型特征项的独立性。当特征项相关,并且设计矩阵X 的列近似线性相关时,设计矩阵便接近于一个奇异矩阵,此时最小二乘估计对观测点中的随机误差变得高度敏感,产生较大方差。例如,当没有试验设计的收集数据时,可能会出现这种多重共线性(multicollinearity )的情况。

    【注】multicollinearity指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关关系而使模型估计失真或难以估计准确。

本文以sklearn自带的糖尿病数据集()为例:

     Diabetes:包含442个患者的10个生理特征(年龄,性别、体重、血压)和一年以后疾病级数指标

     载入数据,同时将diabetes糖尿病数据集分为测试数据和训练数据,其中测试数据为最后20行,训练数据为前422行。

 #数据集获取 diabetes = datasets.load_diabetes() #载入数据 diabetes_x = diabetes.data[:, np.newaxis] #获取一个特征 #数据集划分 diabetes_x_temp = diabetes_x[:, :, 2] diabetes_x_train = diabetes_x_temp[:-20] #训练样本 diabetes_x_test = diabetes_x_temp[-20:] #测试样本 后20行 diabetes_y_train = diabetes.target[:-20] #训练标记 diabetes_y_test = diabetes.target[-20:] #预测对比标记 print(u'划分行数:', "[总数据量]",len(diabetes_x_temp)," [训练集]", len(diabetes_x_train)," [测试集]", len(diabetes_x_test)) print(diabetes_x_test) #20行测试数据,每行仅一个特征 #回归训练及预测 clf = linear_model.LinearRegression() clf.fit(diabetes_x_train, diabetes_y_train) #注: 训练数据集

详细代码见https://download.csdn.net/download/walk_power/

测试结果如下:

数据集划分

【机器学习】(一) 线性模型之Linear Regression

系数,残差平方和,方差

【机器学习】(一) 线性模型之Linear Regression

 图形(散点:实际位置 ,直线:预测位置)

【机器学习】(一) 线性模型之Linear Regression

2.用Python自己实现算法

 

公式推导:

\large \left ( w^{*} \right,b^{*} )=arg_{\left ( w,b \right )}min\sum_{i=1}^{m}\left (f(x_{i})-y_{i} \right )^{2}

      用最小二乘法对w和b进行估计。把w和b吸收入向量形式,w’ = (w;b),相应的数据集D表示为一个m*(d+1)的矩阵X,其中每一行对应一个示例,该行前d个元素对应于示例的d个属性值,最后一个元素恒为1。则对于上面的公式有:

\large \hat{w}^{*} = arg_{\hat{w}}min\left ( y-X \right\hat{w} )^{T}( y-X \right\hat{w} )

对w’求导得:

【机器学习】(一) 线性模型之Linear Regression

令上式为零(当X^TX为满秩矩阵或正定矩阵时可得):

【机器学习】(一) 线性模型之Linear Regression

令xi’ = (xi;1)则线性回归模型为:

\large f(\hat{x}_{i})=\hat{x}_{i}(X^{T}X)^{-1}X^{T}y

核心公式:\large Y=X\theta,而\large \theta =(X^{^{T}}X)^{-1}X^{T}y

import numpy as np X_=np.linalg.inv(X.T.dot(X)) #调用numpy里的求逆函数 theta=X.dot(X.T).dot(Y) #X.T表示转置,X.dot(Y)表示矩阵相乘

具体实现:

''' 线性回归算法 ''' class LinearRegression_SelfDefined(): def __init__(self): #1.新建变量 self.w = None def fit(self, X, y): #2.训练集的拟合 X = np.insert(X, 0, 1, axis=1) #增加一个维度 print (X.shape) X_ = np.linalg.inv(X.T.dot(X)) #公式:求X的转置(.T)与X矩阵相乘(.dot(X)),再求其逆矩阵(np.linalg.inv()) self.w = X_.dot(X.T).dot(y) #上述公式与X的转置进行矩阵相乘,再与y进行矩阵相乘 def predict(self, X): #3.测试集的测试反馈 X = np.insert(X, 0, 1, axis=1) #增加一个维度 y_pred = X.dot(self.w) #X与self.w所表示的矩阵相乘 return y_pred

详细代码见https://download.csdn.net/download/walk_power/

结果如下:

【机器学习】(一) 线性模型之Linear Regression

三、思考(面试常问)

1.什么是线性分类模型,什么是非线性分类模型,它们各有什么有优缺点?

     区分是否为线性模型,主要是看一个乘法式子中自变量x前的系数w,如果w只影响一个x(注:应该是说x只被一个w影响),那么此模型为线性模型。或者判断决策边界是否是线性的。不满足线性模型的情况即为非线性模型。只考虑二类的情形,所谓线性分类器即用一个超平面将正负样本分离开,表达式为 y=wx 。这里是强调的是平面。而非线性的分类界面没有这个限制,可以是曲面,多个超平面的组合等。

    线性分类模型(LR,贝叶斯分类,单层感知机、线性回归)优缺点:算法简单和具有“学习”能力。线性分类器速度快、编程方便,但是可能拟合效果不会很好。

    非线性分类模型(决策树、RF、GBDT、多层感知机)优缺点:非线性分类器编程复杂,但是效果拟合能力强

2.线性回归和逻辑回归有什么区别和联系?

    ①区别:线性回归用来预测(如:房价预测),逻辑回归用来分类(如:疾病诊断);线性回归是拟合函数,逻辑回归是预测函数;线性回归的参数计算方法是最小二乘法,逻辑回归的参数计算方法是梯度下降法。(附上吴恩达讲解)

    ②联系:逻辑回归比线性回归多了一个Sigmoid函数,使样本能映射到[0,1]之间的数值,用来做分类问题。

3.写出线性回归算法的步骤并分析其优缺点。

    见上文


参考

1.  线性回归公式推导(二)

2.  回归算法——python实现线性回归

3.【Python数据挖掘课程】五.线性回归知识及预测糖尿病实例

4. 《机器学习》周志华

5.  Scikit-learn API文档

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231142.html原文链接:https://javaforall.net

(0)
上一篇 2026年1月25日 下午7:01
下一篇 2026年1月25日 下午7:22


相关推荐

  • Python 基础语法(一)「建议收藏」

    Python 基础语法(一)「建议收藏」Python的特点1.简单Python是一种代表简单思想的语言。2.易学Python有极其简单的语法。3.免费、开源Python是FLOSS(自由/开放源码软件)之一。4.高层语

    2022年7月6日
    22
  • idea激活码2021-激活码分享

    (idea激活码2021)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~MLZP…

    2022年3月21日
    71
  • 职业社交网站为何比微博更有价值

    职业社交网站为何比微博更有价值

    2021年8月18日
    59
  • PHP实现一个简单的图书管理系统

    PHP实现一个简单的图书管理系统刚刚我收到了一个消息,老师竟然布置了一个课设,要求做一个后台管理系统。做归做,但是!本着为老师节省时间的心态,我花了大量的时间,消耗了无数脑细胞扫描了一遍老师给的课题,最终掐指一算选了一个最简单的——>"图书管理系统"。刚开始我的想法是用jsp+(struts2+spring+hibernate)+Oracle写的,毕竟以前也用这玩意写过类似的东西,等我打开Oracl…

    2022年5月31日
    35
  • 2019(初级)PHP最全常见面试题集合(附答案)!

    2019(初级)PHP最全常见面试题集合(附答案)!1 常见状态码 1xx 临时响应 表示临时响应并需要请求者继续执行操作的状态代码 100 继续 请求者应当继续提出请求 服务器返回此代码表示已收到请求的第一部分 正在等待其余部分 101 切换协议 请求者已要求服务器切换协议 服务器已确认并准备切换 102 由 WebDAV RFC2518 扩展的状态码 代表处理将被继续执行 2xx 成功 表示成功处理了请求的状态代码

    2026年3月27日
    3
  • Redis分布式锁的原理以及如何续期

    Redis分布式锁的原理以及如何续期面试问题 Redis 锁的过期时间小于业务的执行时间该如何续期 问题分析首先如果你之前用 Redis 的分布式锁的姿势正确 并且看过相应的官方文档的话 这个问题 Soeasy 我们来看很多同学在用分布式锁时 都是直接百度搜索找一个 Redis 分布式锁工具类就直接用了 其实 Redis 分布式锁比较正确的姿势是采用 redisson 这个客户端工具如何回答默认情况下 加锁的时间是 30

    2026年3月16日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号