精华内容
下载资源
问答
  • 多元线性回归分析步骤
    万次阅读 多人点赞
    2022-01-14 10:12:47

    目录

    一、回归分析的介绍与分类

    二、多元线性回归模型的条件

    1. 线性理解与内生性问题研究

    2. 异方差问题

    3. 多重共线性问题


    一、回归分析的介绍与分类

    回归分析的任务是:通过研究自变量X和因变量Y的关系,尝试去解释Y的形成机制,进而达到通过X去预测Y的目的

    三个关键字:相关性、因变量Y、自变量X

    常见的回归分析有五类(划分的依据是因变量Y的类型):

    • 线性回归:因变量Y为连续性数值变量,例如GDP的增长率

    • 0-1回归:因变量Y为0-1型变量,例如P2P公司研究借款人是否能按时还贷,那么Y可以设计为二值变量,Y=0时代表可以还贷,Y=1时代表不能还贷

    • 定序回归:因变量Y为定序变量 ,例如1表示不喜欢,2表示一般般,3表示喜欢

    • 计数回归:因变量Y为计数变量,例如管理学中的RFM模型,F代表一定时间内,客户到访的次数,次数其实就是一个非负整数

    • 生存回归:因变量Y为生存变量(截断数据),例如研究产品寿命,企业寿命和人的寿命,假设做吸烟对寿命的影响,选取的样本中老王60岁,但是老王此时身体很健康 ,不能等老王去世再做研究,所以只能记他的寿命为60+,这种数据就是截断的数据

    回归分析的使命

    1. 识别重要变量,那些自变量X是同Y真的相关

    2. 判断相关性的方向,正相关还是反相关

    3. 要估计权重

    回归分析的分类

    数据的分类

    • 横截面数据:在某一时点收集的不同对象的数据,eg:全国各省份2021年GDP数据

    • 时间序列数据:在同一对象在不同时间连续观察所得的数据,eg:某地方每隔一小时测得的温度数据

    • 面板数据:横截面数据和时间序列数据综合在一起的一种数据

    二、多元线性回归模型的条件

    • 模型符合线性模式

    • X满秩(无多重共线性)

    • 零均值价值 E(ξi​∣Xi​)=0 (自变量外生)无内生性问题

    • 同方差:Var(ξi​∣Xi​)=σ

    • 无自相关:Cov(ξi​,Xi​)=0

    1. 线性理解与内生性问题研究

    回归分析中对线性的理解

    回归分析中的线性假定并不要求初始模型都呈严格的线性关系,自变量和因变量可以通过变量替换来转换成线性模型

    例如:

    标准化回归系数

    我们通常得到的回归方程中的回归系数都是非标准化回归系数,表示的是在其他自变量不变的时候,该系数对应的自变量每增加一个单位的量,因变量就增加该系数的值,体现的是对因变量绝对的影响,并不能去判断不同自变量之间谁对因变量的影响大;而标准化回归系数就是指对数据进行标准化处理

    标准化处理:讲原始数据减去它的均数后除以它的标准差,计算得到新的变量值,消除了量纲、数量级等差异的影响

    标准化处理后得到的回归方程即为标准化回归方程,使得不同变量间具有可变性,标准回归系数的绝对值越大即对因变量的影响最大(只关注显著的回归系数)

    stata操作:在regress 后添加参数b

    regress y x1 x2 ... xk, b

    对数据进行描述性统计的方法

    • excel数据分析

    • stata-summarize

    Stata工具的使用

    1. 数据的描述性统计

      • 定量数据:summarize 变量1 变量2 ...

      • 定性数据:tabulate 变量名, (gen(A))

        返回对应这个变量的频率分布表,可选择并生成对应的虚拟变量(以A开头)

        虚拟变量是针对定性数据而设置的特殊变量详细解释看Chapter7

    2. 回归分析

      regression y x1 x2 ... xk(默认采用的是OLS普通最小二乘法)

    利用Stata对数据进行回归分析的注意点

    解释

    1. 上表格第一行依次为SS(sum of squares),df(degree of freedom),MS(mean square)

    2. 右边的F(df of model, df of residual) = MS of Model / MS of Residual = 7.7543e+10/5.1386e+9 = 15.09

    3. F值的H0假设是:所有的自变量predictor都对y不会产生影响,即所有predictor的coef都=0,所有的predictor都不significant

    4. 下面的prob > F是指上述H0成立的可能性。当其趋于0时表示至少会有一些predictor的coef不为0(即相关)——模型合理

    5. Adj R-squared 由于R2存在一个问题:无论什么predictor加到模型中,R2都会变大。为了避免这个问题,adjR2惩罚了模型的复杂度

    6. 下面这张表格的第一列为coef回归系数

    7. 第二列为Coef的Std.Err,值越小说明Coef的值越可信

    8. 第三列t值=Coef / Std.Err,|t-statistics| > 2对应的predictor就是significant

    9. 第三列是p > |t|,表示prob > |t|,值小于0.05一般就是significant

    核心关注点

    模型是否合理:联合显著性检验,如果P值<0.05说明存在相关性,否则不存在

    置信度高低(系数显著与否):如果P值(蓝色)<0.1说明置信度>90%,<0.05说明置信度大于95%,Regession coeffient显著

    2. 异方差问题

    第一张为同方差:生成的线性模型到每个数据的垂直水平距离相差无几就是同方差; 后面三张即为不同类型的异方差

    异方差的检验

    1. 残差图检验(应该是稳定的平行于X轴) Stata中的操作:

      • rvfplot (画残差与拟合值的散点图)

      • rvpplot x (画残差与自变量X的散点图)

    2. 怀特检验(white检验) Stata中的操作: 

      estat imtest, white

            怀特检验的原假设:不存在异方差         若p值<0.05说明在置信度95%以上认为原假设不成立

    异方差的纠正

    1. OLS+稳健的标准差

      如果发现存在异方差,一 种处理方法是,仍然进行OLS 回归,但使用稳健标准误。这是最简单,也是目前通用的方法。只要样本容量较大,即使在异方差的情况下,若使用稳健标准误,则所 有参数估计、假设检验均可照常进行。换言之,只要使用了稳健标准误,就可以与异方差“和平共处”了。

      Stata的操作: 

      regress y x1 x2 ... xk, robust
    2. 广义最小二乘法GLS

    Stock and Watson (2011)推荐,在大多数情况下应该使用“OLS + 稳健标准误”

    3. 多重共线性问题

    表现:

    • 系数估计值符号相反

    • 某些重要的解释变量t值低但是R2不低

    • 当一不太重要的解释变量被删除后,回归结果显著变化

    原因

    • 某一解释遍历可以由其他解释变量线性表示

    • 解释变量享有共同的时间趋势

    • 由于数据收集的基础不够宽,某些解释变量可能会一起变动

    • 一个解释变量是另一个的滞后,二者往往遵循一个趋势

    检验(VIF)

    Stata操作: 

    estat vif

    Soution

    逐步回归分析

    较好在生成线性模型时就能避免多重共线性问题

    • 向前逐步回归Forward selection:将自变量逐个引入模型,每引入一个后都要进行检验,显著时才加入回归模型 
      缺点:随着以后的自变量的引入,原来显著的自变量也可能变成不显著
    • 向后逐步回归Backward elimination:与向前逐步回归相反,先将所有自变量添加,之后一个个地尝试将自变量从模型中剔除,看整个模型解释因变量的变异是否有显著变化,之后将最没有解释力的剔除,不断迭代,直到没有需要被剔除的

    Stata操作:

    Forward selection:

    stepwise regress y x1 x2 ... xk, pe(#1)

    pe(#1) specifies the significance level for addition to the model; terms with p<#1 are eligible for addition(eg#1=0.05,当p值小于0.05时,认为显著,才可以被添加到模型中)

    Backward elimination:

    stepwise regress y x1 x2 .. xk, pr(#2)

    pr(#2) specifies thr significance level for removal from the model; terms with p>#2 are eligible for removal(eg#2=0.75,当p值大于0.75时,认为不显著,剔除模型)

    注意:在stata中,只有regress才会自动排除完全多重共线性,而采用逐步回归stepwise regress则不会,所以需要手动剔除掉造成完全多重共线性的自变量;可以在后面添加参加b和r,即标准化回归系数或稳健标准误

    更多相关内容
  • SPSS多元线性回归分析实例操作步骤-spss做多元线性回归.pdf
  • 线性回归模型建模步骤 (一元线性回归、多元线性回归
  • Excel做多元线性回归

    万次阅读 2021-10-26 13:09:36
    一、EXCEL进行多元线性回归 1.首先需要下载一个数据分析的插件: 点击左上角文件->选项->加载项->分析工具库->转到-数据分析库->确定 下载好插件之后就可以看到这里多了一个数据分析 点击...

    一、EXCEL进行多元线性回归

    1.首先需要下载一个数据分析的插件:

    点击左上角文件->选项->加载项->分析工具库->转到-数据分析库->确定

     

    下载好插件之后就可以看到这里多了一个数据分析

    点击数据->数据分析

    首先删除表里的非数据项,以进行多元线性回归

    这里选择了所有的数据

    二、多元线性回归模型预测房价

    1.导入包

    import pandas as pd
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    

    2.读入数据

    df = pd.read_csv('E:\house_prices.csv')
    df.info(); df.head()
    

    3.输出结果

     三、变量探索

    1.数据处理

    # 异常值处理
    # ================ 异常值检验函数:iqr & z分数 两种方法 =========================
    def outlier_test(data, column, method=None, z=2):
        """ 以某列为依据,使用 上下截断点法 检测异常值(索引) """
        """ 
        full_data: 完整数据
        column: full_data 中的指定行,格式 'x' 带引号
        return 可选; outlier: 异常值数据框 
        upper: 上截断点;  lower: 下截断点
        method:检验异常值的方法(可选, 默认的 None 为上下截断点法),
                选 Z 方法时,Z 默认为 2
        """
        # ================== 上下截断点法检验异常值 ==============================
        if method == None:
            print(f'以 {column} 列为依据,使用 上下截断点法(iqr) 检测异常值...')
            print('=' * 70)
            # 四分位点;这里调用函数会存在异常
            column_iqr = np.quantile(data[column], 0.75) - np.quantile(data[column], 0.25)
            # 1,3 分位数
            (q1, q3) = np.quantile(data[column], 0.25), np.quantile(data[column], 0.75)
            # 计算上下截断点
            upper, lower = (q3 + 1.5 * column_iqr), (q1 - 1.5 * column_iqr)
            # 检测异常值
            outlier = data[(data[column] <= lower) | (data[column] >= upper)]
            print(f'第一分位数: {q1}, 第三分位数:{q3}, 四分位极差:{column_iqr}')
            print(f"上截断点:{upper}, 下截断点:{lower}")
            return outlier, upper, lower
        # ===================== Z 分数检验异常值 ==========================
        if method == 'z':
            """ 以某列为依据,传入数据与希望分段的 z 分数点,返回异常值索引与所在数据框 """
            """ 
            params
            data: 完整数据
            column: 指定的检测列
            z: Z分位数, 默认为2,根据 z分数-正态曲线表,可知取左右两端的 2%,
               根据您 z 分数的正负设置。也可以任意更改,知道任意顶端百分比的数据集合
            """
            print(f'以 {column} 列为依据,使用 Z 分数法,z 分位数取 {z} 来检测异常值...')
            print('=' * 70)
            # 计算两个 Z 分数的数值点
            mean, std = np.mean(data[column]), np.std(data[column])
            upper, lower = (mean + z * std), (mean - z * std)
            print(f"取 {z} 个 Z分数:大于 {upper} 或小于 {lower} 的即可被视为异常值。")
            print('=' * 70)
            # 检测异常值
            outlier = data[(data[column] <= lower) | (data[column] >= upper)]
            return outlier, upper, lower
    

     2.调用函数

    outlier, upper, lower = outlier_test(data=df, column='price', method='z')
    outlier.info(); outlier.sample(5)
    

    3.结果

     4.删除错误数据

    # 这里简单的丢弃即可
    df.drop(index=outlier.index, inplace=True)
    

    四、分析数据

    1.定义变量

    # 类别变量,又称为名义变量,nominal variables
    nominal_vars = ['neighborhood', 'style']
    
    for each in nominal_vars:
        print(each, ':')
        print(df[each].agg(['value_counts']).T)
        # 直接 .value_counts().T 无法实现下面的效果
         ## 必须得 agg,而且里面的中括号 [] 也不能少
        print('='*35)
        # 发现各类别的数量也都还可以,为下面的方差分析做准备
    

    # 热力图 
    def heatmap(data, method='pearson', camp='RdYlGn', figsize=(10 ,8)):
        """
        data: 整份数据
        method:默认为 pearson 系数
        camp:默认为:RdYlGn-红黄蓝;YlGnBu-黄绿蓝;Blues/Greens 也是不错的选择
        figsize: 默认为 10,8
        """
        ## 消除斜对角颜色重复的色块
        #     mask = np.zeros_like(df2.corr())
        #     mask[np.tril_indices_from(mask)] = True
        plt.figure(figsize=figsize, dpi= 80)
        sns.heatmap(data.corr(method=method), \
                    xticklabels=data.corr(method=method).columns, \
                    yticklabels=data.corr(method=method).columns, cmap=camp, \
                    center=0, annot=True)
        # 要想实现只是留下对角线一半的效果,括号内的参数可以加上 mask=mask
    

     2.调用函数输出结果

    # 通过热力图可以看出 area,bedrooms,bathrooms 等变量与房屋价格 price 的关系都还比较强
     ## 所以值得放入模型,但分类变量 style 与 neighborhood 两者与 price 的关系未知
    heatmap(data=df, figsize=(6,5))
    

     四、拟合

    1.代码:

        
    import statsmodels.api as sm
    from statsmodels.formula.api import ols # ols 为建立线性回归模型的统计学库
    from statsmodels.stats.anova import anova_lm
    
    df = df.copy().sample(600)
    
    # C 表示告诉 Python 这是分类变量,否则 Python 会当成连续变量使用
    ## 这里直接使用方差分析对所有分类变量进行检验
    ## 下面几行代码便是使用统计学库进行方差分析的标准姿势
    lm = ols('price ~ C(neighborhood) + C(style)', data=df).fit()
    anova_lm(lm)
    
    # Residual 行表示模型不能解释的组内的,其他的是能解释的组间的
    # df: 自由度(n-1)- 分类变量中的类别个数减1
    # sum_sq: 总平方和(SSM),residual行的 sum_eq: SSE
    # mean_sq: msm, residual行的 mean_sq: mse
    # F:F 统计量,查看卡方分布表即可
    # PR(>F): P 值
    
    # 反复刷新几次,发现都很显著,所以这两个变量也挺值得放入模型中
    

    2.结果:

     3.多元线性回归建模

    代码:

    from statsmodels.formula.api import ols
    
    lm = ols('price ~ area + bedrooms + bathrooms', data=df).fit()
    lm.summary()
    

    结果:

     四、sklearn多元线性回归预测房价

    1.导入包

    import pandas as pd
    import numpy as np
    import math
    import matplotlib.pyplot as plt # 画图
    from sklearn import linear_model # 线性模型
    data = pd.read_csv('E:\house_prices.csv') #读取数据,改为
    data.head() #数据展示
    
    

    2.结果

     

    2.去除第一列house_id

    代码:

    new_data=data.iloc[:,1:] #除掉id这一列
    new_data.head()
    

     

     关系矩阵显示:

    new_data.corr() # 相关系数矩阵,只统计数值列
    
    

     

    赋值变量

    代码:

    x_data = new_data.iloc[:, 0:5] #area、bedrooms、bathroom对应列
    y_data = new_data.iloc[:, -1] #price对应列
    print(x_data, y_data, len(x_data))
    
    

     建立模型并输出:

    # 应用模型
    model = linear_model.LinearRegression()
    model.fit(x_data, y_data)
    print("回归系数:", model.coef_)
    print("截距:", model.intercept_)
    print('回归方程: price=',model.coef_[0],'*neiborhood+',model.coef_[1],'*area +',model.coef_[2],'*bedrooms +',model.coef_[3],'*bathromms +',model.coef_[4],'*sytle ',model.intercept_)
    
    

     对数据清洗后再求解

    new_data_Z=new_data.iloc[:,0:]
    new_data_IQR=new_data.iloc[:,0:]
    
    
    # ================ 异常值检验函数:iqr & z分数 两种方法 =========================
    def outlier_test(data, column, method=None, z=2):
        """ 以某列为依据,使用 上下截断点法 检测异常值(索引) """
        """ 
        full_data: 完整数据
        column: full_data 中的指定行,格式 'x' 带引号
        return 可选; outlier: 异常值数据框 
        upper: 上截断点;  lower: 下截断点
        method:检验异常值的方法(可选, 默认的 None 为上下截断点法),
                选 Z 方法时,Z 默认为 2
        """
        # ================== 上下截断点法检验异常值 ==============================
        if method == None:
            print(f'以 {column} 列为依据,使用 上下截断点法(iqr) 检测异常值...')
            print('=' * 70)
            # 四分位点;这里调用函数会存在异常
            column_iqr = np.quantile(data[column], 0.75) - np.quantile(data[column], 0.25)
            # 1,3 分位数
            (q1, q3) = np.quantile(data[column], 0.25), np.quantile(data[column], 0.75)
            # 计算上下截断点
            upper, lower = (q3 + 1.5 * column_iqr), (q1 - 1.5 * column_iqr)
            # 检测异常值
            outlier = data[(data[column] <= lower) | (data[column] >= upper)]
            print(f'第一分位数: {q1}, 第三分位数:{q3}, 四分位极差:{column_iqr}')
            print(f"上截断点:{upper}, 下截断点:{lower}")
            return outlier, upper, lower
        # ===================== Z 分数检验异常值 ==========================
        if method == 'z':
            """ 以某列为依据,传入数据与希望分段的 z 分数点,返回异常值索引与所在数据框 """
            """ 
            params
            data: 完整数据
            column: 指定的检测列
            z: Z分位数, 默认为2,根据 z分数-正态曲线表,可知取左右两端的 2%,
               根据您 z 分数的正负设置。也可以任意更改,知道任意顶端百分比的数据集合
            """
            print(f'以 {column} 列为依据,使用 Z 分数法,z 分位数取 {z} 来检测异常值...')
            print('=' * 70)
            # 计算两个 Z 分数的数值点
            mean, std = np.mean(data[column]), np.std(data[column])
            upper, lower = (mean + z * std), (mean - z * std)
            print(f"取 {z} 个 Z分数:大于 {upper} 或小于 {lower} 的即可被视为异常值。")
            print('=' * 70)
            # 检测异常值
            outlier = data[(data[column] <= lower) | (data[column] >= upper)]
            return outlier, upper, lower
    
    outlier, upper, lower = outlier_test(data=new_data_Z, column='price', method='z')
    outlier.info(); outlier.sample(5)
    
    # 这里简单的丢弃即可
    new_data_Z.drop(index=outlier.index, inplace=True)
    

    输出结果:

     4price 列为依据,使用 上下截断点法(iqr) 检测异常值

    outlier, upper, lower = outlier_test(data=new_data_IQR, column='price')
    outlier.info(); outlier.sample(6)
    
    # 这里简单的丢弃即可
    new_data_IQR.drop(index=outlier.index, inplace=True)
    
    

    输出数据相关矩阵

    print("原数据相关性矩阵")
    new_data.corr()
    
    

     

    Z方法处理的数据相关性矩阵

    在这里插入代码片print("Z方法处理的数据相关性矩阵")
    new_data_Z.corr()
    

     

     建模输出:

    x_data = new_data_Z.iloc[:, 0:5]
    y_data = new_data_Z.iloc[:, -1]
    # 应用模型
    model = linear_model.LinearRegression()
    model.fit(x_data, y_data)
    print("回归系数:", model.coef_)
    print("截距:", model.intercept_)
    print('回归方程: price=',model.coef_[0],'*neiborhood+',model.coef_[1],'*area +',model.coef_[2],'*bedrooms +',model.coef_[3],'*bathromms +',model.coef_[4],'*sytle ',model.intercept_)
    
    

     

    五、总结

    通过对多元线性回归的模拟,加深了对EXCEL的使用经验,也学会了如何使用使用sklearn库调用函数的方法,对sklearn的使用也更加熟练。

    六、参考

    多元线性回归算法预测房价

    多元线性回归分析

    数据清洗技术——Excel数据清洗

    展开全文
  • 线性回归是回归分析的一种,评估的自变量X与因变量Y之间是一种线性关系,当只有一个自变量时,成为简单线性回归,当具有多个变量时,称为多元线性回归。 线性关系的理解: >画出来的图像是直的(简单线性回归...

    回归分析是用来评估变量之间关系的统计过程。用来解释自变量X与因变量Y的关系。即当自变量X发生改变时,因变量Y会如何发生改变。

    线性回归是回归分析的一种,评估的自变量X与因变量Y之间是一种线性关系,当只有一个自变量时,成为简单线性回归,当具有多个变量时,称为多元线性回归。

    线性关系的理解:

    >画出来的图像是直的(简单线性回归是直线,多元线性回归是超平面)

    >每个自变量的最高次项为1

    拟合是指构建一种算法,使得该算法能够符合真实的数据。从机器学习角度讲,线性回归就是要构建一个线性函数,使得该函数与目标值之间的相符性最好。从空间的角度来看,就是要让函数的直线(面),尽可能靠近空间中所有的数据点(点到直线的平行于y轴的距离之和最短)。线性回归会输出一个连续值。

    线性回归模型

    1、简单线性回归(用直线拟合数据关系)

    我们可以以房屋面积(x)与房价(y)为例,二者是线性关系,房屋价格正比于房屋面积,假设比例为w:

    在这里插入图片描述

    然而,这种线性方程一定是过原点的,即x为0时,y也一定为0。这可能并不符合现实中某些场景。为了能够让方程具有更广泛的适应性,就要再增加一个截距,设为b,则方程可以变为:

    在这里插入图片描述

     以上方程就是数据建模的模型,w与b就是模型的参数。
    线性回归是用来解释自变量与因变量之间的关系,但这种关系并非严格的函数映射关系。

    2、多元线性回归(多元线性回归在空间中,可以表示为一个超平面,去拟合空间中的数据点)

    现实中的数据可能是比较复杂的,自变量也可能不止一个,例如,影响房屋价格也很可能不止房屋面积一个因素,可能还有是否在地铁附近,房间数,层数,建筑年代等诸多因素。不过,这些因素对房价影响的权重是不同的,因此,我们可以使用多个权重来表示多个因素与房屋价格的关系:

    在这里插入图片描述

    • x:影响因素,即特征。
    • w:每个x的影响力度。
    • n:特征的个数。
    • y^:房屋的预测价格。

    在这里插入图片描述

     这样,就可以表示为:

    在这里插入图片描述

     多元线性回归在空间中,可以表示为一个超平面,去拟合空间中的数据点。
    我们的目的就是从现有的数据中,去学习w与b的值。一旦w与b的值确定,就能够确定拟合数据的线性方程,这样就可以对未知的数据x进行预测y(房价)。

    线性回归(详解)

    还是按照简介的思路来说,以简单的一元线性回归(一元代表只有一个未知自变量)做介绍。

    有n组数据,自变量x(x1,x2,…,xn),因变量y(y1,y2,…,yn),然后我们假设它们之间的关系是:f(x)=ax+b。那么线性回归的目标就是如何让f(x)和y之间的差异最小,换句话说就是a,b取什么值的时候f(x)和y最接近。
    这里我们得先解决另一个问题,就是如何衡量f(x)和y之间的差异。在回归问题中,均方误差是回归任务中最常用的性能度量(自行百度一下均方误差)。记J(a,b)为f(x)和y之间的差异,即

    在这里插入图片描述
    i代表n组数据中的第i组。
    这里称J(a,b)为损失函数,明显可以看出它是个二次函数,即凸函数(这里的凸函数对应中文教材的凹函数),所以有最小值。当J(a,b)取最小值的时候,f(x)和y的差异最小,然后我们可以通过J(a,b)取最小值来确定a和b的值。

    到这里可以说线性回归就这些了,只不过我们还需要解决其中最关键的问题:确定a和b的值。
     

    下面介绍三种方法来确定a和b的值:

    1、最小二乘法

           既然损失函数J(a,b)是凸函数,那么分别关于a和b对J(a,b)求偏导,并令其为零解出a和b。这里直接给出结果:

    在这里插入图片描述

    在这里插入图片描述

    解得:

    在这里插入图片描述

    在这里插入图片描述

    2、梯度下降法

          首先你得先了解一下梯度的概念:梯度的本意是一个向量(矢量),表示某一函数(该函数一般是二元及以上的)在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
    当函数是一元函数时,梯度就是导数。这里我们用一个最简单的例子来讲解梯度下降法,然后推广理解更为复杂的函数。
    还是用上面的例子,有n组数据,自变量x(x1,x2,…,xn),因变量y(y1,y2,…,yn),但这次我们假设它们之间的关系是:f(x)=ax。记J(a)为f(x)和y之间的差异,即

    在这里插入图片描述

    在梯度下降法中,需要我们先给参数a赋一个预设值,然后再一点一点的修改a,直到J(a)取最小值时,确定a的值。下面直接给出梯度下降法的公式(其中α为正数):

    在这里插入图片描述

     下面解释一下公式的意义,J(a)和a的关系如下图,

    在这里插入图片描述

     假设给a取的预设值是a1的话,那么a对J(a)的导数为负数,则

    在这里插入图片描述

     也为负数,所以

    在这里插入图片描述

     意味着a向右移一点。然后重复这个动作,直到J(a)到达最小值。
    同理,假设给a取的预设值是a2的话,那么a对J(a)的导数为正数,则

    在这里插入图片描述

     意味着a向左移一点。然后重复这个动作,直到J(a)到达最小值。
    所以我们可以看到,不管a的预设值取多少,J(a)经过梯度下降法的多次重复后,最后总能到达最小值。
    这里再举个生活中的栗子,梯度下降法中随机给a赋一个预设值就好比你随机出现在一个山坡上,然后这时候你想以最快的方式走到山谷的最低点,那么你就得判断你的下一步该往那边走,走完一步之后同样再次判断下一步的方向,以此类推就能走到山谷的最低点了。而公式中的α我们称它为学习率,在栗子中可以理解为你每一步跨出去的步伐有多大,α越大,步伐就越大。(实际中α的取值不能太大也不能太小,太大会造成损失函数J接近最小值时,下一步就越过去了。好比在你接近山谷的最低点时,你步伐太大一步跨过去了,下一步往回走的时候又是如此跨过去,永远到达不了最低点;α太小又会造成移动速度太慢,因为我们当然希望在能确保走到最低点的前提下越快越好。)
    到这里,梯度下降法的思想你基本就理解了,只不过在栗子中我们是用最简单的情况来说明,而事实上梯度下降法可以推广到多元线性函数上,这里直接给出公式,理解上(需要你对多元函数的相关知识有了解)和上面的栗子殊途同归。
    假设有n组数据,其中目标值(因变量)与特征值(自变量)之间的关系为:

    在这里插入图片描述

     其中i表示第i组数据,损失函数为:

    损失函数

     梯度下降法:

    在这里插入图片描述

    3、正规方程
    (这里需要用到矩阵的知识)

    正规方程一般用在多元线性回归中,原因等你看完也就能理解为什么。所以这里不再用一元线性回归举栗子了。
    同样,假设有n组数据,其中目标值(因变量)与特征值(自变量)之间的关系为:

    在这里插入图片描述

     其中i表示第i组数据,这里先直接给出正规方程的公式:

    在这里插入图片描述

     推导过程如下

    记矩阵

    在这里插入图片描述

     向量

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

     损失函数为:

    在这里插入图片描述

     对损失函数求导并令其为0,有

    在这里插入图片描述

     解得

    在这里插入图片描述

     到此,就求出了所有系数θ。不过正规方程需要注意的是

    在这里插入图片描述

     在实际中可能会出现是奇异矩阵,往往是因为特征值之间不独立。这时候需要对特征值进行筛选,剔除那些存在线性关系的特征值(好比在预测房价中,特征值1代表以英尺为尺寸计算房子,特征值2代表以平方米为尺寸计算房子,这时特征值1和特征值2只需要留1个即可)。

    好了,以上就是线性回归的讲解(如果对你理解线性回归确实有帮助的话,帮忙点个赞,同时也欢迎指出问题)。 下面再补充一下个人对上面三种确定系数θ方法的评估。

        梯度下降法是通用的,包括更为复杂的逻辑回归算法中也可以使用,但是对于较小的数据量来说它的速度并没有优势
        正规方程的速度往往更快,但是当数量级达到一定的时候,还是梯度下降法更快,因为正规方程中需要对矩阵求逆,而求逆的时间复杂的是n的3次方
        最小二乘法一般比较少用,虽然它的思想比较简单,在计算过程中需要对损失函数求导并令其为0,从而解出系数θ。但是对于计算机来说很难实现,所以一般不使用最小二乘法。

     

    展开全文
  • 基于jupyter notebook的python编程—–运用sklearn库,导入文件数据模拟多元线性回归分析的目录一、运行jupyter notebook,搭建python环境1、打开Windows终端命令行,输入==jupyter notebook==,打开我们的jupyter...
  • 多元线性回归分析

    千次阅读 2021-10-21 09:24:41
    小鹿一、概念二、EXCEL进行多元线性回归三、sklearn3.1 不进行数据处理3.2 进行数据处理3.3 分析四、总结五、参考 一、概念 在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是...

    一、概念

    • 在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是与多个因素相联系的,由多个自变量的最优组合共同来预测或估计因变量,比只用一个自变量进行预测或估计更有效,更符合实际。因此多元线性回归比一元线性回归的实用意义更大。

    二、EXCEL进行多元线性回归

    • 1.删掉表里的非数据项,以进行多元线性回归
      在这里插入图片描述
    • 2.选中要进行多元线性回归的区域,点击文件在这里插入图片描述
    • 3.选择更多里面的选项在这里插入图片描述
    • 4.进入加载项,点击转到在这里插入图片描述
    • 5.选择分析数据库在这里插入图片描述
    • 6.点击数据里的数据分析在这里插入图片描述
    • 7.选择回归在这里插入图片描述
    • 8.分别选中x和y值的区域,输出选项可以选新工作表组,这样就可以在新工作表里看到了,弄好之后点击确认就行了。在这里插入图片描述
    • 10、结果,intercept为截距,下面几行就是对应自变量的系数在这里插入图片描述

    三、代码方式实现多元线性回归

    3.1 用sklearn包实现

    3.1.1 不进行数据处理

    • 1.导入包
    import pandas as pd
    import numpy as np
    import seaborn as sns
    from sklearn import datasets
    from sklearn.linear_model import LinearRegression
    
    • 2.读取文件
    df = pd.read_csv('..\\source\\house_prices.csv')
    df.info()#显示列名和数据类型类型
    df.head(6)#显示前n行,n默认为5
    
    • 3.取出自变量和因变量
    #取出自变量
    data_x=df[['area','bedrooms','bathrooms']]
    data_y=df['price']
    
    • 4.进行多元线性回归并得出结果
    # 进行多元线性回归
    model=LinearRegression()
    l_model=model.fit(data_x,data_y)
    print('参数权重')
    print(model.coef_)
    print('模型截距')
    print(model.intercept_)
    
    • 结果
      在这里插入图片描述

    3.1.2 进行数据处理

    • 1.前面两步的步骤是一样的,接下来是进行异常值检测
    # 异常值处理
    # ================ 异常值检验函数:iqr & z分数 两种方法 =========================
    def outlier_test(data, column, method=None, z=2):
        """ 以某列为依据,使用 上下截断点法 检测异常值(索引) """
        """ 
        full_data: 完整数据
        column: full_data 中的指定行,格式 'x' 带引号
        return 可选; outlier: 异常值数据框 
        upper: 上截断点;  lower: 下截断点
        method:检验异常值的方法(可选, 默认的 None 为上下截断点法),
                选 Z 方法时,Z 默认为 2
        """
        # ================== 上下截断点法检验异常值 ==============================
        if method == None:
            print(f'以 {column} 列为依据,使用 上下截断点法(iqr) 检测异常值...')
            print('=' * 70)
            # 四分位点;这里调用函数会存在异常
            column_iqr = np.quantile(data[column], 0.75) - np.quantile(data[column], 0.25)
            # 1,3 分位数
            (q1, q3) = np.quantile(data[column], 0.25), np.quantile(data[column], 0.75)
            # 计算上下截断点
            upper, lower = (q3 + 1.5 * column_iqr), (q1 - 1.5 * column_iqr)
            # 检测异常值
            outlier = data[(data[column] <= lower) | (data[column] >= upper)]
            print(f'第一分位数: {q1}, 第三分位数:{q3}, 四分位极差:{column_iqr}')
            print(f"上截断点:{upper}, 下截断点:{lower}")
            return outlier, upper, lower
        # ===================== Z 分数检验异常值 ==========================
        if method == 'z':
            """ 以某列为依据,传入数据与希望分段的 z 分数点,返回异常值索引与所在数据框 """
            """ 
            params
            data: 完整数据
            column: 指定的检测列
            z: Z分位数, 默认为2,根据 z分数-正态曲线表,可知取左右两端的 2%,
               根据您 z 分数的正负设置。也可以任意更改,知道任意顶端百分比的数据集合
            """
            print(f'以 {column} 列为依据,使用 Z 分数法,z 分位数取 {z} 来检测异常值...')
            print('=' * 70)
            # 计算两个 Z 分数的数值点
            mean, std = np.mean(data[column]), np.std(data[column])
            upper, lower = (mean + z * std), (mean - z * std)
            print(f"取 {z} 个 Z分数:大于 {upper} 或小于 {lower} 的即可被视为异常值。")
            print('=' * 70)
            # 检测异常值
            outlier = data[(data[column] <= lower) | (data[column] >= upper)]
            return outlier, upper, lower
    
    • 2.得到异常集并进行丢弃
    outlier, upper, lower = outlier_test(data=df, column='price', method='z')#获得异常数据
    outlier.info(); outlier.sample(5)
    df.drop(index=outlier.index, inplace=True)#丢弃异常数据
    
    • 3.取出自变量和因变量
    #取出自变量
    data_x=df[['area','bedrooms','bathrooms']]
    data_y=df['price']
    
    • 4.进行多元线性回归并得出结果
    # 进行多元线性回归
    model=LinearRegression()
    l_model=model.fit(data_x,data_y)
    print('参数权重')
    print(model.coef_)
    print('模型截距')
    print(model.intercept_)
    
    • 结果
      在这里插入图片描述

    3.2 用线性回归模型的统计学库实现

    • 3.2.1 数据的预处理都是一样的,只是后面的导入的函数不一样了,下面是进行了虚拟变量设置并进行数据拼接
    # 对名义变量neighborhood进行处理
    # 设置虚拟变量
    nominal_data = df['neighborhood']
    # 设置虚拟变量
    dummies = pd.get_dummies(nominal_data)
    dummies.sample() # pandas 会自动帮你命名
    # 每个名义变量生成的虚拟变量中,需要各丢弃一个,这里以丢弃C为例
    dummies.drop(columns=['C'], inplace=True)
    dummies.sample()
    # 对名义变量style进行处理
    # 设置虚拟变量
    nominal_style_data = df['style']
    # 设置虚拟变量
    style_dummies = pd.get_dummies(nominal_style_data)
    style_dummies.sample() # pandas 会自动帮你命名
    # 每个名义变量生成的虚拟变量中,需要各丢弃一个,这里以丢弃lodge
    #原因:转化后的虚拟变量需要舍弃一个,才能得到满秩矩阵,可理解为当变量名可划分为n类时,只需要n-1个虚拟变量就能获取所有信息了
    style_dummies.drop(columns=['lodge'], inplace=True)
    style_dummies.sample()
    #数据拼接
    results = pd.concat(objs=[df, dummies], axis='columns') # 按照列来合并
    results = pd.concat(objs=[results, style_dummies], axis='columns') # 按照列来合并
    results.sample(3)
    
    • 3.2.2进行预测
    from statsmodels.formula.api import ols
    #使用虚拟变量
    lm = ols('price ~ area + bedrooms + bathrooms + A + B', data=results).fit()
    lm.summary()
    
    • 3.2.3 预测结果,结果会比用sklearn详细许多在这里插入图片描述

    • 3.2.4 提示可能出现多元共线性,检验一下,再次建模

    def vif(df, col_i):
        """
        df: 整份数据
        col_i:被检测的列名
        """
        cols = list(df.columns)
        cols.remove(col_i)
        cols_noti = cols
        formula = col_i + '~' + '+'.join(cols_noti)
        r2 = ols(formula, df).fit().rsquared
        return 1. / (1. - r2)
    test_data = results[['area', 'bedrooms', 'bathrooms', 'A', 'B']]
    for i in test_data.columns:
        print(i, '\t', vif(df=test_data, col_i=i))
    
    • 3.2.5 检验结果如下,可以看到bedroom和bathroom相关程度较高在这里插入图片描述
    • 3.2.6 去掉bedroom,再次建模
    # 去掉bedroom再次建模
    lm = ols(formula='price ~ area + bathrooms + A + B', data=results).fit()
    lm.summary()
    
    • 3.2.7 得出结果在这里插入图片描述

    3.3 分析

    当不进行数据处理时,用jupyter和使用excel进行数据分析的结果是一样的,但进行了数据清理之后回归方程与之前相差的挺大的,而进行了多元共线性检测以后,结果变得更为合理了。

    四、总结

    初步了解了多元线性回归的步骤,也清楚了异常数据对于回归方程的影响,在进行数据处理之前应该先进行数据预处理,同时也要考虑两个变量的关系。

    五、参考

    Excel-一元线性回归和多元线性回归(借助数据分析功能和直接计算)

    展开全文
  • spss进行多元线性回归分析表格

    万次阅读 多人点赞 2019-04-01 00:50:26
    1.如何使用spss进行多元线性回归。 2.分析生成结果,并判断回归是否可行。 一、使用spss进行多元线性回归: 1.输入数据 2. 3. 4. 5. 6. 二、表格结果分析: R方是检验回归是否成功的重要要素...
  • 在本专栏的第六篇数学建模学习笔记(六)多元回归分析算法(matlab)...在多元线性回归分析之前,有必要先对数据是否具有线性做个直观判断。(否则,一眼看出来不是线性就没必要线性回归了)。散点图是比较方便的办法。
  • 线性回归分析步骤总结

    千次阅读 2022-04-02 16:16:23
    自变量为2个及以上时,称为多元线性回归。线性回归广泛的应用于自然科学、社会科学等各个领域中。例如:研究吸烟、肥胖、运动等因素是否影响高血压发病率;土壤、水分、光照是否影响植物生长等。 2.数据类型 线性...
  • 利用eviews做多元线性回归分析 1、居民消费价格指数CPI,工业品出厂价格指数PPI, 固定资产投资价格指数之间的线性回归 Y :居民消费价格指数CPI(%) X1:工业品出厂价格指数PPI (%) X2:固定资产投资价格指数(%)...
  • SPSS多元线性回归分析实例操作步骤.doc
  • SPSS多元线性回归分析实例操作步骤7.doc
  • 现在用 Python 写线性回归的博客都快烂大街了,为什么还要用 SPSS 做线性回归呢?这就来说说 SPSS 存在的原因吧。 SPSS 是一个很强大的软件,不用编程,不用调参,点巴两下就出结果了,而且出来的大多是你想要的。...
  • SPSS多元线性回归分析研究实例操作步骤.doc
  • SPSS多元线性回归分析报告实例操作步骤.doc
  • 但现实问题中,我们往往会碰到多个变量间的线性关系的问题,这时就要用到多元线性回归多元线性回归是一元回归的一种推广,其在实际应用中非常广泛,本文就用python代码来展示一下如何用多元线性回归来解决实际问题...
  • 一、数据调用与预处理 ...以下简述掉用过程和数据处理步骤。 data("iris")# 运行后 Environment 中的 Data 就会出现iris数据集 #分类变量Species处理 iris$isSetosa <- ifelse(iris$Species == 'setosa',
  • 当影响因变量的因素是多个时候,这种一个变量同时与多个变量的回归问题就是多元回归,分为:多元线性回归和多元非线性回归。这里直说多元线性回归。对比一元线性回归:1.1多元回归模型:1.2多元回归方程1.3估计的...
  • SPSS进行多元线性回归

    千次阅读 2022-06-01 14:32:21
    多元线性回归研究的是因变量为连续变量,与多个自变量的相关关系的研究。由多个自变量的最优组合共同来预测或估计因变量,比只用一个自变量进行预测或估计更有效,更符合实际。因此多元线性回归比一元线性回归的实用...
  • 文章目录一、综述二、常见的回归分析三、对于相关性的理解四、一元线性回归模型五、对于回归系数的解释六、内生性七、四类线性模型回归系数的解释对于定性变量的处理——虚拟变量XXX八、下面来看一个实例九、扰动项...
  • 那么此时需要建立多个变量的多元线性回归方程。下面以植被覆盖度的案例来进行分析。 案例:年尺度的综合因素对植被覆盖度的影响分析 注: 因变量为植被覆盖度 自变量为温度、降水量和积温 工具:excel (1) 将数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,507
精华内容 3,402
热门标签
关键字:

多元线性回归分析步骤

友情链接: MATLAB.zip