精华内容
下载资源
问答
  • 利用 Python 编写线性回归

    千次阅读 2018-11-19 18:08:57
    在本文中,我们将使用 Python 包 statsmodels 来估计,解释和可视化线性回归模型。在此过程中,我们将讨论各种主题,包括: 简单和多元线性回归 可视化 内生性和遗漏变量偏差 二阶最小二乘法 简单线性回归 我们...

    作者:chen_h
    微信号 & QQ:862251340
    微信公众号:coderpai


    简介

    线性回归是分析两个或者多个变量之间关系的标准工具

    在本文中,我们将使用 Python 包 statsmodels 来估计,解释和可视化线性回归模型。在此过程中,我们将讨论各种主题,包括:

    • 简单和多元线性回归
    • 可视化
    • 内生性和遗漏变量偏差
    • 二阶最小二乘法

    简单线性回归

    我们希望确定机构中的差异是否有助于解释观察到的经济结果。我们如何衡量制度差异和经济结果?

    在文本中,经济结果用 1995 年人均国内生产总值代表,并根据汇率进行调整。制度差异由政治风险服务小组建立的 1985 - 1995 年平均征收保护指数代表。本文中使用的这些变量和其他数据可在 Daron Acemoglu 的网页上下载。

    我们将使用 pandas 的 .read_stata() 函数将 .dta 文件中包含的数据读入数据帧。

    import pandas as pd
    
    df1 = pd.read_stata('https://github.com/QuantEcon/QuantEcon.lectures.code/raw/master/ols/maketable1.dta')
    df1.head()
    
    shortnam euro1900 excolony avexpr logpgp95 cons1 cons90 democ00a cons00a extmort4 logem4 loghjypl baseco
    0 AFG 0.000000 1.0 NaN NaN 1.0 2.0 1.0 1.0 93.699997 4.540098 NaN NaN
    1 AGO 8.000000 1.0 5.363636 7.770645 3.0 3.0 0.0 1.0 280.000000 5.634789 -3.411248 1.0
    2 ARE 0.000000 1.0 7.181818 9.804219 NaN NaN NaN NaN NaN NaN NaN NaN
    3 ARG 60.000004 1.0 6.386364 9.133459 1.0 6.0 3.0 3.0 68.900002 4.232656 -0.872274 1.0
    4 ARM 0.000000 0.0 NaN 7.682482 NaN NaN NaN NaN NaN NaN NaN NaN

    让我们用一个散点图来看一下人均 GDP 与征收指数保护之间是否存在明显的关系。

    import matplotlib.pyplot as plt
    plt.style.use('seaborn')
    
    df1.plot(x='avexpr', y='logpgp95', kind='scatter')
    plt.show()
    

    在这里插入图片描述

    该图显示了征收与人均 GDP 之间存在相当强的正相关关系。

    具体而言,如果对征收的更高保护是衡量制度质量的指标,那么更好的制度似乎与更好的经济结果正相关(人均 GDP 更高)。

    鉴于这种情节,选择线性模型来描述这种关系似乎是一个合理的假设。

    我们可以把我们的模型写成:

    logpgp95i=β0+β1avexpri+μilogpgp95_{i} = \beta_{0} + \beta_{1}avexpr_{i} + \mu_{i}

    其中,

    • β0\beta_{0} 是 y 轴上线性趋势线的截距;
    • β1\beta_{1} 是线性趋势线的斜率,表示保护风险对人均 GDP 的边际效应
    • μi\mu_{i} 是随机误差项(由于未包含在模型中的因素,观测值与线性趋势的偏差)

    在视觉上,这个线性模型涉及选择最合适数据的直线,如下:

    import numpy as np
    
    # Dropping NA's is required to use numpy's polyfit
    df1_subset = df1.dropna(subset=['logpgp95', 'avexpr'])
    
    # Use only 'base sample' for plotting purposes
    df1_subset = df1_subset[df1_subset['baseco'] == 1]
    
    X = df1_subset['avexpr']
    y = df1_subset['logpgp95']
    labels = df1_subset['shortnam']
    
    # Replace markers with country labels
    plt.scatter(X, y, marker='')
    
    for i, label in enumerate(labels):
        plt.annotate(label, (X.iloc[i], y.iloc[i]))
    
    # Fit a linear trend line
    plt.plot(np.unique(X),
             np.poly1d(np.polyfit(X, y, 1))(np.unique(X)),
             color='black')
    
    plt.xlim([3.3,10.5])
    plt.ylim([4,10.5])
    plt.xlabel('Average Expropriation Risk 1985-95')
    plt.ylabel('Log GDP per capita, PPP, 1995')
    plt.title('Figure 2: OLS relationship between expropriation risk and income')
    plt.show()
    

    在这里插入图片描述

    估计线性模型参数(β\beta)的最常用技术是普通最小二乘法(OLS)。

    顾名思义,OLS 模型通过找到最小化残差平方和的参数来解决。即:

    minβ^i=1Nμi^2\underset{\hat{\beta}}{min} \sum_{i=1}^{N}\hat{\mu_{i}}^{2}

    其中,μ^\hat{\mu} 观察值和因变量预测值之间的差异。

    为了估计常数项 β0\beta_{0} ,我们需要在数据集中添加一列 1(如果用 β0\beta_{0}xi=1x_{i}=1 替代 β0\beta_{0},则考虑方程式 )

    df1['const'] = 1
    

    现在我们可以使用 OLS 函数在 statsmodels 中构建我们的模型。

    我们将 pandas 函数帧与 statsmodels 一起使用,但是标准数组也可以用作参考。

    import statsmodels.api as sm
    
    reg1 = sm.OLS(endog=df1['logpgp95'], exog=df1[['const', 'avexpr']], missing='drop')
    type(reg1)
    
    statsmodels.regression.linear_model.OLS
    

    到目前为止,我们已经构建了我们的模型。我们需要使用 .fit() 来获得参数估计 β0^\hat{\beta_{0}}β1^\hat{\beta_{1}}

    results = reg1.fit()
    type(results)
    
    statsmodels.regression.linear_model.RegressionResultsWrapper
    

    我们现在将拟合的回归模型存储在结果中。要查看 OLS 回归结果,我们可以调用 .summary() 方法。

    print(results.summary())
    
                                OLS Regression Results                            
    ==============================================================================
    Dep. Variable:               logpgp95   R-squared:                       0.611
    Model:                            OLS   Adj. R-squared:                  0.608
    Method:                 Least Squares   F-statistic:                     171.4
    Date:                Mon, 19 Nov 2018   Prob (F-statistic):           4.16e-24
    Time:                        17:03:03   Log-Likelihood:                -119.71
    No. Observations:                 111   AIC:                             243.4
    Df Residuals:                     109   BIC:                             248.8
    Df Model:                           1                                         
    Covariance Type:            nonrobust                                         
    ==============================================================================
                     coef    std err          t      P>|t|      [0.025      0.975]
    ------------------------------------------------------------------------------
    const          4.6261      0.301     15.391      0.000       4.030       5.222
    avexpr         0.5319      0.041     13.093      0.000       0.451       0.612
    ==============================================================================
    Omnibus:                        9.251   Durbin-Watson:                   1.689
    Prob(Omnibus):                  0.010   Jarque-Bera (JB):                9.170
    Skew:                          -0.680   Prob(JB):                       0.0102
    Kurtosis:                       3.362   Cond. No.                         33.2
    ==============================================================================
    
    Warnings:
    [1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
    

    从结果中,我们可以看到:

    • 截距 β0^=4.63\hat{\beta_{0}} = 4.63
    • 斜率 β1^=0.53\hat{\beta_{1}} = 0.53
    • 正的 β1^\hat{\beta_{1}} 参数估计意味着制度质量对经济结果有积极影响
    • β1^\hat{\beta_{1}} 的 p 值为 0.000 意味着制度对 GDP 的影响具有统计显著性(使用 p< 0.05 作为拒绝规则)
    • R平方值 0.611

    使用我们的参数估计,我们现在可以将我们的估计关系写为:

    logpgp95i^=4.63+0.53avexpri\hat{logpgp95_{i}} = 4.63+0.53avexpr_{i}

    上述的方程是对我们数据的最好的拟合,正如图二描述的。

    我们能使用这个等式去对我们的数据进行预测,比如当我们的 avexpr 为 7.07 时,我们就可以得到对数 GDP 为 8.38。

    mean_expr = np.mean(df1_subset['avexpr'])
    mean_expr
    
    6.515625
    
    predicted_logpdp95 = 4.63 + 0.53 * 7.07
    predicted_logpdp95
    
    8.3771
    

    获得此结果的一种更加简单(也更加准确)的方法是使用 .predict() 并设置 constat=1 和 avexpri = mean_expr 。

    results.predict(exog=[1, mean_expr])
    
    array([8.09156367])
    

    我们可以通过在结果上调用 .predict() 来获取数据集中 avexpri 的每个值的预测 logpgp95i 数组。

    根据 avexpri 绘制预测值,表明预测值位于我们上面拟合的线性线上。

    为了比较目的,还绘制了 logpgp95i 的观察值。

    # Drop missing observations from whole sample
    
    df1_plot = df1.dropna(subset=['logpgp95', 'avexpr'])
    
    # Plot predicted values
    
    plt.scatter(df1_plot['avexpr'], results.predict(), alpha=0.5, label='predicted')
    
    # Plot observed values
    
    plt.scatter(df1_plot['avexpr'], df1_plot['logpgp95'], alpha=0.5, label='observed')
    
    plt.legend()
    plt.title('OLS predicted values')
    plt.xlabel('avexpr')
    plt.ylabel('logpgp95')
    plt.show()
    

    在这里插入图片描述


    来源:https://lectures.quantecon.org/py/ols.html

    展开全文
  • python编写线性回归程序

    千次阅读 2018-03-31 12:47:18
    在网上本来找到了程序模板以为新建python项目然后导过去就能用了,可是我还是想的太简单,导过去后程序有很多库并没有,就像这样。本来还有sklearn库,不过我用pip install sklearn 安装了,如果你没有pip,请先安装...

    在网上本来找到了程序模板以为新建python项目然后导过去就能用了,可是我还是想的太简单,导过去后程序有很多库并没有,就像这样。本来还有sklearn库,不过我用pip install sklearn 安装了,如果你没有pip,请先安装pip。


    然后pandas也是要安装的,也是命令行直接pip install pandas

    然后matplotlib是python中强大的画图模块,安装它pip install matplotlib

    记得,每个模块的版本一定要和你python的版本对应,其实,直接用pip命令安装模块就好了。

    如果导入模块有问题就重新装一遍吧,可把我累惨了。搞定后是这样的


    展开全文
  • python实现简单的线性回归利用python实现简单的线性回归今天,我们将纯粹使用python来实现最流行和最直接的回归技术-简单的线性回归。当我说纯粹使用python。它指的是没有使用任何python机器学习库...

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

    Simple-Linear-Regression.jpg?w=600

    用python实现简单的线性回归

    利用python实现简单的线性回归

    今天,我们将纯粹使用python来实现最流行和最直接的回归技术-简单的线性回归。当我说纯粹使用python。它指的是没有使用任何python机器学习库。

    当我说简单的线性回归,你在想什么?让我猜猜:实现简单的线性回归这么简单?

    理解简单的线性回归比线性回归更容易

    时间复杂度水平,简单的线性回归将花费更少的时间来处理?

    当我说简单线性回归的时候,也许我以上的分析你都猜测过,也许上述假设在技术上是合理的。但有一个特别的理由称之为简单的线性回归。首先,让我们来了解为什么我们称之为简单的线性回归。然后我们可以开始我最喜欢的部分,在python中编写简单的线性回归。

    构建简单的线性回归,而不使用任何Python机器学习库

    什么是简单线性回归?

    在线性回归分析文章中,我们主要集中在解释线性回归的概念。我们在描述线性回归通用方程时使用下面的方程:

    latex.php?latex=%5Chat%7By%7D+%3D+%7Bw%7D_%7B0%7D+%2B+%7Bw%7D_%7B1%7D+%2A+%7Bx%7D&bg=ffffff&fg=000&s=0

    上述方程更可能是直线方程。

    latex.php?latex=%5Ctextrm%7B+y+%3D+m%2Ax+%2B+c+%7D&bg=ffffff&fg=000&s=0

    其中m是直线的斜率,c是常数值。如果我们比较上述两个方程,我们可以感知这两个方程的相似程度。他们只是在写的方式不同,其他都是相同的。

    在线性回归中,m(

    latex.php?latex=%7Bw%7D_%7B1%7D&bg=ffffff&fg=000&s=0)值称为回归系数,c(

    latex.php?latex=%7Bw%7D_%7B0%7D&bg=ffffff&fg=000&s=0)值称为常数。在上面的方程中,我们只有一个因变量,一个自变量。这就是我们只有一个系数的原因。

    从属变量 - > y或

    latex.php?latex=%5Chat%7By%7D&bg=ffffff&fg=000&s=0

    自变量 - > x或

    latex.php?latex=%7Bx%7D&bg=ffffff&fg=000&s=0

    如果我们有k个自变量。我们将得到k个系数值。如果我们有多个独立变量来预测依赖值,那么它被称为线性回归算法。当我们只有一个自变量来预测依赖值时,那么它是简单的线性回归问题。

    让我给更多的例子认识线性回归和简单的线性回归问题之间的区别。

    简单的线性回归示例使用房间的特征数来预测房价。房间数是自变量,价格是因变量。

    考虑学生学习的时间,学生将得到预测分数百分比。时间数是自变量,分数百分比是因变量。

    给定时间来预测房间外的温度。时间是自变量,温度是因变量。

    线性回归示例使用像房间数,使用年限,花园空间大小预测房价。房间数,使用年限,花园面积是自变量,房价是因变量

    通过考虑学生在英语,数学,物理上花费的时间,可以预测学生将获得分百分比。学生在英语,数学和物理学上花费的时间是自变量,学生得分百分比是因变量。

    给定时间,气候细节预测房间外的温度。时间和气候细节是自变量,温度是因变量。

    有了上述解释,我希望我解决简单线性回归和线性回归之间的差异。

    简言之:

    简单线性回归:有一个自变量来预测因变量。

    线性回归:具有多个自变量以预测因变量。

    现在让我们在python中构建简单的线性回归,而不使用任何机器库。

    为了实现简单的线性回归,我们需要知道以下公式。

    用于计算平均值的公式。

    用于计算方差值的公式。

    计算两个系列读数之间协方差的公式(对于假设的X,Y)

    计算W0和W1值的公式。

    计算平均值的公式

    latex.php?latex=%5Ctextrm%7Bmean%28x%29%7D+%3D+%5Cfrac%7B%28x_1%29%2B+%28x_2%29%2B%28x_3%29+...+%2B+%28x_n%29%7D+%7Bn%7D&bg=ffffff&fg=000&s=0

    用于计算方差值的公式

    latex.php?latex=%5Csigma%5E2+%3D+%5Cfrac%7B%5Cdisplaystyle%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%28x_i+-+mean%28x%29%29%5E2%7D+%7Bn-1%7D&bg=ffffff&fg=000&s=0

    用于计算协方差的公式

    latex.php?latex=cov_%7Bx%2Cy%7D%3D%5Cfrac%7B%5Csum_%7Bi%3D1%7D%5E%7BN%7D%28x_%7Bi%7D-mean%28x%29%29%28y_%7Bi%7D-mean%28y%29%29%7D%7BN-1%7D&bg=ffffff&fg=000&s=0

    计算W0和W1值的公式

    latex.php?latex=%7Bw%7D_1+%3D+%5Cfrac%7Bcovariance%28x%2Cy%29%7D+%7Bvariance%28x%29%7D&bg=ffffff&fg=000&s=0

    latex.php?latex=%7Bw%7D_0+%3D+mean%28y%29+-+%28w_1+%2A+mean%28x%29%29&bg=ffffff&fg=000&s=0

    我们将使用所有上面列出的公式在Python中实现简单的线性回归,而没有任何机器学习库。

    在python中实现简单线性回归的过程中。我们将实现所有上述公式。然后我们将使用实现的函数来构建简单的线性回归模型。

    之后,我们将使用python表格分析包来实现同样简单的线性回归模型,只有少数几行代码。我们可以将其视为检查前的实现。

    让我们开始按顺序构建所需的函数。平均值函数。

    方差函数。

    协方差函数。

    计算W0和W1值的函数。

    函数计算平均值

    b0e75a71c2e14a20bf57dadfa07a45be.png

    计算方差值的函数

    71126db105134c6ea53db3f3ee54e094.png使用cal_variance函数,我们将计算readings的方差。

    使用已经实现的cal_mean函数,我们计算平均值。

    然后我们计算readings中的每个readings与平均值之间的差值。之后,我们对计算的差值进行平方,并将平方差值存储在 mean_difference_squared_readings中。

    找到mean_difference_squared_readings的和,并返回方差和readings长度 -1的数的比率。

    计算协方差值的函数

    02c6fc41a7cd422fb9b6ad4962152b9f.png使用cal_covariance函数,我们将计算readings_1和readings_2之间的协方差。这里我们指的是readings_1和readings_2之间的协方差。

    使用已经实现的cal_mean函数计算readings_1和readings_2的平均值。

    然后将读数_1和读数_2的平方差的乘积相加。

    最后,返回协方差和(reads_size - 1)的比率。

    使用上述函数,我们准备好计算简单的线性回归系数W0和W1值。一旦我们实现了这些,我们可以使用这些值来执行预测。

    计算W0和W1的值

    9ecd5e375c214294be82d921f07a14a5.png

    从上述计算公式,我们正在创建cal_simple_linear_regression_coefficients函数来计算W0和W1。

    计算w1值,我们需要找到x_readings和y_readings的协方差比和x_readings的方差。

    使用w1我们计算w0的值。

    最后,我们返回了W0和W1的值

    现在让我们使用所有上面实现的函数来使用简单的线性回归技术来预测房价。

    Predicting-House-price-with-Python.jpg?resize=768%2C768

    我们使用相同的房价数据用python实现线性回归。

    让我们先加载数据集,看看数据集中有什么特征。要加载数据集,我们将使用python数据分析库pandas。

    63a23b0215a14e4198145f22443170fe.png

    我们给出了数据集所在的input_path。

    使用input_path,我们将数据加载到pandas数据框架中。

    接下来,使用加载的数据框架,我们调用simple_linear_regression模型。

    在simple_linear_regression函数内部,现在我们只是得到头名称并尝试打印头名称。

    如果我们在我们的系统中准备好了pandas设置。我们可以期望下面的输出。

    脚本输出

    64128375b1db4e46b684ebd84a31f91f.png

    从脚本输出,我们知道我们有一个独立变量(square_feet)和一个因变量(price)。我们的目的是使用square_feet和价格读数来计算简单的线性回归系数。然后我们将使用计算的简单线性回归系数来预测房价。

    现在让我们写一个简单的函数来显示房子的价格如何随着square_feet变化。我们将使用散点图来可视化。

    f721c30bea0847068c110589bc62cb83.png

    现在让我们调用scatter_graph函数,将squre_feet读数作为x参数,将价格读数作为y参数。

    a26ae1f41ef64f1b943ca4f95d510586.png

    现在,让我们使用房价数据集来建模简单的线性回归。

    990b2783f4df4612aafc23507d55c63c.png

    在simple_linear_regression函数中。我们使用已经实现的cal_mean函数来计算square_feet和price的平均值。

    接下来,我们使用已经实现的cal_variance函数来计算square_feet和price 的方差。

    之后,我们计算W0和W1值。

    我们正在使用W0和W1值来执行预测。这只是预测房价给square_feet价值。

    查看下面的完整代码:

    cde65d691a194d138623359e35e84b97.png

    2a0105f1bab74997973848b505deab9e.png

    6fd02cc4afdf4e5fa5e95248dc1906ce.png

    bf7696e7b088495b8b18d29dd9be4165.png

    4990368a3baa406881d290bfb4f794f6.png

    庆祝下吧!这里我们实现了简单的线性回归,并且没有使用任何机器学习库。

    完整的代码可以为我们的Github:简单的线性回归代码

    英文原文:http://dataaspirant.com/2017/02/15/simple-linear-regression-python-without-any-machine-learning-libraries/

    译者:winston英文原文:http://dataaspirant.com/2017/02/15/simple-linear-regression-python-without-any-machine-learning-libraries/

    译者:winston

    展开全文
  • python实现线性回归.md

    千次阅读 2018-09-22 15:42:55
    python实现线性回归 一、相关数学推导 1.问题描述 所谓线性回归,就是给你一批数据比如房子的面积以及房子的价格,然后你所做的就是找到一条线能尽量的拟合这一批数据。如下所示。 其中红色点就是给出的数据...

    python实现线性回归

    一、相关数学推导

    1.问题描述

    所谓线性回归,就是给你一批数据比如房子的面积以及房子的价格,然后你所做的就是找到一条线能尽量的拟合这一批数据。如下所示。

    这里写图片描述

    其中红色点就是给出的数据集合,有size代表面积,而price代表价格,红色点点就代表实际统计的数据,而线性回归的目的就在于找到那条最好的绿色直线,能使得这个绿色直线与所有红色点的差距最小。

    2. 误差函数引出

    上面可以看出我们要找到一条绿色的直线来拟合红色的点,在这里我假设这条绿色直线为:hθ(x)=θ0+θ1xh_\theta(x) = \theta_0 +\theta_1x ,这个函数也叫做假设函数,因为这条是我假设出来的,那么这个假设函数和真正的数据的距离可以使用欧式距离表示出来(当然你也可以使用其他的方式表示) 12mi=1mhθ(xi)yi\frac{1}{2m} \sum_{i=1}^m (h_\theta(x^i) - y^i) ,这里计算的就是所有样本点的误差值,其中m代表所有红色点的个数,而xi,yix^i ,y^i 代表着第i个样本数,也就是第i个红色点的横坐标以及纵坐标,在有了上面的引入后,自然而然就得到了相应的误差函数为J(θ0,θ1)=12mi=1mhθ(xi)yiJ(\theta_0,\theta_1) = \frac{1}{2m} \sum_{i=1}^m (h_\theta(x^i) - y^i) 其中hθ(x)=θ0+θ1xh_\theta(x) = \theta_0 +\theta_1x,所以我们现行回归的问题本质就是找到对应的θ0,θ1\theta_0,\theta_1 使得J(θ0,θ1)J(\theta_0,\theta_1) 最小化。

    3. 梯度下降法

    在求解最小化的过程中有一种方法叫做梯度下降法。让我们先看一下简单的梯度下降的过程,假如现在误差函数为J=θ2J = \theta ^2 ,假如目前我们 θ\theta 的初始化为2,那么梯度下降的方式就是按照斜率(导数)的方向向下走,即θ=θαdJdθ\theta = \theta -\alpha \frac {dJ}{d\theta} ,其中α\alpha 代表学习率,你可以看做每次减小是的步长,如果α\alpha 比较大那么下降会快,小的话下降会慢,对于这个例子来说就是 θ=2α22\theta = 2- \alpha *2*2,如果我们取α=0.3\alpha = 0.3 那么经过这个梯度下降后θ\theta 更新为0.8,而根据J=θ2J = \theta ^2 的图像我们可以看出JJ 是在朝着最低点的方向走去。

    在这里插入图片描述

    4. 对我们的误差函数进行梯度下降

    在有了2、3的结论下,我们就可以对我们的误差函数进行梯度下降了,这样通过多次的迭代我们就能找到相应的θ0,θ1\theta_0 ,\theta_1 是的我们的误差函数最小。

    这里写图片描述

    所以剩下的事情就是求出来J(θ0,θ1)J(\theta_0,\theta_1)θ0,θ1\theta_0,\theta_1 的导数,这里需要高等数学的知识,在这里直接给出结论。

    在这里插入图片描述

    蓝色框中的内容就是J(θ0,θ1)J(\theta_0,\theta_1)θ0,θ1\theta_0,\theta_1 的偏导数,而前面α\alpha 对应还是学习率。

    5.问题矩阵化

    其实在有了4的结论我们就可以直接编程了,但是由于更新θ\theta 的时候两个式子不同,并且里面还有累加,所以导致我们计算不方便,所以这里就把整个问题矩阵话,这样的话我们使用python编写程序就可以直接使用numpy进行矩阵操作,而不使用for循环,并且还可以通过小技巧是的两个更新只变成一个矩阵的更新。

    在这里我们把所有的样本红色点的xx 变成一个m1m*1 的向量 XX,每一行代表相应红色点的size ,同样的把 yy 也变成一个m1m*1 的向量YY,而把θ0θ1\theta_0 和 \theta_1 变成一个2*1的列向量θ\theta,这样就发生一个有趣的事情,你会发现给XX 左边进行扩充一列1,那么你用XθX *\theta 后得到一个m1m*1 的向量,这个向量的每一行其实就是 θ0+θ1x\theta_0 + \theta_1 x 也就是我们上面所谓的假设函数,在这里我们通过矩阵你发现可以一次性计算出m个假设函数,并且通过矩阵化给XX 扩充一列,就能消除 θ0,θ1\theta_0,\theta_1 的区别。这样的话4的梯度下降就能改写成如下格式 :

    θ=θα1mXT(XθY)\theta = \theta - \alpha \frac{1}{m} X^T (X\theta-Y) 其中XX 是扩展过1后的矩阵, θ\theta 则是θ0,θ1\theta_0,\theta_1 组成,其实这个式子就是4中的那个只是换了一种表达方式而已,你可以自己手动吧4中的式子展开,就是一个矩阵乘法。

    二 、python编制代码

    1. 加载数据

    # 产生数据
    def load_data():
        # 样本个数
        sample_size = 50
        x = np.mat(np.random.rand(sample_size,1)*10)
        # y是数据标签 大概样子就是3.6x+(+-2)
        y = np.array([3.6*x[i] + random.uniform(-1,1) for i in  range(x.shape[0])])
        y=np.mat(y.reshape(sample_size,1))
        return x,y
    
    # v2版本 这个产生的数据可以在x前面加上一列1,这样可以避免b
    def load_data_v2():
        x,y = load_data()
        one = np.mat(np.ones((x.shape[0],1)))
        x_ = np.c_[one,x]
        return x_,y  
    

    第一个load_data就是产生的正常数据第二个load_data 主要目的就是给x扩充一列1.

    2. 求导数

    # 损失函数对w求偏导数
    def derivative_w(x,y,w):
        m = x.shape[0]
        dw = x.T*(x*w-y)/m
        return dw    
    

    求导数只需要按照上面的公式进行就行了 。

    3.计算损失值

    # 计算损失值  
    def loss(x,y,w):
        y_i = x* w
        return np.sum((y-y_i).T*(y-y_i))/x.shape[0]  
    

    就是每次你得到一个模型,就计算一下其和真正数据的偏差有多少。

    4. 迭代梯度下降预测模型

    def L_Regression():
        # 每次喂入数据量
        batch_size = 30
        # 学习率
        learing_rate = 1e-3
        # 总共训练次数
        step = 50000
        
        itear = []
        loss_value = []
        x,y = load_data_v2()
        # w 就是模型的权重,这里随机初始化
        #w = np.random.rand(1,1)
        w = np.random.rand(2,1)
        # 每次喂入一批数据的开始和结束
        start = 0
        end = start + batch_size
        # 进行迭代更新w以及b的值
        for i in range (step):
            w = w- learing_rate*derivative_w(x[start:end],y[start:end],w)
            if (i+1) %1000 ==0:
                loss_v = loss(x[start:end],y[start:end],w)
                print("the step is %d th,the loss is %f"%(i,loss_v))
                itear+=[i]
                loss_value+=[loss_v]
            start = (start+batch_size)%x.shape[0]
            end = start + batch_size
        # y_i 是预测值
        y_i = x*w
        #进行绘图
        fig = plt.figure()
        ax1 = fig.add_subplot(121)
        ax1.scatter(x.getA()[:,1],y.getA(),color = "yellow")
        ax1.plot(x.getA()[:,1],y_i,color = "skyblue")
        ax2 = fig.add_subplot(122)
        ax2.plot(itear,loss_value,color = "gray")  
    

    其中多了一个batch_size 的东西,主要是每次不把所有数据喂入,而是训练一部分,这样减小内存消耗。

    参考

    吴恩达机器学习
    https://blog.csdn.net/qq_28888837/article/details/81258339

    欢迎大家关注我的微信公众号,未来上面会推送python 机器学习 算法学习 深度学习 论文阅读 以及偶尔的小鸡汤等内容。ようこそいらっしゃい!
    微信公众号

    展开全文
  • python 进行线性回归by Tirthajyoti Sarkar 由Tirthajyoti Sarkar In this article, we discuss 8 ways to perform simple linear regression using Python code/packages. We gloss over their pros and cons, and...
  • 作者 |苏南下来源 |机器会学习ML(ID:AI_Learning007)摘要:通俗易懂介绍线性回归算法,并 Python 手写实现。之前我们介绍了:kNN 算法,主...
  • python线性回归-脚本

    2020-06-10 12:27:00
    回归问题 下面以这个例子为例: 函数:f(特征)->特征值 f(身高)->(体重) 拟合 预测 首先我们把需要分析的数据导入放在python文件夹下 然后我们还要导入第三方工具,来实现可视化数据 pip install matplatlib...
  • 基于Python线性回归预测模型实践 参考自《从零开始学数据分析与挖掘》 [中]刘顺祥 著 线性回归预测模型属于经典的统计学模型,该模型的应用场景是根据已知的变量(即自变量)来预测某个连续的数值变量(因变量)。...
  • 摘要:通俗易懂介绍线性回归算法,并 Python 手写实现。 之前我们介绍了:kNN 算法,主要用于解决分类问题,也可以解决回归问题,它有很多优缺点,其中一个缺点是模型结果不具有可解释性,而很多时候我们是希望得到...
  • 线性回归1、基本概念线性回归假设因变量与自变量之间存在线性关系,因变量可通过自变量线性叠加而得到,即因变量和自变量之间可用如下方式表示。式中为自变量,为权重系数,为偏置。线性回归就是要解决如何利用样本...
  • 最近有人问我一个问题,我数学不好,代码基础薄弱,英语一般般,如何入门当今最为前沿的...下面我们通过机器学习的入门模型——线性回归,从数学说起,以代码着手,一步步推导出可以应用于实践的模型。 线性回归的...
  • python有妙用” 本文约2000字,阅读需要6分钟关键词:Python 线性回归 应用 数据团优秀学员亲授学好数据分析的秘籍! p.s. 文...
  • 线性回归 1、基本概念线性回归假设因变量与自变量之间存在线性关系,因变量可通过自变量线性叠加而得到,即因变量和自变量之间可用如下方式表示。式中为自变量,为权重系数,为偏置。线性回归就是要解决如何利用样本...
  • 今天,让我们来谈谈线性回归。没错,作为数据科学界元老级的模型,线性回归几乎是所有数据科学家的入门必修课。抛开涉及大量数统的模型分析和检验不说,你真的就能熟练应用线性回归了么?未必!“宝刀不老”的线性...
  • 手把手教你用Python线性回归

    千次阅读 多人点赞 2019-03-05 16:17:43
    我们自己写的线性回归比较简单,我只能目测,凭直觉感觉损失函数已经达到了最小值,我们就停在10000次吧。 看得再多,不如自己动手。阅读下一章节之前,请自己实现一元线性回归。 这里有现成的代码,供你参考...
  • python编写函数 数据科学和机器学习的伟大现代斗争之一是“ Python vs. R”。 毫无疑问,近年来两者都已经取得了巨大的发展,成为数据科学,预测分析和机器学习的顶级编程语言。 实际上,根据IEEE最近的一篇文章,...
  • 利用线性回归算法,在波士顿房价数据集上实现预测任务,要求不调用现成的线性回归库函数,利用numpy编写线性回归算法,并通过梯度下降的方式迭代更新线性回归的参数(不直接使用正规方程求解),准确率达到85%以上。...
  • 写这篇文章之前,首先要对自己做一个小小的反思,很多时候在学习新技术的时候,看到出了什么什么框架,在这个框架上什么什么方法可以直接拿过来用,这样的好处就是我们可以减少写代码量,几个函数就可以帮我们解决...
  • 线性回归python实现

    千次阅读 2017-07-30 10:57:11
    一、什么是线性回归(Linear Regression) ... 线性回归最简单的定义:给出一个点集D,用一个函数去拟合这个点集,并且使得点集与拟合函数间的误差最小,如果这个函数曲线是一条直线,那就被称为线性回归 二、最小
  • python学习之利用sklearn库自带的函数实现典型回归的回归算法(线性回归,lasso回归,岭回归,弹性网络算法) 利用python的sklearn库自带的函数线性回归,lasso回归,岭回归,弹性网络算法)对给定数据集进行预测...
  • python实现多元线性回归

    千次阅读 2018-10-16 19:54:27
    python实现多元线性回归,先不使用sklearn.linear_model模块,编写如下: #导模块 import numpy as np import pandas as pd #变量初始化 X=[] Y=[] B=[] Q_e=0 Q_E=0 #从csv文件中读取数据 def get_data(file_...
  • 本文主要介绍如何逐步在Python中实现线性回归。而至于线性回归的数学推导、线性回归具体怎样工作,参数选择如何改进回归模型将在以后说明。 回归 回归分析是统计和机器学习中最重要的领域之一。有许多可用...
  • 对于大多数数据科学家而言,线性回归方法是他们进行统计学建模和预测分析任务的起点。这种方法已经存在了 200 多年,并得到了广泛研究,但仍然是一个积极的研究领域。由于良好的可解释性,线性回归在商业数据上的...
  • Python代码实现线性回归一般式的2种方法1、梯度下降-矩阵形式2、标准方程法sklearn实现对比标准方程法 1、梯度下降-矩阵形式 上篇文章介绍了一元线性回归,包括Python实现和sklearn实现的实例、对比,以及一些问题点...
  • 使用线性回归可以解决这个问题吗?让我们一起来看看。注意:阅读本文的前提是了解线性回归!目录什么是逻辑回归?数据集可视化假设和成本函数从头开始训练模型模型评估Scikit-learn实现什么是逻辑回归?回想一下线性...
  • python机器学习算法实训 – (一) 线性回归 线性回归 此系列权作本学期机器学习课堂笔记 以后会持续更新各类算法(希望)ppt内容来自老师 每个算法的代码都同时自己编写实现和用sklearn实现了一次 欢迎批评斧正^ ^...
  • 前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 PS:如有需要Python学习资料的小伙伴可以加...由于良好的可解释性,线性回归在商业数据上的用途十分广
  • 线性回归可能是最常见的算法之一,线性回归是机器学习实践者必须知道的。这通常是初学者第一次接触的机器学习算法,了解它的操作方式对于更好地理解它至关重要。 所以,简单地说,让我们来分解一下真正的问题:什么...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,520
精华内容 3,008
关键字:

python编写线性回归函数

python 订阅