返回顶部
首页 > 资讯 > 后端开发 > Python >python中怎么推导线性回归模型
  • 224
分享到

python中怎么推导线性回归模型

2023-06-02 09:06:51 224人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章给大家介绍python中怎么推导线性回归模型,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先,先看一张图:图是我们在初中学习过的直角坐标系二维平面,上面遍布着一些点。从整体趋势看,y随x的增大而增大。如果曾经

这篇文章给大家介绍python中怎么推导线性回归模型,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

首先,先看一张图:

python中怎么推导线性回归模型

图是我们在初中学习过的直角坐标系二维平面,上面遍布着一些点。从整体趋势看,y随x的增大而增大。如果曾经你和我一样,数学每次考试都是90的话,那么接下来,我相信你会情不自禁地做一件事:

python中怎么推导线性回归模型

没错,我们会以(0,0)和(10,10)为两点,画出一条贯穿其中的线,从视觉上,这条红线正好把所有点一分为二,其对应的数学表达式为:

y=x

 而这就是我们线性回归所要做的事:找到一组数学表达式(图中的红线),用来反映数据(图中的点)的变化规律。

目标有了,问题也来了:

贯穿图中密密麻麻点的线有无数条,为什么不是y=2x,y=x+1,偏偏是y=x呢?

我们又是通过何种方法去找到这条线呢?

先解决第一个问题,上天书:

python中怎么推导线性回归模型

这个式子就是第一个问题的解,没见过的符号太多,看不懂是吧?那么我来翻译一下:

  1. 先求出(每个点的Y值-以每个点的X值通过函数求出的Y值)的平方

  2. 求和;

  3. 乘以1/2

再通俗点:

把每个点的实际y值与它通过某个函数求出的y值的差的平方加起来,再乘以1/2。

而文章开篇中的均方差损失,MSE,平方损失函数,二次代价函数其实都指的是它。这个式子其实计算的是真实值和用函数预测的值之间的误差之和。那么第一个问题就迎刃而解了:哪一个表达式所求出的误差和最小,就是我们要找的那条“红线”。

我们继续解决第二个问题,先上图:

python中怎么推导线性回归模型

这个问题还要简单,我们只要从斜率为0的那条“红线”(y=0*X)开始画线,然后一点点增大斜率,每条线求一个误差值,找出其中误差值最小的那条线,就大功告成了。而中间有着巨大计算量的遍历过程,我们可以通过Python,瞬间完成。

————————

线性回归的Python实现

————————

重点:梯度下降

导入一些包,待用:

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt

import seaborn as sns
sns.set_context('notebook')
sns.set_style('white')

导入案例数据:

model_data = pd.read_csv('model_data.csv',engine='python')
model_data.head()

python中怎么推导线性回归模型

数据是一份上海的房价数据,我们要把房屋价格作为因变量y,房屋面积,房间数附近餐饮POI数量,评论,距离市中心距离等作为自变量,拟合一个线性回归模型,用于预测房价。

根据要求提取自变量和因变量:

feat_cols = model_data.columns.tolist()[1:]
print(feat_cols)

python中怎么推导线性回归模型

X =  model_data[feat_cols].values
y = model_data['价格'].values

构建损失函数:

def Cost_Function(X,y,theta):
    '''
    需要传入的参数为
    X:自变量
    y:应变量
    theta:权重
    使用均方误差(MSE),作为损失函数
    '''
    m = y.size  #求出y的个数(一共多少条数据)
    t = X.dot(theta) #权重和变量点乘,计算出使用当前权重时的预测值
    c = 0 #定义损失值
    c = 1/(2*m) * (np.sum(np.square(t-y))) 
    #预测值与实际值的差值,平方后除以数据的条数,计算出均方误差。最后乘以1/2(无实际意义,方便以后计算)
    return c #返回损失值

*θ为每个变量前的权重,什么是权重?比如y=2x,2就是自变量x的权重

求损失值我们就用先前说到的损失函数。如果你够仔细,可能会有一个问题,我们的损失函数前需要乘以一个1/2,似乎没有特别的意义。恭喜你很机智,1/2的确没有任何意义,只是为了接下来方便求导。

构建梯度下降法:

def GradientDescent(X, y, feat_cols, alpha=0.3, num_iters=10000):
    '''
    需传入参数为
    X:自变量
    y:应变量
    feat_cols:变量列表
    alpha:学习率,默认0.3
    num_iters:迭代次数,默认10000次
    使用梯度下降法迭代权重
    '''
    scaler = MinMaxScaler() #最大最小值归一化自变量
    X = scaler.fit_transfORM(X) #归一化
    m = y.size #求出y的个数(一共多少条数据)
    J_history = np.zeros(num_iters) #创建容纳每次迭代后损失值得矩阵,初始值为0
    theta = np.zeros(len(feat_cols)+1) #设置默认权重,0
    for iter in np.arange(num_iters): #根据迭代次数,开始迭代
        t = X.dot(theta) #权重和变量点乘,计算出使用当前权重时的预测值
        theta = theta - alpha*(1/m)*(X.T.dot(t-y))
        #对代价函数求导,算出下降最快的方向,乘以学习率(下降的速度),再用原来的权重相减,得到新的权重
        J_history[iter] = Cost_Function(X, y, theta) #求出新的权重时的损失值,存入矩阵
    return(theta, J_history) #返回最终的权重和历次迭代的损失值

