栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

一元线性回归

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一元线性回归

1.线性回归的概念:

回归用于预测输入变量和输出变量之间的关系,特别是当输入变量的值发生变化时,输出变量的值随之发生的变化。回归模型正是表示从输入变量到输出变量之间映射的函数,回归问题的学习等价于函数拟合:选择一条函数曲线使其很好地拟合已知数据且很好地预测未知数据。

2.线性回归的分类:

如果研究的线性代数只包含一个自变量和一个因变量,且二者的关系可以通过一条直线近似的刻画时,这种回归就称为一元线性回归。

如果回归分析中涉及到两个及以上的自变量,且自变量与因变量是线性关系,就称为多元线性回归。

3.一元线性回归模型的拟合 3.1梯度下降的一般步骤

假设函数:y = f ( x 1 , x 2 , x 3 . . . . x n ) 只有一个极小点。

初始给定参数为X 0 = ( x 1 0 , x 2 0 , x 3 0.... x n 0 ) 。

从这个点如何搜索才能找到 原函数的极小值点?

方法:

①首先设定一个较小的正数 α , ε;

②求当前位置出处的各个偏导数:

③修改当前函数的参数值,公式如下:

 

④如果参数变化量小于 ,退出;否则返回第2步。

3.2梯度下降的三种不同方法

3.2.1批量梯度下降法(Batch Gradient Descent)

使用训练集中的所有数据进行梯度下降的演绎,是一种全局最优解。每迭代一次都需要训练集中的所有样本。

优点:可以得到一个全局最优解。

缺点:当训练集中的样本过大时,迭代速度变得很慢。

3.2.2随机梯度下降法(Stochastic Gradient Descent)

从样本中随机选择一组数据进行迭代,训练速度很快。但是整个过程充满了随机性,最终求得的解往往不是全局最优解,而是局部最优解。当迭代次数足够多时,会接近于全局最优解。

优点:训练速度快。

缺点:过程有随机性,准确度不高。

3.2.3小批量梯度下降法(Mini-batch Gradient Descent)

小批量梯度下降法对包含n个样本的数据集进行计算。综合了上述两种方 法,既保证了训练速度快,又保证了准确度。

3.3一元线性回归函数推导

3.3.1一元函数的初步拟合

 整个推导过程主要用到待定系数法和求导,具体步骤如下:

首先设定一个一元函数,将此函数看作是已知函数,进行梯度下降算法的迭代(注意:此处w和b都是未知量),若要求得最终的函数,我们必须寻找w和b的关系,将其带入进行换元,将两个变量转化为一个变量,寻求最优解。

接下来,通过均方误差损失函数寻找w和b的关系。

3.3.2一元函数拟合的条件寻找

在此,我们可以通过预测值与真实值之间的差方进行总误差的衡量,表现在图像上则为图像整体的离散程度。

如下图所示:

                                

推导过程如下:

                    

通过求出差方,得到均方差的一阶二阶导数。当通过梯度下降法进行拟合时,在最终得到的那一点处,必须满足:1.该点一阶导数为零

2.该点必须是最低点,这就意味着在这一点处是凹的,其偏导等于零(大于零是因为梯度下降,而在该点处是极值,偏导为零,详细可见我写的梯度下降法笔记)

由此,我们可以通过训练集求出x和y的平均数,得到a与b的关系(3.3.2),也就是w和b(3.3.1)的关系,从而能够通过换元法将整个式子化成单一变量的式子,进行梯度下降的拟合。

代码实现:

import numpy as np
from matplotlib import pylab as pl
#Defining training data
x = np.array([1,3,2,1,3])
y = np.array([14,24,18,17,27])
# The regression equation takes the function
def fit(x,y):
    if len(x) != len(y):
        return
    numerator = 0.0
    denominator = 0.0
    x_mean = np.mean(x)
    y_mean = np.mean(y)
    for i in range(len(x)):
        numerator += (x[i]-x_mean)*(y[i]-y_mean)
        denominator += np.square((x[i]-x_mean))
    print('numerator:',numerator,'denominator:',denominator)
    b0 = numerator/denominator
    b1 = y_mean - b0*x_mean
    return b0,b1
    # Define prediction function
def predit(x,b0,b1):
    return b0*x + b1
# Find the regression equation
b0,b1 = fit(x,y)
print('Line is:y = %2.0fx + %2.0f'%(b0,b1))
# prediction
x_test = np.array([0.5,1.5,2.5,3,4])
y_test = np.zeros((1,len(x_test)))
for i in range(len(x_test)):
    y_test[0][i] = predit(x_test[i],b0,b1)
# Drawing figure
xx = np.linspace(0, 5)
yy = b0*xx + b1
pl.plot(xx,yy,'k-')
pl.scatter(x,y,cmap=pl.cm.Paired)
pl.scatter(x_test,y_test[0],cmap=pl.cm.Paired)
pl.show()

结果展示:

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/989639.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号