精华内容
下载资源
问答
  • R语言与多元线性回归+逐步回归

    千次阅读 多人点赞 2019-11-16 12:31:12
    多元线性回归 多元线性回归的核心问题:应该选择哪些变量??? RSS(残差平方和)R2 (相关系数的平方)选择法:遍历所有可能的组合,选出使RSS最小,R2最大的模型。 AIC(Akaike Information Criterion)准则...

    多元线性回归

    多元线性回归的核心问题:应该选择哪些变量???

    • RSS(残差平方和)与R2  (相关系数的平方)选择法:遍历所有可能的组合,选出使RSS最小,R2  最大的模型。
    • AIC(Akaike Information Criterion)准则与BIC(Bayesian Information Criterion)准则

    AIC = n ln (RSSp/n)+2p

    其中:n为变量总个数,p为选出的变量个数(AIC越小越好

    逐步回归

    • 向前引入法:从一元回归开始,逐步增加变量,使指标变量达到最优为止
    • 向后剔除法:从全变量回归方程开始,逐步删去某个变量,使指标到达最优为止
    • 逐步筛选法:综合上述两种方法

    step函数

    image

    根据上图中对该数据集作出的线性回归模型的各个统计量进行分析发现:

    • 在该数据集中的EXAMINATION变量与模型的相关性中没有一个*,从而表示,该变量与该模型没有相关性,可以去除。
    • 模型拟合的相关系数的平方值为:0.7067

    这里使用step函数,R会自动计算原始模型的AIC数值和去除各个变量后AIC的变化情况,从而找到去除模型无关变量,作出更为准确的线性回归模型。

    image

    因为第一次作出的线性回归模型为全变量的模型,所以这里使用step进行逐步回归的时候,只能使用backward或者both方法进行逐步回归。从而得到在去除无关变量EXAMINATION变量后,得到一个拟合效果更好的线性回归模型。

    image

    逐步回归计算实例

    例 6.10 某种水泥在凝固时放出的热量Y(卡/克)与水泥中四种化学成分X1,X2,X3,X4有关,现测得13组数据,如表6.5所示。希望从中选取重要的变量,建立Y关于它们的线性回归方程。

    image

    分析步骤:

    首先作出多元线性回归方程,建立所有变量的回归模型

    image

    从上述建立的回归模型可知,从X1到X4四个变量的“显著性检验”一个*都没有。可见,如果选择全部变量做回归方程,效果是很不好的。

    下面使用函数step()做逐步回归:

    image

    使用step方法处理后的结果如下:

    image

    在使用step函数进行处理的时候,最后一步的操作,无论去掉哪一个变量,AIC值均会升高,因此R软件终止计算,得到了“最优”的回归方程

    可见,现在变量X1,X2,X4的“显著性检验”发生了好转。虽然R2也达到了0.9823,但仍然有不足。在R软件中,还有两个函数可以用来做逐步回归。这两个函数是add1()和drop1():

    image

    从运算结果来看,如果去掉变量X4,AIC值会从24.97增加到25.42,是增加的最少的。另外,除AIC准则外,残差的平方和也是逐步回归的重要指标之一,从直观来看,拟合越好的方程,残差的平方和应越小。去掉X4,残差的平方和上升9.93,也是最少的。因此,从这两个指标来看,应该再去掉变量X4.

    image

    这个结果应该还是满意的,因为所有的检验均是显著的,最后得到“最优”。

    展开全文
  • Python实现多元线性回归

    万次阅读 多人点赞 2018-04-12 21:39:25
    Python实现多元线性回归 线性回归介绍 线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w'x+e,e为误差服从均值为0的...

    Python实现多元线性回归

     

     

    线性回归介绍

     

    线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w'x+e,e为误差服从均值为0的正态分布。回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。
    线性回归属于回归问题。对于回归问题,解决流程为: 
    给定数据集中每个样本及其正确答案,选择一个模型函数h(hypothesis,假设),并为h找到适应数据的(未必是全局)最优解,即找出最优解下的h的参数。这里给定的数据集取名叫训练集(Training Set)。不能所有数据都拿来训练,要留一部分验证模型好不好使,这点以后说。先列举几个几个典型的模型:
    ● 最基本的单变量线性回归: 
    形如h(x)=theta0+theta1*x1
    ● 多变量线性回归: 
    形如h(x)=theta0+theta1*x1+theta2*x2+theta3*x3
    ● 多项式回归(Polynomial Regression): 
    形如h(x)=theta0+theta1*x1+theta2*(x2^2)+theta3*(x3^3) 
    或者h(x)=ttheta0+theta1*x1+theta2*sqr(x2) 
    但是可以令x2=x2^2,x3=x3^3,于是又将其转化为了线性回归模型。虽然不能说多项式回归问题属于线性回归问题,但是一般我们就是这么做的。
    ● 所以最终通用表达式就是: 
    这里写图片描述

     

     

    数据导入与清洗

     

    对于数据导入来说,可以利用pandas内的read_csv的函数来对数据进行导入操作,在进行多元线性回归之间通过简单线性回归来展现线性回归的特性和结果之后再延伸至多元线性回归。

     

    在进行数据导入之间需要导入进行线性回归的包:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    from pandas import DataFrame,Series
    from sklearn.cross_validation import train_test_split
    from sklearn.linear_model import LinearRegression

    我们利用pandas和numpy对数据进行操作,使用matplotlib进行图像化,使用sklearn进行数据集训练与模型导入。

     

    简单线性回归

     

    对于学生来说,所学习的时间和考试的成绩挂钩,所学习的时间与考试的成绩也是呈线性相关。创建一个数据集来描述学生学习时间与成绩的关系并且做简单的线性回归。

     

    in:

    #创建数据集
    examDict  = {'学习时间':[0.50,0.75,1.00,1.25,1.50,1.75,1.75,
                         2.00,2.25,2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
                 '分数':[10,22,13,43,20,22,33,50,62,
                       48,55,75,62,73,81,76,64,82,90,93]}
    
    #转换为DataFrame的数据格式
    examDf = DataFrame(examDict)

     

    通过DataFrame的函数将字典转化为所需要的数据集,也就是学生成绩与考试成绩的数据集。且关于pandas的数据内容Series与DataFrame可以查看关于pandas的博客了解点击打开链接

     

    out:

      分数  学习时间
    0   10  0.50
    1   22  0.75
    2   13  1.00
    3   43  1.25
    4   20  1.50
    5   22  1.75
    6   33  1.75
    7   50  2.00
    8   62  2.25
    9   48  2.50
    10  55  2.75
    11  75  3.00
    12  62  3.25
    13  73  3.50
    14  81  4.00
    15  76  4.25
    16  64  4.50
    17  82  4.75
    18  90  5.00
    19  93  5.50

     

    从上面的数据可以看到数据的特征值与其标签,学生所学习的时间就是所需要的特征值,而成绩就是通过特征值所反应的标签。在这个案例中要对数据进行观测来反应学习时间与成绩的情况,将利用散点图来实现简单的观测。

     

    in:

    #绘制散点图
    plt.scatter(examDf.分数,examDf.学习时间,color = 'b',label = "Exam Data")
    
    #添加图的标签(x轴,y轴)
    plt.xlabel("Hours")
    plt.ylabel("Score")
    #显示图像
    plt.show()

    out:

     

    从上图可以看到对于分数和时间来说存在相应的线性关系,且俩数据间相关性较强。

    在此可以通过相关性来衡量两个变量因素的相关密切程度。

    相关系数是用以反映变量之间相关关系密切程度的统计指标。

    r(相关系数) = x和y的协方差/(x的标准差*y的标准差) == cov(x,y)/σx*σy(即person系数)

    对于相关性强度来说的化有以下的关系:

    0~0.3 弱相关

    0.3~0.6  中等程度相关

    0.6~1  强相关

     

    in:

    rDf = examDf.corr()
    print(rDf)

    out:

    分数      学习时间
    分数    1.000000  0.923985
    学习时间  0.923985  1.000000

     

    pandas中的数学统计函数D.corr()可以反应数据间的相关性关系,可从表值中反应出学习时间与分数之间的相关性为强相关(0.6~1)。对于简单线性回归来来说,简单回归方程为: y = a + b*x (模型建立最佳拟合线)最佳拟合线也是需要通过最小二乘法来实现其作用。对于OLS即最小二乘法我们需要知道的一个关系为点误差,点误差 = 实际值 - 预测值,而误差平方和(Sum of square error) SSE = Σ(实际值-预测值)^2,最小二乘法就是基于SSE实现,最小二乘法 : 使得误差平方和最小(最佳拟合)。解释完简单线性回归后进行对训练集和测试集的创建,将会使用train_test_split函数来创建(train_test_split是存在与sklearn中的函数)

     

    in:

    #将原数据集拆分训练集和测试集
    X_train,X_test,Y_train,Y_test = train_test_split(exam_X,exam_Y,train_size=.8)
    #X_train为训练数据标签,X_test为测试数据标签,exam_X为样本特征,exam_y为样本标签,train_size 训练数据占比
    
    print("原始数据特征:",exam_X.shape,
          ",训练数据特征:",X_train.shape,
          ",测试数据特征:",X_test.shape)
    
    print("原始数据标签:",exam_Y.shape,
          ",训练数据标签:",Y_train.shape,
          ",测试数据标签:",Y_test.shape)
    
    #散点图
    plt.scatter(X_train, Y_train, color="blue", label="train data")
    plt.scatter(X_test, Y_test, color="red", label="test data")
    
    #添加图标标签
    plt.legend(loc=2)
    plt.xlabel("Hours")
    plt.ylabel("Pass")
    #显示图像
    plt.savefig("tests.jpg")
    plt.show()

    out:

    原始数据特征: (20,) ,训练数据特征: (16,) ,测试数据特征: (4,)
    原始数据标签: (20,) ,训练数据标签: (16,) ,测试数据标签: (4,)

     

    tips:由于训练集随机分配的原因每一次运行的结果(点的分布情况,训练集内的情况,测试集内的情况)不都相同在创建数据集之后我们需要将训练集放入skleran中的线性回归模型(LinearRegression())进行训练,使用函数种的.fit函数进行模型的训练操作。

     

    in:

    model = LinearRegression()
    
    #对于模型错误我们需要把我们的训练集进行reshape操作来达到函数所需要的要求
    # model.fit(X_train,Y_train)
    
    #reshape如果行数=-1的话可以使我们的数组所改的列数自动按照数组的大小形成新的数组
    #因为model需要二维的数组来进行拟合但是这里只有一个特征所以需要reshape来转换为二维数组
    X_train = X_train.values.reshape(-1,1)
    X_test = X_test.values.reshape(-1,1)
    
    model.fit(X_train,Y_train)

     

    在模型训练完成之后会得到所对应的方程式(线性回归方程式)需要利用函数中的intercept_与coef_来得到

     

    a  = model.intercept_#截距
    
    b = model.coef_#回归系数
    
    print("最佳拟合线:截距",a,",回归系数:",b)

     

    out:

     

    最佳拟合线:截距 7.5580754557 ,回归系数: [ 16.28401865]

     

    由上述的最佳拟合线的截距和回归系数可以算出其线性回归线方程:y = 7.56 + 16.28*x

    接下来需要对模型进行预测和对模型进行评价,在进行评价之间将会引入一个决定系数r平方的概念。

    对于决定系数R平方常用于评估模型的精确度。

    下列为R平方的计算公式:

    ● y误差平方和 = Σ(y实际值 - y预测值)^2

    ● y的总波动 = Σ(y实际值 - y平均值)^2

    ● 有多少百分比的y波动没有被回归拟合线所描述 = SSE/总波动

    ● 有多少百分比的y波动被回归线描述 = 1 - SSE/总波动 = 决定系数R平方

    对于决定系数R平方来说

    (1) 回归线拟合程度:有多少百分比的y波动刻印有回归线来描述(x的波动变化)

    (2)值大小:R平方越高,回归模型越精确(取值范围0~1),1无误差,0无法完成拟合对于预测来说我们需要运用函数中的model.predict()来得到预测值

     

    in:

    #训练数据的预测值
    y_train_pred = model.predict(X_train)
    #绘制最佳拟合线:标签用的是训练数据的预测值y_train_pred
    plt.plot(X_train, y_train_pred, color='black', linewidth=3, label="best line")
    
    #测试数据散点图
    plt.scatter(X_test, Y_test, color='red', label="test data")
    
    #添加图标标签
    plt.legend(loc=2)
    plt.xlabel("Hours")
    plt.ylabel("Score")
    #显示图像
    plt.savefig("lines.jpg")
    plt.show()
    
    
    score = model.score(X_test,Y_test)
    
    print(score)

     

    out:

    score : 0.834706696876

     

    多元线性回归

     

    在间单线性回归的例子中可以得到与线性回归相关的分析流程,接下来对多元线性回归进行分析对于多元线性回归前面已经提到,形如h(x)=theta0+theta1*x1+theta2*x2+theta3*x3http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv(已经失效)来下载数据集 Advertising.csv,其数据描述了一个产品的销量与广告媒体的投入之间影响。将会利用pandas的pd.read()来读取数据。

     

     

    in:

    #通过read_csv来读取我们的目的数据集
    adv_data = pd.read_csv("C:/Users/Administrator/Desktop/Advertising.csv")
    #清洗不需要的数据
    new_adv_data = adv_data.ix[:,1:]
    #得到我们所需要的数据集且查看其前几列以及数据形状
    print('head:',new_adv_data.head(),'\nShape:',new_adv_data.shape)

    out:

    head:       TV  radio  newspaper  sales
           0  230.1   37.8       69.2   22.1
           1   44.5   39.3       45.1   10.4
           2   17.2   45.9       69.3    9.3
           3  151.5   41.3       58.5   18.5
           4  180.8   10.8       58.4   12.9 
    Shape:  (200, 4)

     

    对于上述的数据可以得到数据中

    标签值(sales):

    • Sales:对应产品的销量

    特征值(TV,Radio,Newspaper):

    • TV:对于一个给定市场中单一产品,用于电视上的广告费用(以千为单位)
    • Radio:在广播媒体上投资的广告费用
    • Newspaper:用于报纸媒体的广告费用

    在这个案例中,通过不同的广告投入,预测产品销量。因为响应变量是一个连续的值,所以这个问题是一个回归问题。数据集一共有200个观测值,每一组观测对应一个市场的情况。接下里对数据进行描述性统计,以及寻找缺失值(缺失值对模型的影响较大,如发现缺失值应替换或删除),且利用箱图来从可视化方面来查看数据集,在描述统计之后对数据进行相关性分析,以此来查找数据中特征值与标签值之间的关系。

     

    in:

    #数据描述
    print(new_adv_data.describe())
    #缺失值检验
    print(new_adv_data[new_adv_data.isnull()==True].count())
    
    new_adv_data.boxplot()
    plt.savefig("boxplot.jpg")
    plt.show()
    ##相关系数矩阵 r(相关系数) = x和y的协方差/(x的标准差*y的标准差) == cov(x,y)/σx*σy
    #相关系数0~0.3弱相关0.3~0.6中等程度相关0.6~1强相关
    print(new_adv_data.corr())

     

    out:

                   TV       radio   newspaper       sales
    count  200.000000  200.000000  200.000000  200.000000
    mean   147.042500   23.264000   30.554000   14.022500
    std     85.854236   14.846809   21.778621    5.217457
    min      0.700000    0.000000    0.300000    1.600000
    25%     74.375000    9.975000   12.750000   10.375000
    50%    149.750000   22.900000   25.750000   12.900000
    75%    218.825000   36.525000   45.100000   17.400000
    max    296.400000   49.600000  114.000000   27.000000
    TV           0
    radio        0
    newspaper    0
    sales        0
    dtype: int64
                     TV     radio  newspaper     sales
    TV         1.000000  0.054809   0.056648  0.782224
    radio      0.054809  1.000000   0.354104  0.576223
    newspaper  0.056648  0.354104   1.000000  0.228299
    sales      0.782224  0.576223   0.228299  1.000000

     

     

     

     

    可以从corr表中看出,TV特征和销量是有比较强的线性关系的,而Radio和Sales线性关系弱一些但是也是属于强相关的,Newspaper和Sales线性关系更弱。接下来建立散点图来查看数据里的数据分析情况以及对相对应的线性情况,将使用seaborn的pairplot来绘画3种不同的因素对标签值的影响

     

    in:

    # 通过加入一个参数kind='reg',seaborn可以添加一条最佳拟合直线和95%的置信带。
    sns.pairplot(new_adv_data, x_vars=['TV','radio','newspaper'], y_vars='sales', size=7, aspect=0.8,kind = 'reg')
    plt.savefig("pairplot.jpg")
    plt.show()

    out:

     

    上如图种所示,可以了解到不同的因素对销量的预测线(置信度= 95 %),也可可以大致看出不同特征对于标签值的影响与相关关系在了解了数据的各种情况后需要对数据集建立模型,在建立模型的第一步我们将建立训练集与测试集同样的将会使用train_test_split函数来创建(train_test_split是存在与sklearn中的函数)

     

    in:

    X_train,X_test,Y_train,Y_test = train_test_split(new_adv_data.ix[:,:3],new_adv_data.sales,train_size=.80)
    
    print("原始数据特征:",new_adv_data.ix[:,:3].shape,
          ",训练数据特征:",X_train.shape,
          ",测试数据特征:",X_test.shape)
    
    print("原始数据标签:",new_adv_data.sales.shape,
          ",训练数据标签:",Y_train.shape,
          ",测试数据标签:",Y_test.shape)

    out:

    原始数据特征: (200, 3) ,训练数据特征: (160, 3) ,测试数据特征: (40, 3)
    原始数据标签: (200,) ,训练数据标签: (160,) ,测试数据标签: (40,)

     

    建立初步的数据集模型之后将训练集中的特征值与标签值放入LinearRegression()模型中且使用fit函数进行训练,在模型训练完成之后会得到所对应的方程式(线性回归方程式)需要利用函数中的intercept_与coef_。

     

    in:

    model = LinearRegression()
    
    model.fit(X_train,Y_train)
    
    a  = model.intercept_#截距
    
    b = model.coef_#回归系数
    
    print("最佳拟合线:截距",a,",回归系数:",b)

     

    out:

    最佳拟合线:截距 2.79361553401 ,回归系数: [ 0.04711495  0.18719875 -0.00185999]

     

    即所得的多元线性回归模型的函数为 : y = 2.79 + 0.04 * TV + 0.187 * Radio - 0.002 * Newspaper,对于给定了Radio和Newspaper的广告投入,如果在TV广告上每多投入1个单位,对应销量将增加0.04711个单位。就是加入其它两个媒体投入固定,在TV广告上每增加1000美元(因为单位是1000美元),销量将增加47.11(因为单位是1000)。但是大家注意这里的newspaper的系数居然是负数,所以我们可以考虑不使用newspaper这个特征。接下来对数据集进行预测与模型测评。同样使用predict与score函数来获取所需要的预测值与得分。

     

    in:

    #R方检测
    #决定系数r平方
    #对于评估模型的精确度
    #y误差平方和 = Σ(y实际值 - y预测值)^2
    #y的总波动 = Σ(y实际值 - y平均值)^2
    #有多少百分比的y波动没有被回归拟合线所描述 = SSE/总波动
    #有多少百分比的y波动被回归线描述 = 1 - SSE/总波动 = 决定系数R平方
    #对于决定系数R平方来说1) 回归线拟合程度:有多少百分比的y波动刻印有回归线来描述(x的波动变化)
    #2)值大小:R平方越高,回归模型越精确(取值范围0~1),1无误差,0无法完成拟合
    score = model.score(X_test,Y_test)
    
    print(score)
    
    #对线性回归进行预测
    
    Y_pred = model.predict(X_test)
    
    print(Y_pred)
    
    plt.plot(range(len(Y_pred)),Y_pred,'b',label="predict")
    #显示图像
    plt.savefig("predict.jpg")
    plt.show()

     

    out:

    score : 0.871755480886
    predict :[ 14.17217173  17.42866884  16.81933374  18.16079802   7.64784604
      17.8670496   16.66488531  14.98782916   9.41023763  16.21679696
      19.32696651   7.76788593  23.34231219   3.59006148  13.15777984
      24.26609169  15.47571902  15.39542342  13.98430709  12.65446708
       7.59818691  13.85179898  12.16325619  10.34902817  11.9813427
      11.05726513   8.13405159  21.94038306  16.4388483   14.06506403
       4.36052153   6.45326681   7.55083036  24.25987365  17.13603444
      14.04814117   7.28664465  17.24163581  20.42745536   6.55512244]

    预测集与源数据集的对比如下:

     

    模型的检测方法-ROC曲线:

     ROC曲线是根据一系列不同的二分类方式(分界值或决定阈),以真阳性率(灵敏度)为纵坐标,假阳性率(1-特异度)为横坐标绘制的曲线。传统的诊断试验评价方法有一个共同的特点,必须将试验结果分为两类,再进行统计分析。ROC曲线的评价方法与传统的评价方法不同,无须此限制,而是根据实际情况,允许有中间状态,可以把试验结果划分为多个有序分类,如正常、大致正常、可疑、大致异常和异常五个等级再进行统计分析。因此,ROC曲线评价方法适用的范围更为广泛。

    1.ROC曲线能很容易地查出任意界限值时的对疾病的识别能力。

    2.选择最佳的诊断界限值。ROC曲线越靠近左上角,试验的准确性就越高。最靠近左上角的ROC曲线的点是错误最少的最好阈值,其假阳性和假阴性的总数最少。

    3.两种或两种以上不同诊断试验对疾病识别能力的比较。在对同一种疾病的两种或两种以上诊断方法进行比较时,可将各试验的ROC曲线绘制到同一坐标中,以直观地鉴别优劣,靠近左上角的ROC曲线所代表的受试者工作最准确。亦可通过分别计算各个试验的ROC曲线下的面积(AUC)进行比较,哪一种试验的 AUC最大,则哪一种试验的诊断价值最佳(百度百科)

    模型提升:

    对于提升模型准确度的方法很多,在这个模型下,可以利用异常值替换,将Newspaper中的异常值进行拉格朗日法插补,朗格朗日插补法(from scipy.interpolate import lagrange即scipy中的函数)可以间接提高模型的准确度,如果不需要插补异常值或缺失值的话可以将Newspaper不列为特征值考虑,在不考虑Newspaper为特征值的情况下,新的模型的准确率将超过旧模型,也可以从模型的准确度来反证Newspaper不适合作为特征值。

     

    整体代码如下,数据集再上面链接中可直接下载。

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    from pandas import DataFrame,Series
    from sklearn.cross_validation import train_test_split
    from sklearn.linear_model import LinearRegression
    #创建数据集
    examDict  = {'学习时间':[0.50,0.75,1.00,1.25,1.50,1.75,1.75,
                         2.00,2.25,2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
                 '分数':[10,22,13,43,20,22,33,50,62,
                       48,55,75,62,73,81,76,64,82,90,93]}
    
    #转换为DataFrame的数据格式
    examDf = DataFrame(examDict)
    
    #绘制散点图
    plt.scatter(examDf.分数,examDf.学习时间,color = 'b',label = "Exam Data")
    
    #添加图的标签(x轴,y轴)
    plt.xlabel("Hours")
    plt.ylabel("Score")
    #显示图像
    plt.savefig("examDf.jpg")
    plt.show()
    
    
    #相关系数矩阵 r(相关系数) = x和y的协方差/(x的标准差*y的标准差) == cov(x,y)/σx*σy
    #相关系数0~0.3弱相关0.3~0.6中等程度相关0.6~1强相关
    rDf = examDf.corr()
    print(rDf)
    
    #回归方程 y = a + b*x (模型建立最佳拟合线)
    #点误差 = 实际值 - 拟合值
    #误差平方和(Sum of square error) SSE = Σ(实际值-预测值)^2
    #最小二乘法 : 使得误差平方和最小(最佳拟合)
    exam_X  =  examDf.loc[:,'学习时间']
    exam_Y  =  examDf.loc[:,'分数']
    
    #将原数据集拆分训练集和测试集
    X_train,X_test,Y_train,Y_test = train_test_split(exam_X,exam_Y,train_size=.8)
    #X_train为训练数据标签,X_test为测试数据标签,exam_X为样本特征,exam_y为样本标签,train_size 训练数据占比
    
    print("原始数据特征:",exam_X.shape,
          ",训练数据特征:",X_train.shape,
          ",测试数据特征:",X_test.shape)
    
    print("原始数据标签:",exam_Y.shape,
          ",训练数据标签:",Y_train.shape,
          ",测试数据标签:",Y_test.shape)
    
    #散点图
    plt.scatter(X_train, Y_train, color="blue", label="train data")
    plt.scatter(X_test, Y_test, color="red", label="test data")
    
    #添加图标标签
    plt.legend(loc=2)
    plt.xlabel("Hours")
    plt.ylabel("Pass")
    #显示图像
    plt.savefig("tests.jpg")
    plt.show()
    
    
    
    model = LinearRegression()
    
    #对于下面的模型错误我们需要把我们的训练集进行reshape操作来达到函数所需要的要求
    # model.fit(X_train,Y_train)
    
    #reshape如果行数=-1的话可以使我们的数组所改的列数自动按照数组的大小形成新的数组
    #因为model需要二维的数组来进行拟合但是这里只有一个特征所以需要reshape来转换为二维数组
    X_train = X_train.values.reshape(-1,1)
    X_test = X_test.values.reshape(-1,1)
    
    model.fit(X_train,Y_train)
    
    a  = model.intercept_#截距
    
    b = model.coef_#回归系数
    
    print("最佳拟合线:截距",a,",回归系数:",b)
    
    #决定系数r平方
    #对于评估模型的精确度
    #y误差平方和 = Σ(y实际值 - y预测值)^2
    #y的总波动 = Σ(y实际值 - y平均值)^2
    #有多少百分比的y波动没有被回归拟合线所描述 = SSE/总波动
    #有多少百分比的y波动被回归线描述 = 1 - SSE/总波动 = 决定系数R平方
    #对于决定系数R平方来说1) 回归线拟合程度:有多少百分比的y波动刻印有回归线来描述(x的波动变化)
    #2)值大小:R平方越高,回归模型越精确(取值范围0~1),1无误差,0无法完成拟合
    
    plt.scatter(X_train, Y_train, color='blue', label="train data")
    
    #训练数据的预测值
    y_train_pred = model.predict(X_train)
    #绘制最佳拟合线:标签用的是训练数据的预测值y_train_pred
    plt.plot(X_train, y_train_pred, color='black', linewidth=3, label="best line")
    
    #测试数据散点图
    plt.scatter(X_test, Y_test, color='red', label="test data")
    
    #添加图标标签
    plt.legend(loc=2)
    plt.xlabel("Hours")
    plt.ylabel("Score")
    #显示图像
    plt.savefig("lines.jpg")
    plt.show()
    
    
    score = model.score(X_test,Y_test)
    
    print(score)
    import pandas as pd
    import seaborn as sns
    from sklearn.linear_model import LinearRegression
    import matplotlib.pyplot as plt
    from sklearn.cross_validation import train_test_split
    
    #通过read_csv来读取我们的目的数据集
    adv_data = pd.read_csv("C:/Users/Administrator/Desktop/Advertising.csv")
    #清洗不需要的数据
    new_adv_data = adv_data.ix[:,1:]
    #得到我们所需要的数据集且查看其前几列以及数据形状
    print('head:',new_adv_data.head(),'\nShape:',new_adv_data.shape)
    
    #数据描述
    print(new_adv_data.describe())
    #缺失值检验
    print(new_adv_data[new_adv_data.isnull()==True].count())
    
    new_adv_data.boxplot()
    plt.savefig("boxplot.jpg")
    plt.show()
    ##相关系数矩阵 r(相关系数) = x和y的协方差/(x的标准差*y的标准差) == cov(x,y)/σx*σy
    #相关系数0~0.3弱相关0.3~0.6中等程度相关0.6~1强相关
    print(new_adv_data.corr())
    
    #建立散点图来查看数据集里的数据分布
    #seaborn的pairplot函数绘制X的每一维度和对应Y的散点图。通过设置size和aspect参数来调节显示的大小和比例。
    # 可以从图中看出,TV特征和销量是有比较强的线性关系的,而Radio和Sales线性关系弱一些,Newspaper和Sales线性关系更弱。
    # 通过加入一个参数kind='reg',seaborn可以添加一条最佳拟合直线和95%的置信带。
    sns.pairplot(new_adv_data, x_vars=['TV','radio','newspaper'], y_vars='sales', size=7, aspect=0.8,kind = 'reg')
    plt.savefig("pairplot.jpg")
    plt.show()
    
    #利用sklearn里面的包来对数据集进行划分,以此来创建训练集和测试集
    #train_size表示训练集所占总数据集的比例
    X_train,X_test,Y_train,Y_test = train_test_split(new_adv_data.ix[:,:3],new_adv_data.sales,train_size=.80)
    
    print("原始数据特征:",new_adv_data.ix[:,:3].shape,
          ",训练数据特征:",X_train.shape,
          ",测试数据特征:",X_test.shape)
    
    print("原始数据标签:",new_adv_data.sales.shape,
          ",训练数据标签:",Y_train.shape,
          ",测试数据标签:",Y_test.shape)
    
    model = LinearRegression()
    
    model.fit(X_train,Y_train)
    
    a  = model.intercept_#截距
    
    b = model.coef_#回归系数
    
    print("最佳拟合线:截距",a,",回归系数:",b)
    #y=2.668+0.0448∗TV+0.187∗Radio-0.00242∗Newspaper
    
    #R方检测
    #决定系数r平方
    #对于评估模型的精确度
    #y误差平方和 = Σ(y实际值 - y预测值)^2
    #y的总波动 = Σ(y实际值 - y平均值)^2
    #有多少百分比的y波动没有被回归拟合线所描述 = SSE/总波动
    #有多少百分比的y波动被回归线描述 = 1 - SSE/总波动 = 决定系数R平方
    #对于决定系数R平方来说1) 回归线拟合程度:有多少百分比的y波动刻印有回归线来描述(x的波动变化)
    #2)值大小:R平方越高,回归模型越精确(取值范围0~1),1无误差,0无法完成拟合
    score = model.score(X_test,Y_test)
    
    print(score)
    
    #对线性回归进行预测
    
    Y_pred = model.predict(X_test)
    
    print(Y_pred)
    
    
    plt.plot(range(len(Y_pred)),Y_pred,'b',label="predict")
    #显示图像
    # plt.savefig("predict.jpg")
    plt.show()
    
    plt.figure()
    plt.plot(range(len(Y_pred)),Y_pred,'b',label="predict")
    plt.plot(range(len(Y_pred)),Y_test,'r',label="test")
    plt.legend(loc="upper right") #显示图中的标签
    plt.xlabel("the number of sales")
    plt.ylabel('value of sales')
    plt.savefig("ROC.jpg")
    plt.show()
    
    
    
    
    

    Advertising.csv的连接已经失效,以下是补充的数据,可复制粘贴到CSV进行保存

    TVradionewspapersales
    230.137.869.222.1
    44.539.345.110.4
    17.245.969.39.3
    151.541.358.518.5
    180.810.858.412.9
    8.748.9757.2
    57.532.823.511.8
    120.219.611.613.2
    8.62.114.8
    199.82.621.210.6
    66.15.824.28.6
    214.724417.4
    23.835.165.99.2
    97.57.67.29.7
    204.132.94619
    195.447.752.922.4
    67.836.611412.5
    281.439.655.824.4
    69.220.518.311.3
    147.323.919.114.6
    218.427.753.418
    237.45.123.512.5
    13.215.949.65.6
    228.316.926.215.5
    62.312.618.39.7
    262.93.519.512
    142.929.312.615
    240.116.722.915.9
    248.827.122.918.9
    70.61640.810.5
    292.928.343.221.4
    112.917.438.611.9
    97.21.5309.6
    265.6200.317.4
    95.71.47.49.5
    290.74.18.512.8
    266.943.8525.4
    74.749.445.714.7
    43.126.735.110.1
    22837.73221.5
    202.522.331.616.6
    17733.438.717.1
    293.627.71.820.7
    206.98.426.412.9
    25.125.743.38.5
    175.122.531.514.9
    89.79.935.710.6
    239.941.518.523.2
    227.215.849.914.8
    66.911.736.89.7
    199.83.134.611.4
    100.49.63.610.7
    216.441.739.622.6
    182.646.258.721.2
    262.728.815.920.2
    198.949.46023.7
    7.328.141.45.5
    136.219.216.613.2
    210.849.637.723.8
    210.729.59.318.4
    53.5221.48.1
    261.342.754.724.2
    239.315.527.315.7
    102.729.68.414
    131.142.828.918
    699.30.99.3
    31.524.62.29.5
    139.314.510.213.4
    237.427.51118.9
    216.843.927.222.3
    199.130.638.718.3
    109.814.331.712.4
    26.83319.38.8
    129.45.731.311
    213.424.613.117
    16.943.789.48.7
    27.51.620.76.9
    120.528.514.214.2
    5.429.99.45.3
    1167.723.111
    76.426.722.311.8
    239.84.136.912.3
    75.320.332.511.3
    68.444.535.613.6
    213.54333.821.7
    193.218.465.715.2
    76.327.51612
    110.740.663.216
    88.325.573.412.9
    109.847.851.416.7
    134.34.99.311.2
    28.61.5337.3
    217.733.55919.4
    250.936.572.322.2
    107.41410.911.5
    163.331.652.916.9
    197.63.55.911.7
    184.9212215.5
    289.742.351.225.4
    135.241.745.917.2
    222.44.349.811.7
    296.436.3100.923.8
    280.210.121.414.8
    187.917.217.914.7
    238.234.35.320.7
    137.946.45919.2
    251129.77.2
    90.40.323.28.7
    13.10.425.65.3
    255.426.95.519.8
    225.88.256.513.4
    241.73823.221.8
    175.715.42.414.1
    209.620.610.715.9
    78.246.834.514.6
    75.13552.712.6
    139.214.325.612.2
    76.40.814.89.4
    125.736.979.215.9
    19.41622.36.6
    141.326.846.215.5
    18.821.750.47
    2242.415.611.6
    123.134.612.415.2
    229.532.374.219.7
    87.211.825.910.6
    7.838.950.66.6
    80.209.28.8
    220.3493.224.7
    59.61243.19.7
    0.739.68.71.6
    265.22.94312.7
    8.427.22.15.7
    219.833.545.119.6
    36.938.665.610.8
    48.3478.511.6
    25.6399.39.5
    273.728.959.720.8
    4325.920.59.6
    184.943.91.720.7
    73.41712.910.9
    193.735.475.619.2
    220.533.237.920.1
    104.65.734.410.4
    96.214.838.911.4
    140.31.9910.3
    240.17.38.713.2
    243.24944.325.4
    3840.311.910.9
    44.725.820.610.1
    280.713.93716.1
    1218.448.711.6
    197.623.314.216.6
    171.339.737.719
    187.821.19.515.6
    4.111.65.73.2
    93.943.550.515.3
    149.81.324.310.1
    11.736.945.27.3
    131.718.434.612.9
    172.518.130.714.4
    85.735.849.313.3
    188.418.125.614.9
    163.536.87.418
    117.214.75.411.9
    234.53.484.811.9
    17.937.621.68
    206.85.219.412.2
    215.423.657.617.1
    284.310.66.415
    5011.618.48.4
    164.520.947.414.5
    19.620.1177.6
    168.47.112.811.7
    222.43.413.111.5
    276.948.941.827
    248.430.220.320.2
    170.27.835.211.7
    276.72.323.711.8
    165.61017.612.6
    156.62.68.310.5
    218.55.427.412.2
    56.25.729.78.7
    287.64371.826.2
    253.821.33017.6
    20545.119.622.6
    139.52.126.610.3
    191.128.718.217.3
    28613.93.715.9
    18.712.123.46.7
    39.541.15.810.8
    75.510.869.9
    17.24.131.65.9
    166.8423.619.6
    149.735.6617.3
    38.23.713.87.6
    94.24.98.19.7
    1779.36.412.8
    283.64266.225.5
    232.18.68.713.4
    展开全文
  • 多元线性回归代码以及多元非线性回归代码数学建模
  • 线性回归,前面用Python从底层一步一个脚印用两种方法实现了回归拟合。在这个高级语言层出不穷的年代,这样做显然不明智,所以我考虑用优秀的数据分析工具——R语言(不敢说最...

    640?wx_fmt=png

    线性回归,前面用Python从底层一步一个脚印用两种方法实现了回归拟合。在这个高级语言层出不穷的年代,这样做显然不明智,所以我考虑用优秀的数据分析工具——R语言(不敢说最优秀,虽然心里是这么想的,我怕有人要骂我!)做回归分析。包括简单多变量回归、逐步回归、逻辑回归!

    对了,上次,用Python写的两篇回归拟合分别是:

    多元回归分析,生活中用的很多,因为一个因素可能与很多其它因素有关!言归正传,这里考虑用R语言里面的相关函数做回归分析。

    需要的用到的知识储备:

    • 线性代数

    • 概率论与数理统计

    • 高等数学

    • R语言基础

    下面分别从普通多元线性回归、逐步回归、逻辑回归进行介绍。前面用Python实现的只是一元回归,由于R语言实现线性回归很方便,所以我会着重介绍原理。

    多元线性回归

    不论是单变量还是多元线性回归分析,他们都是直接或间接(有时候需要通过变量代换)程线性的关系。我们需要找到一个通用的线性模型来描述这种关系,在我们可以接受的误差范围内对数据进行预测或者发现规律。

    多元线性回归理论基础

    对于一组变量数据,如果我们不管是通过画散点图还是其它方法,知道了一个变量与其它变量程很强线性关系。我们就需要知道,到底是什么样的关系,关系系数是多少。通常是用经典的最小二乘法,因为这样算出的确实是最优的系数,可以保证残差平方和最小的优化目标。

    对于一个因变量y,有一组自变量X = (x1,x2,...,xk),x1,x2,...,xk,eps是列向量,考虑它们之间有如下线性关系:

    640?wx_fmt=png

    当然了,这里X = (x1,x2,...,xk),y都是给的一组数据,就像这样

    640?wx_fmt=png

    那么,对每一组(比如第一行)数据,就有如下关系:

    640?wx_fmt=png

    目标函数为残差平方和的关于系数beta0,beta1,...,betak的多元二次函数,我们希望找到一组系数使得目标函数值最小,即误差最小。目标函数如下:

    640?wx_fmt=png

    学过数学分析或者高等数学的人都知道,这只要关于beta0,beta1,...,betak分别求偏导数,得到k+1方程,再求出零点即可。

    我们用矩阵表示各个变量如下:

    640?wx_fmt=png

    那么,学过高等代数(数学专业)或者线性代数(工科)都知道,因变量与自变量关系可以表示为:

    640?wx_fmt=png

    中间推导过程这里不在赘述了,最终系数向量表达式为:

    640?wx_fmt=png

    关于多元线性回归的理论就到这里,有兴趣可以参考:线性回归导论(机械工业出版社 王辰勇 译)

    多元线性回归的R语言实现

    这里用R语言里面的常用数据集iris来说明,这个数据集包含五个指标,我们这里先只用前面四个:花萼长度、花萼宽度、花瓣长度、花瓣宽度,进行多元线性回归分析。

    数据预处理

    大家都知道,为了消除不同变量量纲或者数量级不一致,做数据标准化的数据预处理是有必要的。用到的R语言函数是scale(),这个函数的机理具体公式如下:

    640?wx_fmt=png

    R语言实现如下:

    640?wx_fmt=png

    标准化后数据选择前六行我们看一下:

    > head(sl.sc)

         Sepal.Length

    [1,]   -0.8976739

    [2,]   -1.1392005

    [3,]   -1.3807271

    [4,]   -1.5014904

    [5,]   -1.0184372

    [6,]   -0.5353840

    下面构建多元线性回归

    我们用花萼标准化后的数据sl.sc与其它三个变量做线性回归,先做有常数项的多元回归。

    lm.sc <- lm(sl.sc~sw.sc+pl.sc+pw.sc)

    summary(lm.sc)

    640?wx_fmt=png

    summary(lm.sc)给出了线性回归的相关信息,各个系数Residuals给出了残差的5分位数,Estimate、Std. Error、t value、Pr(>|t|)分别给出了自变量系数、标准误、t值和p值,Multiple R-squared:  0.8586, Adjusted R-squared:  0.8557分别给出了R方与修正的R方,这里 R-squared:  0.8557表示这个线性回归模型可以解释85.57的原数据,还是不错的,后面就不再解释这几个指标的意思了。可以看出无论是每个系数还是总体的p-value都远远小于0.05,给出了三颗星***的等级,但是如图蓝色方框是常数项的值是-1.176e-16,太小了,p值是1,告诉我们常数项可以不用,这些数据是过原点的线性关系。

    去掉常数项的多元回归,不同的是,减一表示不要常数项

    lm.sc <- lm(sl.sc~sw.sc+pl.sc+pw.sc-1)

    summary(lm.sc)

    模型详细情况:

    640?wx_fmt=png

    显然,去掉后R方,F值没有明显变换,系数等级都是三颗星,表明去掉常数项确实在不影响模型情况下简化了模型。

    我们来看一下残差图与QQ图:

    plot(lm.sc,1,col = 'orange',main = '残差图')

    plot(lm.sc,2,col = 'orange',main = 'QQ图')

    640?wx_fmt=png

    640?wx_fmt=png

    通过残差图与QQ图也可以明显看出这个不带常数项的线性回归模型是不错的。

    逐步回归

    逐步回归的基本思想是将变量逐个引入模型,每引入一个解释变量后都要进行F检验,并对已经选入的解释变量逐个进行t检验,当原来引入的解释变量由于后面解释变量的引入变得不再显著时,则将其删除。以确保每次引入新的变量之前回归方程中只包含显著性变量。这是一个反复的过程,直到既没有显著的解释变量选入回归方程,也没有不显著的解释变量从回归方程中剔除为止。以保证最后所得到的解释变量集是最优、最简单的。

    逐步回归最常用的挑选准则有修正复相关系数、预测平方和、Cp和AIC等,这里用AIC准则,对于含有P个自变量的回归方程,n为观测值(样本)个数,AIC越小越好,具体计算公式为:

    640?wx_fmt=png

    使用R语言构建逐步回归模型

    知道原理后,我们试图从三个自变量中筛选出两个,首先看一下上述模型的AIC

    step(lm.sc)

    640?wx_fmt=png

    显然,三个变量时AIC是最小的,这里为了说明问题,实在要剔除一个变量的话,当然要剔除第一个。因为我们发现剔除pw.sc时AIC为-272.06,如果剔除pl.scAIC就为-181.26,而AIC越小越好,所以就剔除变量pw.sc吧。

    lm.new <- lm(sl.sc~sw.sc+pl.sc-1)

    summary(lm.new)

    640?wx_fmt=png

    R方稍微减小了一点,因为三个变量AIC最小(即模型最优),提出后肯定会减小的。这里为了说明问题才强行提出一个。

    逻辑回归

    在介绍逻辑回归前我们先介绍什么是哑变量,其实,R语言用的多的人都知道iris这个数据集有5列,第五列是花的分类:setosa、versicolor、 virginica。那么花萼长度是否与花的分类有关呢?一般是有的。增加三列,我们考虑引入0~1变量,那么对于属于setosa的,记为1,versicolor、 virginica位置记为0,同理就多了3列,这里的0,1就是哑变量。还是为了减少变量,简化模型,我们只增加2列versicolor和 virginica,这样versicolor、 virginica位置都为0时,就属于setosa这个分类,versicolor位置为1时就为versicolor这个分类。0,1是逻辑变量,线性回归引入了逻辑变量,故称为逻辑回归。

    下面就进行R语言实现,要不看一下iris数据集长什么样:

    640?wx_fmt=png

    第五列变量就有三个水平,都是50条,正好。

    640?wx_fmt=png

    两个for()语句就是构造逻辑变量的,还是很好理解的,这样就有五个变量了。构造的应该像这样:

    640?wx_fmt=png

    这里省略了前面的,只为说明构造的逻辑变量(实际应该是s1里面51~100为1,s2里面101~150为1,其它为0)。看一下结果:

    640?wx_fmt=png

    所有变量系数p-value都小于0.05,R-squared:  0.8627,比没有增加逻辑变量的R-squared:  0.8557好一些,可见花的分类确实对花萼长度sl.sc有关系。最终表达式为:

    640?wx_fmt=png

    猜你可能喜欢

    640?wx_fmt=jpeg

    展开全文
  • 多重线性回归 多元线性回归Video Link 影片连结 We have taken a look at Simple Linear Regression in Episode 4.1 where we had one variable x to predict y, but what if now we have multiple variables, not ...

    多重线性回归 多元线性回归

    Video Link

    影片连结

    We have taken a look at Simple Linear Regression in Episode 4.1 where we had one variable x to predict y, but what if now we have multiple variables, not just x, but x1,x2, x3 … to predict y — how would we approach this problem? I hope to explain in this article.

    我们看了第4.1集中的简单线性回归,其中我们有一个变量x来预测y ,但是如果现在我们有多个变量,不仅是x,而且还有x1,x2,x3 …来预测y ,我们将如何处理?这个问题? 我希望在本文中进行解释。

    简单线性回归回顾 (Simple Linear Regression Recap)

    From Episode 4.1 we had our data of temperature and humidity:

    第4.1集开始,我们获得了温度和湿度数据:

    Image for post

    We plotted our Data, found and found a linear relationship — making linear regression suitable:

    我们绘制了数据,发现并找到了线性关系,从而使线性回归适用:

    Image for post

    We then calculated our regression line:

    然后,我们计算了回归线:

    Image for post

    using gradient descent to find our parameters θ₀ and θ₁.

    使用梯度下降找到我们的参数 θ₀和θ₁。

    Image for post

    We then used the regression line calculated to make predictions for Humidity given any Temperature value.

    然后,我们使用计算得出的回归线对给定任何温度值的湿度进行预测。

    什么是多元线性回归? (What is Multiple Linear Regression?)

    Multiple linear regression takes the exact same concept as simple linear regression but applies it to multiple variables. So instead of just looking at temperature to predict humidity, we can look at other factors such as wind speed or pressure.

    多元线性回归采用与简单线性回归完全相同的概念,但将其应用于多个变量。 因此,我们不仅可以查看温度来预测湿度,还可以查看其他因素,例如风速或压力

    Image for post

    We are still trying to predict Humidity so this remains as y.

    我们仍在尝试预测湿度,因此仍为y。

    We rename Temperature, Wind Speed and Pressure to 𝑥¹,𝑥² and 𝑥³.

    我们将温度,风速和压力重命名为𝑥¹𝑥²𝑥³。

    Just as with Simple Linear Regression we must ensure that our variables 𝑥₁,𝑥₂ and 𝑥₃ form a linear relationship with y, if not we will be producing a very inaccurate model.

    就像简单线性回归一样,我们必须确保变量𝑥₁,𝑥_2𝑥₃ 与y形成线性关系 ,否则,我们将生成一个非常不准确的模型。

    Lets plot each of our variables against Humidity:

    让我们针对湿度绘制每个变量:

    Image for post
    Image for post
    Image for post
    • Temperature and Humidity form a strong linear relationship

      温度和湿度形成很强的线性关系

    • Wind Speed and Humidity form a linear relationship

      风速和湿度形成线性关系

    • Pressure and Humidity do not form a linear relationship

      压力和湿度不是线性关系

    We therefore can not use Pressure (𝑥³) in our multiple linear regression model.

    因此,我们不能在多元线性回归模型中使用压力 (𝑥³)。

    绘制数据 (Plotting our Data)

    Let’s now plot both Temperature (𝑥¹) and Wind Speed (𝑥²) against Humidity.

    现在让我们绘制两个温度(𝑥¹) 以及相对于湿度的风速(𝑥²)。

    Image for post

    We can see that our data follows a roughly linear relationship, that is we can fit a plane on our data that captures the relationship between Temperature, Wind-speed(𝑥₁, 𝑥₂) and Humidity (y).

    我们可以看到我们的数据遵循大致线性关系,也就是说,我们可以在数据上拟合一个平面 ,以捕获温度,风速(𝑥₁,𝑥²)和湿度(y)之间的关系。

    Image for post

    计算回归模型 (Calculating the Regression Model)

    Because we are dealing with more than one 𝑥 variable our linear regression model takes the form:

    因为我们要处理多个𝑥变量,所以线性回归模型采用以下形式:

    Image for post

    Just as with simple linear regression in order to find our parameters θ₀, θ₁ and θ₂ we need to minimise our cost function:

    与简单的线性回归一样,为了找到我们的参数θ₀,θ₁和θ2,我们需要最小化成本函数:

    Image for post

    We do this using the gradient descent algorithm:

    我们使用梯度下降算法执行此操作:

    Image for post

    This algorithm is explained in more detail here

    此算法在这里更详细地说明

    After running our gradient descent algorithm we find our optimal parameters to be θ₀ = 1.14 , θ₁ = -0.031 and θ₂ =-0.004

    运行梯度下降算法后,我们发现最优参数为θ₀= 1.14,θ₁= -0.031和θ2= -0.004

    Giving our final regression model:

    给出我们的最终回归模型:

    Image for post

    We can then use this regression model to make predictions for Humidity (ŷ) given any Temperature (𝑥¹) or Wind speed value(𝑥²).

    然后,我们可以使用该回归模型对给定温度(𝑥¹)或风速值(𝑥²)的湿度(ŷ)进行预测。

    In general models that contain more variables tend to be more accurate since we are incorporating more factors that have an effect on Humidity.

    通常,包含更多变量的模型往往更准确,因为我们纳入了更多会影响湿度的因素。

    _________________________________________

    _________________________________________

    潜在问题 (Potential Problems)

    When including more and more variables in our model we run into a few problems:

    当在模型中包含越来越多的变量时 ,我们会遇到一些问题:

    • For example certain variables may become redundant. E.g look at our regression line above, θ₂ =0.004, multiplying our wind speed (𝑥²) by 0.004 barely changes our predicted value for humidity ŷ, which makes wind speed less useful to use in our model.

      例如,某些变量可能变得多余。 例如,看一下上面的回归线θ2 = 0.004,将我们的风速()²)乘以0.004几乎不会改变我们对湿度predicted的预测值,这使得风速在模型中的用处不大。
    • Another example is the scale of our data, i.e we can expect temperature to have a range of say -10 to 100, but pressure may have a range of 1000 to 1100. Using different scales of data can heavily affect the accuracy of our model.

      另一个例子是我们的数据规模,即我们可以预期温度范围在-10到100之间,但是压力可能在1000到1100之间。使用不同的数据规模会严重影响我们模型的准确性。

    How we solve these issues will be covered in future episodes.

    我们如何解决这些问题将在以后的章节中介绍。

    上一集 - 下一集 (Prev EpisodeNext Episode)

    如有任何疑问,请留在下面! (If you have any questions please leave them below!)

    Image for post

    翻译自: https://medium.com/ai-in-plain-english/understanding-multiple-linear-regression-2672c955ec1c

    多重线性回归 多元线性回归

    展开全文
  • 线性回多元线性回归与多项式回归,讲义,例题
  • 多元线性回归

    2017-03-12 22:14:07
    多元线性回归
  • 在这种情况下可用逐步回归分析,进行x因子的筛选,这样建立的多元回归模型预测效果会更好。 可以解决的实际问题: 收入水平受教育程度、所在行业、工作 年限、工作种类的关系。 公路客运量人口增长量、私家...
  • MATLAB多元线性回归

    2018-08-19 23:45:22
    MATLAB多元线性回归: 基于MATLAB的多元非线性回归模型.pdf 多元线性回归建模以及MATLAB和SPSS求解.pdf MATLAB语言在多元线性回归中的应用.pdf
  • 基于spss的一元线性回归与多元线性回归案例,个人整理出的,包含了部分案例、实验报告、题目,及部分题目答案,适合作为spss、MATLAB等软件数据分析题目联系
  • 多元线性回归模型

    万次阅读 多人点赞 2019-07-02 19:22:12
    多元线性回归模型通常用来研究一个应变量依赖多个自变量的变化关系,如果二者的以来关系可以用线性形式来刻画,则可以建立多元线性模型来进行分析。 1.模型简介 1.1模型的结构 多元线性回归模型通常用来描述变脸y和x...
  • 多元线性回归推导过程

    万次阅读 多人点赞 2018-08-06 20:26:23
    常用算法一 多元线性回归详解1 此次我们来学习人工智能的第一个算法:多元线性回归.文章会包含必要的数学知识回顾,大部分比较简单,数学功底好的朋友只需要浏览标题,简单了解需要哪些数学知识即可. 本章主要包括...
  • 单变量线性回归 绘制散点图 相关系数R 拆分训练集和测试集 多变量线性回归 数据检验(判断是否可以做线性回归) 训练线性回归模型 先甩几个典型的线性回归的模型,帮助大家捡起那些年被忘记的数学。 ● 单...
  • Matlab 多元线性回归

    2021-03-13 09:10:17
    用matlab实现的多元线性回归
  • 多元线性回归 python翻译自: https://medium.com/ai-in-plain-english/implementing-multiple-linear-regression-in-python-1364fc03a5a8多元线性回归 python
  • 线性回归模型建模步骤 (一元线性回归、多元线性回归
  • MATLAB 多元线性回归

    2018-04-14 18:39:35
    MATLAB 多元线性回归 含例题数据,和可运行的MATLAB代码。MATLAB 多元线性回归 含例题数据,和可运行的MATLAB代码。
  • 一元线性回归与多元线性回归

    千次阅读 2019-02-03 11:39:29
    一元与多元 回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关...
  • 利用MATLAB进行多元线性回归 2.线性回归 b=regress(y,X) [b,bint,r,rint,s]=regress(y,X,alpha) 输入: y~因变量(列向量), X~1自变量组成的矩阵, Alpha~显著性水平(缺省时设定为0.05) s: 3个统计统计 量:决定...
  • 统计学教案习题11多元线性回归与logistic回归.pdf
  • 一元线性回归VS多元线性回归

    千次阅读 2018-11-10 21:25:40
    一元线性回归和多元线性回归表面意思容易理解,但是结合实际的数据集,会混乱。这也是在编写线性回归博文的时候梳理知识点发现自己的不足,同时记录下来,让有疑问的同学也可以得到答案,拨开乌云。 1.在数据集上的...
  • 基于王斌会《多元统计分析及R语言建模》第4章第4节逐步回归。主要介绍回归变量的选择方法,涉及变量选择准则,逐步回归分析的步骤,以及算例。
  • 基于王斌会《多元统计分析及R语言建模》第4章第4节逐步回归。主要介绍回归变量的选择方法,涉及变量选择准则,逐步回归分析的步骤,以及算例。
  • 基于MATLAB的多元线性回归模型学习资料

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,083
精华内容 10,433
关键字:

多元线性回归与逐步回归