精华内容
下载资源
问答
  • 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
    展开全文
  • 多元线性回归代码以及多元非线性回归代码数学建模
  • 多重线性回归 多元线性回归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
    多元线性回归
  • MATLAB多元线性回归

    2018-08-19 23:45:22
    MATLAB多元线性回归: 基于MATLAB的多元非线性回归模型.pdf 多元线性回归建模以及MATLAB和SPSS求解.pdf MATLAB语言在多元线性回归中的应用.pdf
  • 多元线性回归推导过程

    万次阅读 多人点赞 2018-08-06 20:26:23
    常用算法一 多元线性回归详解1 此次我们来学习人工智能的第一个算法:多元线性回归.文章会包含必要的数学知识回顾,大部分比较简单,数学功底好的朋友只需要浏览标题,简单了解需要哪些数学知识即可. 本章主要包括...

    接上篇:人工智能开篇

    常用算法一   多元线性回归详解1

          此次我们来学习人工智能的第一个算法:多元线性回归.文章会包含必要的数学知识回顾,大部分比较简单,数学功底好的朋友只需要浏览标题,简单了解需要哪些数学知识即可.

    本章主要包括以下内容

            数学基础知识回顾

            什么是多元线性回归

            多元线性回归的推导过程详解

            如何求得最优解详解

     

    数学基础知识回顾

    1-截距

          我们知道,y=ax+b这个一元一次函数的图像是一条直线.当x=0时,y=b,所以直线经过点(0,b),我们把当x=0时直线与y轴交点到x轴的距离称为直线y=ax+b图像在x轴上的截距,其实截距就是这个常数b.(有点拗口,多读两遍)

    截距在数学中的定义是:直线的截距分为横截距和纵截距,横截距是直线与X轴交点的横坐标,纵截距是直线与Y轴交点的纵坐标。根据上边的例子可以看出,我们一般讨论的截距默认指纵截距.

    2-斜率

         既然已知y=ax+b中b是截距,为了不考虑常数b的影响,我们让b=0,则函数变为y=ax.

          注意变换后表达式的图像.当a=1时,y=ax的图像是经过原点,与x轴呈45°夹角的直线(第一,三象限的角平分线),当a的值发生变化时,y=ax的图像与x轴和y轴的夹角也都会相应变化,我们称为这条直线y=ax的倾斜程度在发生变化,又因为a是决定直线倾斜程度的唯一的量(即便b不等于0也不影响倾斜程度),那么我们就称a为直线y=ax+b的斜率.

          斜率在数学中的解释是 表示一条直线(或曲线的切线)关于(横)坐标轴倾斜程度的量.

    3-导数

         还是y=ax+b,我们知道这个函数的图像是一条直线,每个不同的x对应着直线上一点y.那么当自变量x的值变化的时候,y值也会随之变化.数学中我们把x的变化量成为Δx,把对应的y的变化量成为Δy,自变量的变化量Δx与因变量的变化量Δy的比值称为导数.记作y'.

         y'=Δy/Δx

    常用的求导公式在这部分不涉及,我们用到一个记住一个即可.

    4-矩阵和向量

    什么是向量:

             向量就是一个数组.比如[1,2,3]是一个有三个元素的向量.                                           

             有行向量和列向量之分,行向量就是数字横向排列:X=[1,2,3],列向量是数字竖向排列,如下图

                                                               列向量

    什么是矩阵:

              矩阵就是元素是数组的数组,也就是多维数组,比如[[1,2,3],[4,5,6]]是一个两行三列的矩阵,也叫2*3的矩阵. 行代表内层数组的个数,列代表内层数组的元素数.一个矩阵中的所有数组元素相同.

     

    5-向量的运算:

         一个数乘以一个向量等于这个数同向量中的每个元素相乘,结果还是一个向量.

         2 * [1,2,3] = [2,4,6]

        一个行向量乘以一个列向量,是两个向量对位相乘再相加,结果是一个实数.

                   

    \begin{bmatrix} 1& 2 & 3 \end{bmatrix}* \begin{bmatrix} 1\\ 2\\ 3 \end{bmatrix}= 1*1 + 2*2 + 3*3 = 14

     

    附加:转置

           转置用数学符号T来表示,比如W向量的转置表示为W^{T}.转置就是将向量或者矩阵旋转九十度.一个行向量的转置是列向量,列向量的转置是行向量.一个m*n的矩阵转置是n*m的矩阵.

     

    注:以上概念完全是为了读者能容易理解,并不严谨,若想知道上述名词的严谨解释,请自行百度.

     

    什么是多元线性回归

          我们知道y=ax+b是一元一次方程,y=ax1+bx2+c(1和2是角标,原谅我的懒)是二元一次方程.其中,"次"指的是未知数的最大幂数,"元"指的是表达式中未知数的个数(这里就是x的个数).那么"多元"的意思可想而知,就是表达式中x(或者叫自变量,也叫属性)有很多个.

           当b=0时,我们说y=ax,y和x的大小始终符合y/x=a,图像上任意一点的坐标,y值都是x值的a倍.我们把这种横纵坐标始终呈固定倍数的关系叫做"线性".线性函数的图像是一条直线.所以我们知道了多元线性回归函数的图像一定也是一条直线.

            现在我们知道了多元线性回归的多元和线性,而回归的概念我们在人工智能开篇(很简短,请点搜索"回归"查看概念)中有讲述,所以多元线性回归就是:用多个x(变量或属性)与结果y的关系式 来描述一些散列点之间的共同特性.

    这些x和一个y关系的图像并不完全满足任意两点之间的关系(两点一线),但这条直线是综合所有的点,最适合描述他们共同特性的,因为他到所有点的距离之和最小也就是总体误差最小.

    所以多元线性回归的表达式可以写成:

                  y= w0x0 + w1x1 + w2x2 + ... + wnxn    (0到n都是下标哦)

           我们知道y=ax+b这个线性函数中,b表示截距.我们又不能确定多元线性回归函数中预测出的回归函数图像经过原点,所以在多元线性回归函数中,需要保留一项常数为截距.所以我们规定   y= w0x0 + w1x1 + w2x2 + ... + wnxn中,x0=1,这样多元线性回归函数就变成了:   y= w0 + w1x1 + w2x2 + ... + wnxn,w0项为截距.

          如果没有w0项,我们   y= w0x0 + w1x1 + w2x2 + ... + wnxn就是一个由n+1个自变量所构成的图像经过原点的直线函数.那么就会导致我们一直在用一条经过原点的直线来概括描述一些散列点的分布规律.这样显然增大了局限性,造成的结果就是预测出的结果函数准确率大幅度下降.

             有的朋友还会纠结为什么是x0=1而不是x2,其实不管是哪个自变量等于1,我们的目的是让函数   y= w0x0 + w1x1 + w2x2 + ... + wnxn编程一个包含常数项的线性函数.选取任何一个x都可以.选x0是因为他位置刚好且容易理解.

     

    多元线性回归的推导过程详解

     

    1-向量表达形式

            我们前边回顾了向量的概念,向量就是一个数组,就是一堆数.那么表达式y= w0x0 + w1x1 + w2x2 + ... + wnxn是否可以写成两个向量相乘的形式呢?让我们来尝试一下.

            假设向量W= [w1,w2...wn]是行向量,向量X= [x1,x2...xn],行向量和列向量相乘的法则是对位相乘再相加, 结果是一个实数.符合我们的逾期结果等于y,所以可以将表达式写成y=W * X.

             但是设定两个向量一个是行向量一个是列向量又容易混淆,所以我们不如规定W和X都为列向量.所以表达式可以写成W^{T} (还是行向量)与向量X相乘.所以最终的表达式为:

             y=W^{T} * X,其中W^{T} 也经常用 θ_{T}(theta的转置,t是上标)表示.

             此处,如果将两个表达式都设为行向量,y=W * X^{T}也是一样的,只是大家为了统一表达形式,选择第一种形式而已.

     

    2-最大似然估计

           最大似然估计的意思就是最大可能性估计,其内容为:如果两件事A,B相互独立,那么A和B同时发生的概率满足公式

                  P(A , B) = P(A) * P(B)

            P(x)表示事件x发生的概率.

            如何来理解独立呢?两件事独立是说这两件事不想关,比如我们随机抽取两个人A和B,这两个人有一个共同特性就是在同一个公司,那么抽取这两个人A和B的件事就不独立,如果A和B没有任何关系,那么这两件事就是独立的.

            我们使用多元线性回归的目的是总结一些不想关元素的规律,比如以前提到的散列点的表达式,这些点是随机的,所以我们认为这些点没有相关性,也就是独立的.总结不相关事件发生的规律也可以认为是总结所有事件同时发生的概率,所有事情发生的概率越大,那么我们预测到的规律就越准确.

             这里重复下以前我们提到的观点.回归的意思是用一条直线来概括所有点的分布规律,并不是来描述所有点的函数,因为不可能存在一条直线连接所有的散列点.所以我们计算出的值是有误差的,或者说我们回归出的这条直线是有误差的.我们回归出的这条线的目的是用来预测下一个点的位置.

            考虑一下,一件事情我们规律总结的不准,原因是什么?是不是因为我们观察的不够细或者说观察的维度不够多呢?当我们掷一个骰子,我们清楚的知道他掷出的高度,落地的角度,反弹的力度等等信息,那上帝视角的我们是一定可以知道他每次得到的点数的.我们观测不到所有的信息,所以我们认为每次投骰子得到的点数是不确定的,是符合一定概率的,未观测到的信息我们称为误差.

            一个事件已经观察到的维度发生的概率越大,那么对应的未观测到的维度发生的概率就会越小.可以说我们总结的规律就越准确.根据最大似然估计

            P(y) = P(x1,x2 ... xn)= P(x1) * P(x2) ... P(xn)

           当所有事情发生的概率为最大时,我们认为总结出的函数最符合这些事件的实际规律.所以我们把总结这些点的分布规律问题转变为了 求得P(x1,x2 ... xn)= P(x1) * P(x2) ... P(xn)的发生概率最大.

     

    3-概率密度函数

           数学中并没有一种方法来直接求得什么情况下几个事件同时发生的概率最大.所以引用概率密度函数.

           首先引入一点概念:

                   一个随机变量发生的概率符合高斯分布(也叫正太分布).此处为单纯的数学概念,记住即可.

                   高斯分布的概率密度函数还是高斯分布.公式如下:

               

                    公式中x为实际值,u为预测值.在多元线性回归中,x就是实际的y,u就是θ_{T} * X.

           既然说我们要总结的事件是相互独立的,那么这里的每个事件肯定都是一个随机事件,也叫随机变量.所以我们要归纳的每个事件的发生概率都符合高斯分布.

           什么是概率密度函数呢?它指的就是一个事件发生的概率有多大,当事件x带入上面公式得到的值越大,证明其发生的概率也越大.需要注意,得到的并不是事件x发生的概率,而只是知道公式的值同发生的概率呈正比而已.

           如果将y= θ_{T} * X中的每个x带入这个公式,得到如下函数

           

           求得所有的时间发生概率最大就是求得所有的事件概率密度函数结果的乘积最大,则得到:

            

             求得最大时W的值,则总结出了所有事件符合的规律.求解过程如下(这里记住,我们求得的是什么情况下函数的值最大,并不是求得函数的解):

               

               公式中,m为样本的个数,π和σ为常数,不影响表达式的大小.所以去掉所有的常数项得到公式:

               

               因为得到的公式是一个常数减去这个公式,所以求得概率密度函数的最大值就是求得这个公式的最小值.这个公式是一个数的平方,在我国数学资料中把他叫做最小二乘公式.所以多元线性回归的本质就是最小二乘.

     

    到这里,多元线性回归的推导过程就结束了,后边会继续写如何求解多元线性回归.有哪里写的不清楚请大家留言.看到一定会回复的.

     

    下一篇:多元线性回归求解

    展开全文
  • 多元线性回归模型

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

    多元线性回归模型通常用来研究一个应变量依赖多个自变量的变化关系,如果二者的以来关系可以用线性形式来刻画,则可以建立多元线性模型来进行分析。
    1.模型简介
    1.1模型的结构
    多元线性回归模型通常用来描述变量y和x之间的随机线性关系,即:
    在这里插入图片描述
    如果对y和x进行了x次观测,得到n组观察值yi,x1i,…,xki(i=1,2,…,n),他们满足一下关系式:
    在这里插入图片描述
    在这里插入图片描述
    1.2模型参数的检验
    在正态假定下,如果X是列满秩的,则普通线性回归模型的参数最小二乘估计为:
    在这里插入图片描述
    于是y的估计值为:
    在这里插入图片描述
    (1)回归方程的显著性检验
    在这里插入图片描述
    (2)回归系数的显著性检验
    在这里插入图片描述
    2.建模步骤
    (1)根据数据建立回归模型
    (2)对模型进行显著性检验
    (3) 对模型进行回归诊断
    3.建模

    library(car)
    a=read.table("C:/Users/MrDavid/data_TS/reg.csv",sep=",",header=T)
    a
    lm.salary=lm(锘縴~x1+x2+x3+x4,data=a)
    summary(lm.salary)
    #注:锘縴是y乱码之后的结果
    

    在这里插入图片描述
    发现x2,x3,x4系数不显著。
    (2)对变量进行选择

    lm.step=step(lm.salary,direction="both")
    

    在这里插入图片描述
    如果去掉变量x2,AIC的值为648.49,如果去掉变量x3,AIC的值为650.85,如果去掉变量x1,AIC的值为715.19,所以在这里去掉x2.
    进行下一轮的计算:

    lm.salary=lm(锘縴~x1+x3+x4,data=a)
    lm.step=step(lm.salary,direction="both")
    

    在这里插入图片描述
    发现去掉x3,AIC 的值为647.64,所以去掉x3.
    单独对x1和x4,进行拟合。

    lm.salary=lm(锘縴~x1+x4,data=a)
    summary(lm.salary)
    

    在这里插入图片描述
    可以看出F检验P值小于0.05显著,各个参数系数也是显著的。
    (3)对上述回归模型进行回归残差诊断

    算出模型的标准化残差

    library(TSA)
    y.rst=rstandard(lm.step)
    y.rst
    

    在这里插入图片描述
    画出其残差散点图:
    在这里插入图片描述
    很明显发现4和35号点异常,将这两个点去除。

    lm.salary=lm(log(锘縴)~x1+x2+x3+x4,data=a[-c(4,35),])
    lm.step=step(lm.salary,direction="both")
    y.rst=rstandard(lm.step)
    y.fit=predict(lm.step)
    plot(y.rst~y.fit)
    

    去除两点后的结果:
    在这里插入图片描述
    在这里插入图片描述
    绘制模型诊断图:

    par(mfrow=c(2,2))
    plot(lm.step)
    influence.measures(lm.step)
    

    在这里插入图片描述
    残差拟合图基本上呈现随机分布模式,正态Q-Q图基本落在直线上,表明残差服从正态分布;大小-位置图和残差-杠杆图以小组的形式存在并且离中心不远。这说明3,4,35号观测值可能是异常点和强影响点。

    展开全文
  • 线性回归模型建模步骤 (一元线性回归、多元线性回归
  • 多元线性回归 python翻译自: https://medium.com/ai-in-plain-english/implementing-multiple-linear-regression-in-python-1364fc03a5a8多元线性回归 python
  • Matlab 多元线性回归

    2021-03-13 09:10:17
    用matlab实现的多元线性回归
  • 单变量线性回归 绘制散点图 相关系数R 拆分训练集和测试集 多变量线性回归 数据检验(判断是否可以做线性回归) 训练线性回归模型 先甩几个典型的线性回归的模型,帮助大家捡起那些年被忘记的数学。 ● 单...
  • 利用MATLAB进行多元线性回归 2.线性回归 b=regress(y,X) [b,bint,r,rint,s]=regress(y,X,alpha) 输入: y~因变量(列向量), X~1与自变量组成的矩阵, Alpha~显著性水平(缺省时设定为0.05) s: 3个统计统计 量:决定...
  • MATLAB 多元线性回归

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

    千次阅读 2018-11-10 21:25:40
    一元线性回归和多元线性回归表面意思容易理解,但是结合实际的数据集,会混乱。这也是在编写线性回归博文的时候梳理知识点发现自己的不足,同时记录下来,让有疑问的同学也可以得到答案,拨开乌云。 1.在数据集上的...
  • 线性回归——简单线性回归、多元线性回归

    千次阅读 多人点赞 2020-04-30 22:13:37
    当只有一个自变量时,称为简单线性回归,当具有多个自变量时,称为多元线性回归。 线性关系的理解: 画出来的图像是直的。 每个自变量的最高次项为1。 拟合是指构建一种算法,使得该算法能够符合真实的数据。从...
  • 基于MATLAB的多元线性回归模型学习资料
  • 多元线性回归分析

    2016-09-13 22:05:07
    多元线性回归,对于学习数据分析很有帮助
  • 1.多元线性回归 如下图,有X1,X2,...,Xn多个变量。 (1)多元线性回归的目标 (2)转换成矩阵相乘 (3)推导结果 以上式子被称为多元线性回归的正规方程解(Normal Equation)。多元线性回归...
  • matlab实现一元线性回归和多元线性回归

    万次阅读 多人点赞 2018-01-30 10:58:46
    回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是与多个因素相联系的,由多个自变量的最优组合共同来预测或估计因变量,比只用一个自变量进行预测或估计更有效,更符合实际。 ...
  • 多元线性回归 及其Python实现

    万次阅读 多人点赞 2019-04-05 21:14:11
    多元线性回归 Python实现 多元线性回归求解过程 多元线性回归的形式: 目标函数: 将一个样本的向量化: 将所有样本的向量化: 向量化后的目标函数及求解结果: ps.上述多元线性回归的正规方程解问题是:事件...
  • 多元线性回归分析预测 多元线性回归分析预测法概述 多元线性回归的计算模型 多元线性回归模型的检验 多元线性回归分析预测法案例分析
  • vc 多元线性回归

    2015-01-11 17:20:08
    vc 多元线性回归

空空如也

空空如也

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

多元线性回归含义