精华内容
下载资源
问答
  • 实现了多元线性回归模型matlab的代码
  • 里面包含适用于Matlab 多元线性回归的代码
  • 包括基于矩阵运算的多元线性回归、基于多元计算程序包以及计算共线性容忍度
  • 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

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

    展开全文
  • 一元与多元线性回归函数
  • 线性回归,前面用Python从底层一步一个脚印用两种方法实现了回归拟合。在这个高级语言层出不穷的年代,这样做显然不明智,所以我考虑用优秀的数据分析工具——R语言(不敢说最...

    我的博客

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

    多元回归分析,生活中用的很多,因为一个因素可能与很多其它因素有关!言归正传,这里考虑用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

    展开全文
  • 多元线性回归,多元线性回归r方 要多少,matlab源码
  • 多元线性回归,多元线性回归r方 要多少,matlab源码.rar
  • 多元线性回归

    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为样本的个数,π和σ为常数,不影响表达式的大小.所以去掉所有的常数项得到公式:

               

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

     

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

     

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

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

    万次阅读 多人点赞 2019-07-02 19:22:12
    多元线性回归模型通常用来研究一个应变量依赖多个自变量的变化关系,如果二者的以来关系可以用线性形式来刻画,则可以建立多元线性模型来进行分析。 1.模型简介 1.1模型的结构 多元线性回归模型通常用来描述变脸y和x...
  • R语言 简单和多元线性回归 酒庄数据库的具体应用案例分析
  • 单变量线性回归 绘制散点图 相关系数R 拆分训练集和测试集 多变量线性回归 数据检验(判断是否可以做线性回归) 训练线性回归模型 先甩几个典型的线性回归的模型,帮助大家捡起那些年被忘记的数学。 ● 单...
  • R语言与多元线性回归+逐步回归

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

    2021-03-13 09:10:17
    用matlab实现的多元线性回归
  • 利用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.在数据集上的...

空空如也

空空如也

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

多元线性回归逐步回归