线性回归 订阅
线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w'x+e,e为误差服从均值为0的正态分布。 [1]  回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。 展开全文
线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w'x+e,e为误差服从均值为0的正态分布。 [1]  回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。
信息
相关术语
回归系数
类    别
分析方法
应用学科
数学
中文名
线性回归
外文名
linear regression
适用范围
数理统计
线性回归基本含义
在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。(这反过来又应当由多个相关的因变量预测的多元线性回归区别,而不是一个单一的标量变量。)在线性回归中,数据使用线性预测函数来建模,并且未知的模型参数也是通过数据来估计。这些模型被叫做线性模型。最常用的线性回归建模是给定X值的y的条件均值是X的仿射函数。不太一般的情况,线性回归模型可以是一个中位数或一些其他的给定X的条件下y的条件分布的分位数作为X的线性函数表示。像所有形式的回归分析一样,线性回归也把焦点放在给定X值的y的条件概率分布,而不是X和y的联合概率分布(多元分析领域)。线性回归是回归分析中第一种经过严格研究并在实际应用中广泛使用的类型。这是因为线性依赖于其未知参数的模型比非线性依赖于其位置参数的模型更容易拟合,而且产生的估计的统计特性也更容易确定。线性回归模型经常用最小二乘逼近来拟合,但他们也可能用别的方法来拟合,比如用最小化“拟合缺陷”在一些其他规范里(比如最小绝对误差回归),或者在桥回归中最小化最小二乘损失函数的惩罚.相反,最小二乘逼近可以用来拟合那些非线性的模型.因此,尽管“最小二乘法”和“线性模型”是紧密相连的,但他们是不能划等号的。
收起全文
精华内容
参与话题
问答
  • 单变量线性回归 绘制散点图 相关系数R 拆分训练集和测试集 多变量线性回归 数据检验(判断是否可以做线性回归) 训练线性回归模型 先甩几个典型的线性回归的模型,帮助大家捡起那些年被忘记的数学。 ● 单...

    目录

    数据导入

    单变量线性回归

    绘制散点图

    相关系数R

    拆分训练集和测试集

    多变量线性回归

    数据检验(判断是否可以做线性回归)

    训练线性回归模型


    先甩几个典型的线性回归的模型,帮助大家捡起那些年被忘记的数学。

    单变量线性回归: h(x)=theta0 + theta1* x 1
    多变量线性回归: h(x)=theta0 + theta1* x 1 + theta2* x 2 + theta3* x 3
    多项式回归:        h(x)=theta0 + theta1* x 1 + theta2* (x2^2) + theta3* (x3^3) 

    多项式回归始终还是线性回归,你可以令x2=x2^2,x3=x3^3,简单的数据处理一下就好了,这样上述多项式回归的模型就变成多变量线性回归的模型了。

    数据导入

    下面我们要开始用数据说话了,先来看看数据源是什么样子吧。

    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
    
    #读取文件
    datafile = u'E:\\pythondata\\dhdhdh.xlsx'#文件所在位置,u为防止路径中有中文名称,此处没有,可以省略
    data = pd.read_excel(datafile)#datafile是excel文件,所以用read_excel,如果是csv文件则用read_csv
    examDf = DataFrame(data)
    examDf.head()

    运行结果:

         Call   Connect    Return
    0  2.1335  1.267760  1.176615
    1  2.5534  1.352941  1.978967
    2  3.3361  1.872093  2.249511
    3  3.3861  1.826667  2.986597
    4  3.9682  1.875000  2.798570

     


    单变量线性回归

     

    绘制散点图

    先将上述数据中的Connect(接通量)和Return(回款量)做一个单变量的线性回归,先绘制一个散点图,大致看一下分布情况。

    #绘制散点图,examDf.jt为X轴,examDf.hk为Y轴
    plt.scatter(examDf.Connect,examDf.Return,color = 'darkgreen',label = "Exam Data")
     
    #添加图的标签(x轴,y轴)
    plt.xlabel("The Connection amount of the average account")#设置X轴标签
    plt.ylabel("The ratio of average return amount")#设置Y轴标签
    plt.show()#显示图像

    运行结果:  

    看来商业中的实际数据总是和课本上的完美数据不一样,看这零零散散的分布,线性关系很是勉强,但是大致还是有一个线性相关的样子的,那么就看看相关系数有多少吧。

    相关系数R

    rDf = examDf.corr()#查看数据间的相关系数
    print(rDf)

    运行结果: 

                 Call   Connect    Return
    Call     1.000000  0.445870  0.441673
    Connect  0.445870  1.000000  0.745338
    Return   0.441673  0.745338  1.000000

    Connect(接通量)和Return(回款量)的相关系数为0.745338,还不错。

    相关系数是用以反映变量之间相关关系密切程度的统计指标,对于相关性强度来说,我们一般认为:

    0~0.3 弱相关

    0.3~0.6  中等程度相关

    0.6~1  强相关

    在数学中,相关系数的计算一般是这样的,给数学狂人看:

    R(相关系数) = X和Y的协方差 / (X的标准差 * Y的标准差) == cov(X,Y)/ σX * σY (即person系数)

    拆分训练集和测试集

    Connect(接通量)和Return(回款量)属于强相关,可以进行线性回归训练,那么我们先来拆分训练集和测试集吧。

    #拆分训练集和测试集(train_test_split是存在与sklearn中的函数)
    X_train,X_test,Y_train,Y_test = train_test_split(examDf.Connect,examDf.Return,train_size=0.8)
    #train为训练数据,test为测试数据,examDf为源数据,train_size 规定了训练数据的占比
     
    print("自变量---源数据:",examDf.Connect.shape, ";  训练集:",X_train.shape, ";  测试集:",X_test.shape)
    print("因变量---源数据:",examDf.Return.shape, ";  训练集:",Y_train.shape, ";  测试集:",Y_test.shape)
     
    #散点图
    plt.scatter(X_train, Y_train, color="darkgreen", label="train data")#训练集为深绿色点
    plt.scatter(X_test, Y_test, color="red", label="test data")#测试集为红色点
     
    #添加标签
    plt.legend(loc=2)#图标位于左上角,即第2象限,类似的,1为右上角,3为左下角,4为右下角
    plt.xlabel("The Connection amount of the average account")#添加 X 轴名称
    plt.ylabel("The ratio of average return amount")#添加 Y 轴名称
    plt.show()#显示散点图

    运行结果:  

    自变量---源数据: (14,) ;  训练集: (11,) ;  测试集: (3,)
    因变量---源数据: (14,) ;  训练集: (11,) ;  测试集: (3,)
    

    回归模型训练

    #调用线性规划包
    model = LinearRegression()
    
    #线性回归训练
    model.fit(X_train,Y_train)#调用线性回归包
    
    a  = model.intercept_#截距
    b = model.coef_#回归系数
    
    #训练数据的预测值
    y_train_pred = model.predict(X_train)
    #绘制最佳拟合线:标签用的是训练数据的预测值y_train_pred
    plt.plot(X_train, y_train_pred, color='blue', linewidth=2, label="best line")
    
    #测试数据散点图
    plt.scatter(X_train, Y_train, color='darkgreen', label="train data")
    plt.scatter(X_test, Y_test, color='red', label="test data")
     
    #添加图标标签
    plt.legend(loc=2)#图标位于左上角,即第2象限,类似的,1为右上角,3为左下角,4为右下角
    plt.xlabel("The Connection amount of the average account")#添加 X 轴名称
    plt.ylabel("The ratio of average return amount")#添加 Y 轴名称
    plt.show()#显示图像
    
    print("拟合参数:截距",a,",回归系数:",b)
    print("最佳拟合线: Y = ",round(a,2),"+",round(b[0],2),"* X")#显示线性方程,并限制参数的小数位为两位
    

    运行结果:  

    拟合参数:截距 -0.7291766860887745 ,回归系数: [1.71584366]
    最佳拟合线: Y =  -0.73 + 1.72 * X

    补充一句,有博友说单变量线性回归上面的这段代码中,加一个reshape就能运行出来了,可能是版本不同,我没加也能运行出来,所以分享在下面给大家参考一下,如果有和博友一样的情况,可以试试增加下面一段代码(谢谢博友 dsy23 的分享):

    
    #调用线性规划包
    model = LinearRegression()
    
    
    #在这里加一段
    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_#回归系数


    多变量线性回归

    在单变量线性回归中,我们将每一步都讲解的极其详细,所以在多变量线性回归中,我们不会重复讲那些简单的部分了,但是为了防止python小白迷失自己,所以在这部分该有的代码还是会甩出来,该有的备注也都有,只不过不会一点一点分步骤来了。

    上面我们提到多变量线性回归的模型为h(x)=theta0 + theta1* x 1 + theta2* x 2 + theta3* x 3,下面,我们还是使用单变量线性回归中的数据,单变量线性回归中,我们只用到了Connect(接通量)和Return(回款量),既然是多变量回归模型,那么我们就多加一个变量Call(拨打量)。

     

    数据检验(判断是否可以做线性回归)

    #-*- coding:utf-8 -*- 
    
    import pandas as pd
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    from pandas import DataFrame,Series
    from sklearn.cross_validation import train_test_split
    from sklearn.linear_model import LinearRegression
    
    #读取文件
    datafile = u'E:\\pythondata\\dhdhdh.xlsx'#文件所在位置,u为防止路径中有中文名称,此处没有,可以省略
    data = pd.read_excel(datafile)#datafile是excel文件,所以用read_excel,如果是csv文件则用read_csv
    examDf = DataFrame(data)
    
    #数据清洗,比如第一列有可能是日期,这样的话我们就只需要从第二列开始的数据,
    #这个情况下,把下面中括号中的0改为1就好,要哪些列取哪些列
    new_examDf = examDf.ix[:,0:]
    
    #检验数据
    print(new_examDf.describe())#数据描述,会显示最值,平均数等信息,可以简单判断数据中是否有异常值
    print(new_examDf[new_examDf.isnull()==True].count())#检验缺失值,若输出为0,说明该列没有缺失值
    
    #输出相关系数,判断是否值得做线性回归模型
    print(new_examDf.corr())#0-0.3弱相关;0.3-0.6中相关;0.6-1强相关;
    
    #通过seaborn添加一条最佳拟合直线和95%的置信带,直观判断相关关系
    sns.pairplot(data, x_vars=['Call','Connect'], y_vars='Return', size=7, aspect=0.8, kind='reg')  
    plt.show()
    

    运行结果:

                Call    Connect     Return
    count  99.000000  99.000000  99.000000
    mean    3.153649   1.967779   2.591121
    std     1.027607   0.470364   0.790172
    min     1.280100   1.014208   0.941292
    25%     2.373528   1.596610   2.044147
    50%     3.040000   1.913472   2.476091
    75%     3.835980   2.253994   3.035603
    max     5.851181   3.234977   5.160840
    Call       0
    Connect    0
    Return     0
    dtype: int64
                 Call   Connect    Return
    Call     1.000000  0.837052  0.744792
    Connect  0.837052  1.000000  0.844640
    Return   0.744792  0.844640  1.000000
    

    判断是否可以做线性回归

    • 异常值:通过最值或者平均数或者中位数等判断,或者直接通过查看是否有游离在大部队之外的点来判断是否有异常值;
    • 空值:这个没办法,你必须看运行结果的10-12行是否等于0,是0则无空值,如果不是0,就要看看是删掉空值呢?还是用其他值代替呢?不同情况不同对待;
    • 相关性:要么通过相关系数的大小判断,要么看散点图中的最佳拟合直线和95%的置信带,直观判断相关关系;

     

    训练线性回归模型

    #拆分训练集和测试集
    X_train,X_test,Y_train,Y_test = train_test_split(new_examDf.ix[:,:2],new_examDf.Return,train_size=0.8)
    #new_examDf.ix[:,:2]取了数据中的前两列为自变量,此处与单变量的不同
     
    print("自变量---源数据:",new_examDf.ix[:,:2].shape, ";  训练集:",X_train.shape, ";  测试集:",X_test.shape)
    print("因变量---源数据:",examDf.Return.shape, ";  训练集:",Y_train.shape, ";  测试集:",Y_test.shape)
    
    #调用线性规划包
    model = LinearRegression()
    
    model.fit(X_train,Y_train)#线性回归训练
    
    a  = model.intercept_#截距
    b = model.coef_#回归系数
    print("拟合参数:截距",a,",回归系数:",b)
    
    #显示线性方程,并限制参数的小数位为两位
    print("最佳拟合线: Y = ",round(a,2),"+",round(b[0],2),"* X1 + ",round(b[1],2),"* X2")
    
    Y_pred = model.predict(X_test)#对测试集数据,用predict函数预测
    
    plt.plot(range(len(Y_pred)),Y_pred,'red', linewidth=2.5,label="predict data")
    plt.plot(range(len(Y_test)),Y_test,'green',label="test data")
    plt.legend(loc=2)
    plt.show()#显示预测值与测试值曲线
    

    运行结果:

    自变量---源数据: (99, 2) ;  训练集: (79, 2) ;  测试集: (20, 2)
    因变量---源数据: (99,) ;  训练集: (79,) ;  测试集: (20,)
    拟合参数:截距 -0.006540954521370601 ,回归系数: [0.08624344 1.19029593]
    最佳拟合线: Y =  -0.01 + 0.09 * X1 +  1.19 * X2

    效果勉强满意,毕竟才用了80个数训练的模型,要求高的话多用一些数据就好。

    除了用 Python 做线性回归,我们还可以使用 SPSS 来做,不用编程,不用各种调参,就是点几下就可以输出结果,更简便!具体操作请参考下面链接里的文章:

    数据建模 - SPSS做多元线性回归 - 分析步骤、输出结果详解、与Python的结果对比 -(SPSS)

     

    【此处是重点】打赏一下发数据!

    https://download.csdn.net/download/weixin_40683253/11890448

     

     

    展开全文
  • 线性回归

    千次阅读 2018-07-11 01:08:40
    这篇博客为大家介绍线性回归模型,也是本人写的第一篇回归模型的博客。之前介绍的模型预测结果都是离散值,也就是机器学习当中的分类问题,那么机器学习中还有一大类预测问题,其预测结果为连续值,我们称之为回归...

    这篇博客为大家简单介绍线性回归模型,也是写的第一篇回归模型的博客。

    之前介绍的模型预测结果都是离散值,也就是机器学习当中的分类问题,那么机器学习中还有一大类预测问题,其预测结果为连续值,我们称之为回归问题。

    线性回归属于机器学习中最基础的回归模型,因此,首先介绍线性回归模型。

    虽然线性回归模型是最基础的模型,但是其重要性也是不容小觑的。在很多实际项目应用当中,其效果还是不错的。

    首先我们用一个案例来引出线性回归:

    假设我们要预测某个房子的价格,那么我们如何去预测得知房屋的价格呢?通常情况下我们会综合考虑各个因素之后再给出这个房子的估价。这些因素有可能是房屋面积,卧室数目,房屋所处楼层,是否为学区房等等。当我们掌握了这些信息之后我们便能够基本预测得知这个房子的大概的价格。然而这只是凭借我们的经验来进行预测得知的价格,实际上我们并不知道这些因素同房价之间的真正的关系。线性回归要解决的问题就是找到这些因素同房价之间的真实关系,在已知其关系的情况下,我们就能根据已知的这些因素去预测得到房屋的价格。上文中所说的因素也就是机器学习中的样本的特征。如下表所示:

    房屋面积卧室数目所处楼层是否学区房房屋价格
    1233211000000
    90260600000

    表中每一行为一个房屋的特征信息以及价格信息,我们称之为一个样本,其中代表房屋的各个特征。假设房屋价格与各个特征之间的关系为,设,那么,这便是线性回归的基本模型,注意,线性回归并不是指关于特征是线性的,而是说关于权重向量是线性的,我们的任务就是要寻找最优的权重向量,从而确定特征和标记之间的关系。

    确定后,则线性回归模型也就确定,,其中为样本的预测值。

    接下来我们就来探索如何求得最好的

    假设存在样本集,其中为第i个样本的特征向量,为样本的真实标记。

    现在我们已知存在一组初始的权重向量,构造出了一个初始线性模型,但是这个模型的预测效果并不是很好,因此我们需要对其进行优化。

    在当前模型下,给定样本特征向量,我们可以得到其预测值。因此,我们也可以得到其预测误差

    在这里我们假设,则的概率密度函数,将带入得

    由于上式与的概率密度一致,因此我们可以重新解释上式为。由此便可以的出似然函数,可以看出似然函数中的变量只有,我们只需要找出使得似然函数最大的权重向量即可,即

    由于似然函数中为常数,所以我们将其省略,之后再对其取对数求取对数似然函数得到,省略可以得到。我们只需使得对数似然函数最大即可,因此

    由此我们便退出了线性回归的损失函数,因此,最后只需要对损失函数进行优化即可。

    在这里我们依旧采用梯度下降法:

    因为,所以,接下来只需按照式子更新即可。

    接下来附上本人使用python编写的linear regression的程序:

    import numpy as np
    from numpy import random as rd
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import mean_squared_error
    rd.seed(2)
    np.set_printoptions(linewidth=1000, suppress=True)
    
    
    def generate_samples(count):
        """
    
        :param count: 样本的个数
        :return:
        """
        x = rd.uniform(-10, 10, count)
        y = 3.5 * x + 4 + rd.uniform(-5, 5, count)
        x_return = np.ones((count, 1))
        x_return = np.concatenate([x_return, x.reshape(-1, 1)], axis=1)
        return x_return, y
    
    
    class LinearRegression(object):
    
        def __init__(self, count, alpha, lamda, beta, iter_times):
            """
    
            :param lamda: 正则项系数
            :param count: 生成样本个数,样本容量
            :param alpha: 学习率
            :param beta: 学习率衰减系数
            :param iter_times: 多少个epoch
            """
            self.iter_times = iter_times
            self.beta = beta
            self.lamda = lamda
            self.alpha = alpha
            self.x, self.y = generate_samples(count)
            self.x_train, self.x_test, self.y_train, self.y_test = train_test_split(self.x, self.y, test_size=0.3, random_state=1)
            self.weight = rd.uniform(-10, 10, 2)
            self.batch_size = int(0.2 * self.x_train.shape[0])
            self.epoch = int(np.ceil(self.x_train.shape[0] / self.batch_size))
            # self.test_mses以及self.train_mses用于存放每一个epoch训练集和测试集的均方误差
            self.test_mses = []
            self.train_mses = []
    
        def train(self):
            for j in range(self.iter_times):
                # 第一层循环控制多少个epoch
                for i in range(self.epoch):
                    # 第二层循环完成一次就是一个epoch,每次遍历出一个batch
                    if i != (self.epoch - 1):
                        self.x_epoch = self.x_train[i * self.batch_size:(i + 1) * self.batch_size, :]
                        self.y_epoch = self.y_train[i * self.batch_size:(i + 1) * self.batch_size]
                    else:
                        self.x_epoch = self.x_train[i * self.batch_size:, :]
                        self.y_epoch = self.y_train[i * self.batch_size:]
                    self.weight -= self.alpha * (-np.sum((self.y_epoch.reshape(-1, 1) - np.dot(self.x_epoch, self.weight.reshape(-1, 1))) * self.x_epoch, axis=0) + 2 * self.lamda * self.weight)
                    # print(self.weight)
                self.alpha *= self.beta
                try:
                    mse_train = mean_squared_error(self.y_train, np.dot(self.x_train, self.weight.reshape(-1, 1)).ravel())
                    mse_test = mean_squared_error(self.y_test, np.dot(self.x_test, self.weight.reshape(-1, 1)).ravel())
                    self.train_mses.append(mse_train)
                    self.test_mses.append(mse_test)
                except ValueError as e:
                    raise Exception("学习率设置过大")
                if (j + 1) % int(0.1 * self.iter_times) == 0:
                    print("================epoch: %d================" % (j + 1))
                    print("第%d个epoch训练集均方误差:" % (j + 1), mse_train)
                    print("第%d个epoch测试集均方误差:" % (j + 1), mse_test)
    
        def draw_mses(self):
            fig = plt.figure()
            ax = plt.subplot(2, 1, 1)
            ax2 = plt.subplot(2, 1, 2)
            plt.sca(ax)
            ax.plot(np.arange(1, 1 + self.iter_times), self.train_mses, label="train dataset mse", color="g")
            ax.plot(np.arange(1, 1 + self.iter_times), self.test_mses, label="test dataset mse", color="y")
            ax.set_xlabel("epoch")
            ax.set_ylabel("mse")
            ax.set_title("mse")
            ax.legend(loc="upper right")
            plt.sca(ax2)
            ax2.scatter(self.x[:, 1], self.y, label="samples", marker="*", color="r")
            x = np.linspace(-10, 10, 1000).reshape(-1, 1)
            x = np.concatenate([np.ones((1000, 1)), x], axis=1)
            ax2.plot(x[:, 1].ravel(), np.dot(x, self.weight.reshape(-1, 1)).ravel(), color="b", label="fitness curve")
            ax2.set_xlabel("x")
            ax2.set_ylabel("y")
            ax2.set_title("fitness curve")
            ax2.legend(loc="upper left")
            plt.subplots_adjust(wspace=10, hspace=0.5)
            plt.show()
    
    
    def main():
        linear = LinearRegression(100, 0.001, 0.8, 0.99, 200)
        linear.train()
        linear.draw_mses()
    
    
    if __name__ == "__main__":
        main()

    展开全文
  • 线性回归详解

    万次阅读 多人点赞 2017-08-28 16:09:39
    说句废话哈,相信大多数人和我一样,最开始学习机器学习遇到的第一个模型便是线性回归,而且是一元线性回归,但就这个模型,其实包含了很多的知识点,矩阵计算,最小二乘、梯度下降等知识点,在这篇文章中,对回归...

    说句废话哈,相信大多数人和我一样,最开始学习机器学习遇到的第一个模型便是线性回归,而且是一元线性回归,但就这个模型,其实包含了很多的知识点,矩阵计算,最小二乘、梯度下降等知识点,在这篇文章中,对回归模型在此进行阐述,在学习了之前的分类算法基础上,来看回归模型,也许另有体验。好了不废话了,进入正题。

     

    1 摘要

          本报告是在学习斯坦福大学机器学习课程前四节加上配套的讲义后的总结与认识。前四节主要讲述了回归问题,回归属于有监督学习中的一种方法。该方法的核心思想是从连续型统计数据中得到数学模型,然后将该数学模型用于预测或者分类。该方法处理的数据可以是多维的。

         讲义最初介绍了一个基本问题,然后引出了线性回归的解决方法,然后针对误差问题做了概率解释。之后介绍了logistic回归。最后上升到理论层次,提出了一般回归。

    2 问题引入

         这个例子来自http://www.cnblogs.com/LeftNotEasy/archive/2010/12/05/mathmatic_in_machine_learning_1_regression_and_gradient_descent.html

         假设有一个房屋销售的数据如下:

    面积(m^2)

    销售价钱(万元)

    123

    250

    150

    320

    87

    160

    102

    220

         这个表类似于北京5环左右的房屋价钱,我们可以做出一个图,x轴是房屋的面积。y轴是房屋的售价,如下:

         clip_image001

         如果来了一个新的面积,假设在销售价钱的记录中没有的,我们怎么办呢?

         我们可以用一条曲线去尽量准的拟合这些数据,然后如果有新的输入过来,我们可以在将曲线上这个点对应的值返回。如果用一条直线去拟合,可能是下面的样子:

         clip_image002

         绿色的点就是我们想要预测的点。

         首先给出一些概念和常用的符号。

         房屋销售记录表:训练集(training set)或者训练数据(training data), 是我们流程中的输入数据,一般称为x

         房屋销售价钱:输出数据,一般称为y

         拟合的函数(或者称为假设或者模型):一般写做 y = h(x)

         训练数据的条目数(#training set),:一条训练数据是由一对输入数据和输出数据组成的输入数据的维度n (特征的个数,#features)

         这个例子的特征是两维的,结果是一维的。然而回归方法能够解决特征多维,结果是一维多离散值或一维连续值的问题。

    3 学习过程

         下面是一个典型的机器学习的过程,首先给出一个输入数据,我们的算法会通过一系列的过程得到一个估计的函数,这个函数有能力对没有见过的新数据给出一个新的估计,也被称为构建一个模型。就如同上面的线性回归函数。

         clip_image003

    4 线性回归

         线性回归假设特征和结果满足线性关系。其实线性关系的表达能力非常强大,每个特征对结果的影响强弱可以由前面的参数体现,而且每个特征变量可以首先映射到一个函数,然后再参与线性计算。这样就可以表达特征与结果之间的非线性关系。

         我们用X1,X2..Xn 去描述feature里面的分量,比如x1=房间的面积,x2=房间的朝向,等等,我们可以做出一个估计函数:

         clip_image004

         θ在这儿称为参数,在这的意思是调整feature中每个分量的影响力,就是到底是房屋的面积更重要还是房屋的地段更重要。为了如果我们令X0 = 1,就可以用向量的方式来表示了:

         clip_image005

         我们程序也需要一个机制去评估我们θ是否比较好,所以说需要对我们做出的h函数进行评估,一般这个函数称为损失函数(loss function)或者错误函数(error function),描述h函数不好的程度,在下面,我们称这个函数为J函数

         在这儿我们可以认为错误函数如下:

         clip_image006

         这个错误估计函数是去对x(i)的估计值与真实值y(i)差的平方和作为错误估计函数,前面乘上的1/2是为了在求导的时候,这个系数就不见了。

         至于为何选择平方和作为错误估计函数,讲义后面从概率分布的角度讲解了该公式的来源。

         如何调整θ以使得J(θ)取得最小值有很多方法,其中有最小二乘法(min square),是一种完全是数学描述的方法,和梯度下降法。

    5 梯度下降法

         在选定线性回归模型后,只需要确定参数θ,就可以将模型用来预测。然而θ需要在J(θ)最小的情况下才能确定。因此问题归结为求极小值问题,使用梯度下降法。梯度下降法最大的问题是求得有可能是全局极小值,这与初始点的选取有关。

         梯度下降法是按下面的流程进行的:

         1)首先对θ赋值,这个值可以是随机的,也可以让θ是一个全零的向量。

         2)改变θ的值,使得J(θ)按梯度下降的方向进行减少。

         梯度方向由J(θ)对θ的偏导数确定,由于求的是极小值,因此梯度方向是偏导数的反方向。结果为

         clip_image007     

         迭代更新的方式有两种,一种是批梯度下降,也就是对全部的训练数据求得误差后再对θ进行更新,另外一种是增量梯度下降,每扫描一步都要对θ进行更新。前一种方法能够不断收敛,后一种方法结果可能不断在收敛处徘徊。

         一般来说,梯度下降法收敛速度还是比较慢的。

         另一种直接计算结果的方法是最小二乘法。

    6 最小二乘法

         将训练特征表示为X矩阵,结果表示成y向量,仍然是线性回归模型,误差函数不变。那么θ可以直接由下面公式得出

    clip_image008

         但此方法要求X是列满秩的,而且求矩阵的逆比较慢。

    7 选用误差函数为平方和的概率解释

         假设根据特征的预测结果与实际结果有误差clip_image010,那么预测结果clip_image012和真实结果clip_image014满足下式:

    clip_image015

         一般来讲,误差满足平均值为0的高斯分布,也就是正态分布。那么x和y的条件概率也就是

    clip_image016

         这样就估计了一条样本的结果概率,然而我们期待的是模型能够在全部样本上预测最准,也就是概率积最大。注意这里的概率积是概率密度函数积,连续函数的概率密度函数与离散值的概率函数不同。这个概率积成为最大似然估计。我们希望在最大似然估计得到最大值时确定θ。那么需要对最大似然估计公式求导,求导结果既是

         clip_image017     

         这就解释了为何误差函数要使用平方和。

         当然推导过程中也做了一些假定,但这个假定符合客观规律。

    8 带权重的线性回归

         上面提到的线性回归的误差函数里系统都是1,没有权重。带权重的线性回归加入了权重信息。

         基本假设是

         clip_image018     

         其中假设clip_image020符合公式

         clip_image021          

         其中x是要预测的特征,这样假设的道理是离x越近的样本权重越大,越远的影响越小。这个公式与高斯分布类似,但不一样,因为clip_image023不是随机变量。

         此方法成为非参数学习算法,因为误差函数随着预测值的不同而不同,这样θ无法事先确定,预测一次需要临时计算,感觉类似KNN。

    9 分类和logistic回归

         一般来说,回归不用在分类问题上,因为回归是连续型模型,而且受噪声影响比较大。如果非要应用进入,可以使用logistic回归。

         logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射,即先把特征线性求和,然后使用函数g(z)将最为假设函数来预测。g(z)可以将连续值映射到0和1上。

         logistic回归的假设函数如下,线性回归假设函数只是clip_image025

    clip_image026

         logistic回归用来分类0/1问题,也就是预测结果属于0或者1的二值分类问题。这里假设了二值满足伯努利分布,也就是

    clip_image027

         当然假设它满足泊松分布、指数分布等等也可以,只是比较复杂,后面会提到线性回归的一般形式。

         与第7节一样,仍然求的是最大似然估计,然后求导,得到迭代公式结果为

         clip_image028

         可以看到与线性回归类似,只是clip_image012[1]换成了clip_image030,而clip_image030[1]实际上就是clip_image012[2]经过g(z)映射过来的。


    这里主要看看数学推导:

       线性回归:

               1: 函数模型(Model):

                     

               假设有训练数据

                    

              那么为了方便我们写成矩阵的形式

                    

             2: 损失函数(cost):

                     现在我们需要根据给定的X求解W的值,这里采用最小二乘法。   

         a.最小二乘法:

          何为最小二乘法,其实很简单。我们有很多的给定点,这时候我们需要找出一条线去拟合它,那么我先假设这个线的方程,然后把数据点代入假设的方程得到观测值,求使得实际值与观测值相减的平方和最小的参数。对变量求偏导联立便可求。

                  因此损失代价函数为:

                

            3: 算法(algorithm):

                 现在我们的目的就是求解出一个使得代价函数最小的W:

                a.矩阵满秩可求解时(求导等于0):

                            

              b.矩阵不满秩时(梯度下降):

          梯度下降算法是一种求局部最优解的方法,对于F(x),在a点的梯度是F(x)增长最快的方向,那么它的相反方向则是该点下降最快的方向,具体参考wikipedia

         原理:将函数比作一座山,我们站在某个山坡上,往四周看,从哪个方向向下走一小步,能够下降的最快;

         注意:当变量之间大小相差很大时,应该先将他们做处理,使得他们的值在同一个范围,这样比较准确。

        1)首先对θ赋值,这个值可以是随机的,也可以让θ是一个全零的向量。

        2)改变θ的值,使得J(θ)按梯度下降的方向进行减少。

        描述一下梯度减少的过程,对于我们的函数J(θ)求偏导J: 

        Repeat  until convergence:{

         image

        下面是更新的过程,也就是θi会向着梯度最小的方向进行减少。θi表示更新之前的值,-后面的部分表示按梯度方向减少的量,α表示步长,也就是每次按照梯度减少的方向变化多少。

         image 

        }

         假设有数据集D时:

        

           对损失函数求偏导如下:

           

         使用矩阵表示(方便计算)

       


         

       

    展开全文
  • 通俗理解线性回归(一)

    万次阅读 多人点赞 2018-08-29 22:04:03
    假设线性回归是个黑盒子,那按照程序员的思维来说,这个黑盒子就是个函数,然后呢,我们只要往这个函数传一些参数作为输入,就能得到一个结果作为输出。那回归是什么意思呢?其实说白了,就是这个黑盒子输出的结果是...

    0 什么是回归?

    假设线性回归是个黑盒子,那按照程序员的思维来说,这个黑盒子就是个函数,然后呢,我们只要往这个函数传一些参数作为输入,就能得到一个结果作为输出。那回归是什么意思呢?其实说白了,就是这个黑盒子输出的结果是个连续的值。如果输出不是个连续值而是个离散值那就叫分类。那什么叫做连续值呢?非常简单,举个栗子:比如我告诉你我这里有间房子,这间房子有40平,在地铁口,然后你来猜一猜我的房子总共值多少钱?这就是连续值,因为房子可能值80万,也可能值80.2万,也可能值80.111万。再比如,我告诉你我有间房子,120平,在地铁口,总共值180万,然后你来猜猜我这间房子会有几个卧室?那这就是离散值了。因为卧室的个数只可能是1, 2, 3,4,充其量到5个封顶了,而且卧室个数也不可能是什么1.1, 2.9个。所以呢,对于ML萌新来说,你只要知道我要完成的任务是预测一个连续值的话,那这个任务就是回归。是离散值的话就是分类。(PS:目前只讨论监督学习)

    1 线性回归

    OK,现在既然已经知道什么是回归,那现在就要来聊一聊啥叫线性。其实这玩意也很简单,我们在上初中的时候都学过直线方程对不对?来来来,我们来回忆一下直线方程是啥?

    y=kx+b

    喏,这就是初中数学老师教我们的直线方程。那上过初中的同学都知道,这个式子表达的是,当我知道k(参数)和b(参数)的情况下,我随便给一个x我都能通过这个方程算出y来。而且呢,这个式子是线性的,为什么呢?因为从直觉上来说,你都知道,这个式子的函数图像是条直线。。。。从理论上来说,这式子满足线性系统的性质。(至于线性系统是啥,我就不扯了,不然没完没了)那有的同学可能会觉得疑惑,这一节要说的是线性回归,我扯这个low逼直线方程干啥?其实,说白了,线性回归无非就是在N维空间中找一个形式像直线方程一样的函数来拟合数据而已。比如说,我现在有这么一张图,横坐标代表房子的面积,纵坐标代表房价。
    这里写图片描述
    然后呢,线性回归就是要找一条直线,并且让这条直线尽可能地拟合图中的数据点。
    那如果让1000个老铁来找这条直线就可能找出1000种直线来,比如这样
    这里写图片描述
    这样
    这里写图片描述
    或者这样
    这里写图片描述
    喏,其实找直线的过程就是在做线性回归,只不过这个叫法更有逼格而已。。。

    2 损失函数

    那既然是找直线,那肯定是要有一个评判的标准,来评判哪条直线才是最好的。OK,道理我们都懂,那咋评判呢?其实简单的雅痞。。。只要算一下实际房价和我找出的直线根据房子大小预测出来的房价之间的差距就行了。说白了就是算两点的距离。当我们把所有实际房价和预测出来的房价的差距(距离)算出来然后做个加和,我们就能量化出现在我们预测的房价和实际房价之间的误差。例如下图中我画了很多条小数线,每一条小数线就是实际房价和预测房价的差距(距离)
    这里写图片描述
    然后把每条小竖线的长度加起来就等于我们现在通过这条直线预测出的房价与实际房价之间的差距。那每条小竖线的长度的加和怎么算?其实就是欧式距离加和,公式如下。(其中y(i)表示的是实际房价,y^(i)表示的是预测房价)
    这里写图片描述
    这个欧氏距离加和其实就是用来量化预测结果和真实结果的误差的一个函数。在ML中称它为损失函数(说白了就是计算误差的函数)。那有了这个函数,我们就相当于有了一个评判标准,当这个函数的值越小,就越说明我们找到的这条直线越能拟合我们的房价数据。所以说啊,线性回归无非就是通过这个损失函数做为评判标准来找出一条直线。

    刚刚我举的例子是一维的例子(特征只有房子大小),那现在我们假设我的数据中还有一个特征是楼间距,那图像可能就是酱紫了。
    这里写图片描述
    从图我们可以看得出来,就算是在二维空间中,还是找一条直线来拟合我们的数据。所以啊,换汤不换药,损失函数还是这个欧式距离加和。
    这里写图片描述


    先写到这里,因为如果篇幅太长,对于萌新来说不太友好,而且后面想用人话来聊聊线性回归的正规方程解,所以先蓄个力。

    展开全文
  • 线性回归原理和实现基本认识

    万次阅读 多人点赞 2017-04-28 17:04:57
     线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商品的大小,y代表为销售量;当月份x =5时,我们就能根据线性...
  • 线性回归分析

    2018-04-23 17:41:43
    然后,我们介绍多元线性回归问题(multiple linear regression),线性约束由多个解释变量构成。紧接着,我们介绍多项式回归分析(polynomial regression问题),一种具有非线性关系的多元线性回归问题。最后,我们...
  • 一:为什么要预处理数据?(1)现实世界的数据是肮脏的(不完整,含噪声,不一致)(2)没有高质量的数据,就没有高质量的挖掘结果(高质量的决策必须依赖于高质量的数据;数据仓库需要对高质量的数据进行一致地...
  • 线性回归 & Softmax与分类模型 & 多层感知机中提到,建模的pipeline包括8个步骤,从大方向来看,可以归为2类,第1步(准备数据集)归为一类,called“数据准备”;2-8步归为一类,called“模型”。对于...
  • [笔记]
  • 线性回归 模型 price=warea⋅area+wage⋅age+b 数据集 我们通常收集一系列的真实数据,例如多栋房屋的真实售出价格和它们对应的面积和房龄。我们希望在这个数据上面寻找模型参数来使模型的预测价格与真实价格的误差...
  • 欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld。开一个机器学习方法科普系列:做基础回顾之用,学而时习之;也拿出来与大家分享。数学水平有限,只求易懂,学习与工作够用。...
  • SPSS多元线性回归输出结果的详细解释

    万次阅读 多人点赞 2017-06-27 17:41:05
    最近做了一些用SPSS进行线性回归的实验,还是感觉很多细节把握不好,这里结合我的实验结果,以及网上别人的介绍总结一下,先贴几张SPSS的输出: 下面简单解释一下这三张图中的结果: 第一个表模型汇总表中,...
  • 多元线性回归推导过程

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

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

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

    万次阅读 多人点赞 2015-10-25 15:45:11
    接着上一次的一元线性回归...1、什么是多元线性回归模型? 当y值的影响因素不唯一时,采用多元线性回归模型。 y =y=β0+β1x1+β2x2+...+βnxn 例如商品的销售额可能不电视广告投入,收音机广告
  • 现在用 Python 写线性回归的博客都快烂大街了,为什么还要用 SPSS 做线性回归呢?这就来说说 SPSS 存在的原因吧。 SPSS 是一个很强大的软件,不用编程,不用调参,点巴两下就出结果了,而且出来的大多是你想要的。...
  • 多元线性回归分析理论详解及SPSS结果分析

    万次阅读 多人点赞 2017-05-17 16:23:23
    当影响因变量的因素是多个时候,这种一个变量同时与多个变量的回归问题就是多元回归,分为:多元线性回归和多元非线性回归。这里直说多元线性回归。对比一元线性回归: 1.1多元回归模型: y=β0+β1x1+β2x2+…+β...
  • 回归分析是数据分析中最基础也是最重要的分析工具,绝大多数的数据分析问题,都可以使用回归的思想来解决。回归分析的任务就是, 通过研究自变量X和因变量Y的相关关系,尝试去解释Y的形成机制,进而达到通过X去预测Y...
  • 多元线性回归 stata

    千次阅读 多人点赞 2019-09-16 09:43:18
    回归的思想,任务,使命 可以看到0-1回归的因变量自变量都是0-1变量 因变量y可以分为 解释y的形成机制就是通过建立x,y的数学关系式 感觉相关分析就是回归分析的前两步, 数据的分类 ...
  • 多元线性回归的基础理解

    万次阅读 多人点赞 2018-11-19 01:09:28
    多元线性回归  Multivarate Linear Regression Multiple Feature 前面我们学习了一元线性回归,也动手亲自从底层编写了梯度下降算法来实现一元线性回归。相信大家已经对梯度下降和线性回归有了很清晰的理解了。 ...
  • 多元线性回归

    万次阅读 2016-04-14 11:57:54
    假定被解释变量与多个解释变量之间具有线性关系,是解释变量的多元线性函数,称为多元线性回归模型。即  (1.1) 其中为被解释变量,为个解释变量,为个未知参数,为随机误差项。 被解释变量的期望值与解释...
  • 当只有一个自变量时,称为简单线性回归,当具有多个自变量时,称为多元线性回归。 线性关系的理解: 画出来的图像是直的。 每个自变量的最高次项为1。 拟合是指构建一种算法,使得该算法能够符合真实的数据。从...
  • 多元线性回归 及其Python实现

    万次阅读 多人点赞 2019-04-05 21:14:11
    多元线性回归 Python实现 多元线性回归求解过程 多元线性回归的形式: 目标函数: 将一个样本的向量化: 将所有样本的向量化: 向量化后的目标函数及求解结果: ps.上述多元线性回归的正规方程解问题是:事件...
  • 多元线性回归程序示例 类似的,我们也可以实现多元线性回归。这里,我们需要创建多个特征(x),我们也可以像之前程序那样,随机生成多个特征,不过,这里,我们使用sklearn库提供的更方面的方法。 from sklearn....
  • 机器学习算法(8)之多元线性回归分析理论详解

    万次阅读 多人点赞 2018-08-29 16:28:27
    前言:当影响因变量的因素是多个时候,这种一个变量同时与多个变量的回归问题就是多元回归,分为:多元线性回归和多元非线性回归。线性回归(Linear regressions)和逻辑回归(Logistic regressions)是人们学习算法的第...
  • 多元线性回归求解过程 解析解求解

    万次阅读 多人点赞 2018-10-30 17:21:00
    常用算法一 多元线性回归详解2(解析解求解多元线性回归)  上一篇讲到什么是多元线性回归以及多元线性回归的推导过程详解,本章我们一起来看如何求得最优解,就是我们得到了多元线性回归到损失函数就是最小二乘公式...
  • 多元线性回归java实现

    2017-11-28 16:08:08
    根据随机变量y及自变量x0,x1...xm-1的n组观测值做线性回归分析,简单实例,有注释,Java实现
  • SPSS多元线性回归结果分析

    万次阅读 多人点赞 2018-04-11 17:42:00
    对总回归方程进行F检验。显著性是sig。 结果的统计学意义,是结果真实程度(能够代表总体)的一种估计方法。专业上,p 值为结果可信程度的一个递减指标,p 值越大,我们越不能认为样本中变量的关联是 总体中各变量...
  • 前面几节都是监督学习方面的算法,监督学习是指有目标变量或预测目标的机器学习方法,回归与分类的不同,就在于其目标变量是连续...本节将从最简单的一元线性回归开始,然后是多元,逐次深入, 下面就开始介绍线...

空空如也

1 2 3 4 5 ... 20
收藏数 147,188
精华内容 58,875
关键字:

线性回归