这是构造模型最为核心的部分。我们不断迭代,寻找最优的那条“红线”的过程,其实是在不断调整每个自变量的权重。而每个权重每次到底怎么调整,增大还是减小(方向),这就需要我们对损失函数求导。

如果数学不好,不理解,我们用图来说明一下:

python中怎么推导线性回归模型

好比,我们站在悬崖顶端,要找到最快能达到悬崖底部的方向,那么显而易见,你所在位置最陡峭的方向,就是正确的方向,而求导就是找到最陡峭的方向(切线斜率绝对值最大的点)。

山坡是凹凸不平的,所以我们每走一步都需要重新寻找方向,这就是迭代的过程;其次,每次的步子也不能跨太大,万一跨错地方了,不好纠正,所以我们又需要设置一个步子的大小——学习率

所以梯度下降法的公式就是:

每一次更新的权重= 前一次的权重-学习率*损失函数的导数。

在理解了下山这个场景以后,我们就能顺利的完成梯度下降法的构建,并且通过python函数求出最后每个变量的权重和每次迭代过后的损失值。

构建绘制损失值变化图的函数:

def plot_Cost(GD_result):
    '''
    绘制权重变化情况
    需传入参数为
    GD_result:梯度下降法结果
    '''
    theta , Cost = GD_result #得到权重和损失值
    print('theta: ',theta.ravel()) #打印权重

    plt.plot(Cost) #绘制损失值变化情况
    plt.title('COST change')
    plt.ylabel('Cost')
    plt.xlabel('Iterations')
    plt.grid()
    plt.show()

这个很简单,就是通过前面梯度下降法求得的历次迭代后的损失值,画出变化曲线。

最后把所有函数汇总,就是我们的线性回归模型了:

def lr_function(X,y,feat_cols):
    '''
    需要输入的变量为
    X:自变量
    y:应变量
    feat_cols:变量列表
    '''
    def score(y_p,y):
        '''
        y_p:预测值
        y:真实值
        dimension:样本数量
        计算R^和调整R^    
        '''
        aa=y_p.copy(); bb=y.copy()
        if len(aa)!=len(bb):
            print('not same length')
            return np.nan

        cc=aa-bb
        wcpfh=sum(cc**2) #误差平方和

        # RR means R_Square
        RR=1-sum((bb-aa)**2)/sum((bb-np.mean(bb))**2)
        return RR#返回R^
    X = np.c_[np.ones(X.shape[0]),X]
    GD_result = GradientDescent(X, y, feat_cols)
    plot_Cost(GD_result)
    y_p = np.dot(X,GD_result[0])
    RR = score(y_p,y)
    return RR,y_p,GD_result[0]  #返回R^,预测值

一般对于每个机器学习模型,都需要有一个指标衡量其拟合程度,而线性模型我们使用的是我们所熟知的可决系数R^2。为了求出R^2,我在函数中又套用了一个简单的求解函数,具体过程不赘述了,通读代码就能明白。通常R^2越接近1,表示模型拟合程度越好。

模型封装完毕,下面是见证奇迹的时刻!

model_result = lr_function(X,y,feat_cols)
print('R^2为:{}'.format(round(model_result[0],4)))

python中怎么推导线性回归模型

通过模型,我们求出了每个自变量的权重,图表反应了损失值由大变小的过程,在10000次迭代的过程中,一开始速度很快,越到后面越趋于平缓。

最后是R^2为0.70,有70%的拟合度,尚可。

————————

线性回归模型的验证

————————

为了验证我们自己编写的模型是否准确,我们也可以使用python机器学习工具包sklearn,对同样的数据,用线性回归模型拟合,查看最后的R^2是否一致。

先对变量标准化:

scaler = MinMaxScaler()
X = scaler.fit_transform(X)

 使用LinearRegression()进行拟合,并求出R^2:

lr = LinearRegression()
lr.fit(X,y)
R2 = lr.score(X,y)
print('R^2为:{}'.format(round(R2,4)))

R^2同样为0.7,代表我们自己编写的模型没有问题。

最后,我们绘制一张真实值与预测值对比图,可视化模型结果:

python中怎么推导线性回归模型

关于python中怎么推导线性回归模型就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: python中怎么推导线性回归模型

本文链接: https://lsjlt.com/news/229656.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python中怎么推导线性回归模型
    这篇文章给大家介绍python中怎么推导线性回归模型,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先,先看一张图:图是我们在初中学习过的直角坐标系二维平面,上面遍布着一些点。从整体趋势看,y随x的增大而增大。如果曾经...
    99+
    2023-06-02
  • Python实战教程:拒绝调包,如何用python推导线性回归模型
    最近有人问我一个问题,我数学不好,代码基础薄弱,英语一般般,如何入门当今最为前沿的机器学习领域?均方差损失,MSE,平方损失函数,二次代价函数都是什么意思?这个问题问得好,诸如学好数学,多敲代码,攻克专八这类标准回答我就不多说了。我们这回用...
    99+
    2023-06-02
  • Python构建简单线性回归模型
    目录线性回归模型1.加载数据2.划分训练集和测试集3.训练模型4.预测数据5.画图展示线性拟合情况6.预测数据测试评估模型精度1.计算回归模型精度模型持久化前言: 本文介绍如何构建简...
    99+
    2024-04-02
  • 基于Python多元线性回归模型
    提示:基于Python的多元线性回归模型 文章目录 前言 一、读取数据 二、建立模型  三、预测新值  四、去截距模型 总结 前言 本文主要是基于多元回归线性模型,然后建立模型和分析,解决多元线性回归模型存在的问题...
    99+
    2023-10-24
    python pandas
  • Python中怎么创建线性回归机器学习模型
    Python中怎么创建线性回归机器学习模型,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。线性回归机器学习模型1.要使用的数据集由于线性回归是我们在本文中学习的第一个机器学习模型...
    99+
    2023-06-16
  • python如何建立多元线性回归模型
    要建立一个多元线性回归模型,可以使用Python中的统计库或机器学习库来实现。以下是使用statsmodels和scikit-lea...
    99+
    2024-04-02
  • Python线性回归怎么理解
    这篇文章主要讲解了“Python线性回归怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python线性回归怎么理解”吧!前言:线性回归模型属于经典的统计学模型,该模型的应用场景是根据...
    99+
    2023-06-21
  • Python怎么实现线性回归
    Python怎么实现线性回归,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、概述(1)人工智能学习        &n...
    99+
    2023-06-26
  • Python多元线性回归预测模型实验完整版
    多元线性回归预测模型 实验目的 通过多元线性回归预测模型,掌握预测模型的建立和应用方法,了解线性回归模型的基本原理 实验内容 多元线性回归预测模型 实验步骤和过程 (1)第一步:学习多元线性回归预测模...
    99+
    2023-10-06
    python 线性回归 机器学习
  • Python实现多元线性回归模型的方法详解
    多元线性回归是一种广泛应用于数据分析和机器学习的统计模型。它通过使用多个自变量来预测一个或多个因变量的值。在Python中,我们可以使用许多不同的库和框架来实现多元线性回归模型,例如NumPy、Pandas和Scikit-Lea...
    99+
    2024-01-24
    机器学习
  • R语言实现广义线性回归模型
    目录1 与广义线性模型有关的R函数2 正态分布族3 二项分布族例  R. Norell实验广义线性模型(GLM)是常见正态线性模型的直接推广,它可以适用于连续数据和离散数据...
    99+
    2024-04-02
  • 怎么使用Python线性回归方法
    这篇文章主要讲解了“怎么使用Python线性回归方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Python线性回归方法”吧!来说说约定的符号,线性回归参数主要由斜率和截距组成,这...
    99+
    2023-06-02
  • python一元线性回归怎么实现
    在Python中,可以使用NumPy和Scikit-learn库来实现一元线性回归。以下是一元线性回归的实现步骤:1. 导入所需的库...
    99+
    2023-08-18
    python
  • python多元线性回归怎么实现
    在Python中,可以使用`scikit-learn`库来实现多元线性回归。首先,需要导入所需的库和模块:```pythonfrom...
    99+
    2023-08-18
    python
  • Tensorflow实现线性回归模型的示例代码
    目录1.线性与非线性回归案例讲解1.数据集2.读取训练数据Income.csv并可视化展示3.利用Tensorflow搭建和训练神经网络模型【线性回归模型的建立】4. 模型预测1.线...
    99+
    2024-04-02
  • Python数学建模StatsModels统计回归之线性回归示例详解
    目录1、背景知识1.1 插值、拟合、回归和预测1.2 线性回归2、Statsmodels 进行线性回归2.1 导入工具包2.2 导入样本数据2.3 建模与拟合2.4 拟合和统计结果的...
    99+
    2024-04-02
  • 怎么用Python进行多元线性回归
    本篇内容介绍了“怎么用Python进行多元线性回归”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!图1. 多元回归模型中要用到的公式如图1所示...
    99+
    2023-06-16
  • python实现线性回归的代码怎么写
    这篇文章主要介绍“python实现线性回归的代码怎么写”,在日常操作中,相信很多人在python实现线性回归的代码怎么写问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python实现线性回归的代码怎么写”的疑...
    99+
    2023-06-29
  • 如何使用TensorFlow神经网络构造线性回归模型
    小编给大家分享一下如何使用TensorFlow神经网络构造线性回归模型,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!先制作一些数据:import num...
    99+
    2023-06-25
  • TensorFlow神经网络构造线性回归模型示例教程
    先制作一些数据: import numpy as np import tensorflow as tf import matplotlib.pyplot as plt # 随机生...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作