• 线性回归相关知识点总结


    线性学习中最基础的回归之一,本文从线性回归的数学假设,公式推导,模型算法以及实际代码运行几方面对这一回归进行全面的剖析~

    一:线性回归的数学假设

    1.假设输入的X和Y是线性关系,预测的y与X通过线性方程建立机器学习模型

    2.输入的Y和X之间满足方程Y=X+e,e是误差项,噪音项,假设e是独立同分布的,服从IID(independent and identity distribution)和均值为0,方差为某一定数的正态分布(也叫高斯分布)e服从正态分布是由中新计值定理决定的

    二、线性回归建模

    2.1方程式表示:

    数学形式:

    矩阵形式:
    其中,X矩阵是m行(n+1)列的,每一行是一个样本,每一列是样本的某一个特征
    矩阵(n+1)行一列的,它是X的权重,也是线性回归要学习的参数


    2.2 损失函数(Loss function)
    对数极大似然和最小二乘的联系:
    由线性函数的假设知道,噪音项满足高斯分布,其中一个样本的正态分布的数学表达为:
    那么,通过极大估计求得似然函数为所有样本的乘积,如下:
    经过数学运算和推导,求极大似然的最大值可以转化为求其log函数的最大值,推导过程如下:
    要使得极大似然取得极大值,上式中的后一项就要最小,也可以将求线性回归的极大似然转化为求最小二乘的最小值,也就是常见到的线性函数的最小二乘求损失函数的数学形式:
    由此就得到了线性函数的loss function
    三、线性函数算法:求解参数
    机器算法的目的就是通过建立模型并通过选择合适的算法来求出参数下的y和实际的Y之间的差值尽量的小,也就是预测的准确率在训练集和测试集足够高
    3.1 当矩阵可逆(满秩)时,通过normal equation可以直接求解
    目标函数转化为矩阵形式:
    对其求导并求驻点
     
    另上式为0,可求得
    此算法的缺点是:当矩阵很大是,计算非常耗时且占用资源
    3.2 当矩阵不可逆(非满秩)时,通过梯度下降求解
    初始化,沿着负梯度方向进行迭代,知道变化很小或者不变化
    梯度下降中设计到的参数是,步长alpha,迭代次数t,这些对于计算最终的都会影响,所以需要调参优化。
    常用的梯度下降算法有SGD,BGD,mBGD,实际中以mBGD使用最多
    四、线性回归防止overfitting
    机器学习最忌讳的是死记硬背,像考试一样平时学习只记得死答案了,在考试的时候就不会做题目了,为了灵活变通,overfitting的方法就出现了,线性回归中最常用的是引入正则化项,也就惩罚项,给损失函数的参数赋予一个约束项,使其不能任意的无限大或者无限小,加入正则化损失函数变为:
     
    4.1当矩阵满秩时,引入正则项后的变为:
    4.2当矩阵不满秩时,引入正则项后的变为:
    五、python代码实现
    数据:仍然使用上海2015的气温数据
    分别作图看2015上海的气温和气压的关系以及使用线性回归拟合的结果,代码如下:
    import numpy as np  
    import matplotlib.pyplot as plt  
    from sklearn.linear_model import LinearRegression  
    from sklearn.linear_model import RidgeCV  
    from sklearn.cross_validation import train_test_split  
      
    '''''#load data 
    n=100 
    x = np.arange(1,100,n)+np.random.randn(n) 
    y = 4*x - 3 + np.random.randn(n) 
    plt . figure () 
    plt . plot(x, y, 'r*', label='X') 
    plt . ylabel (" Y"  ) 
    plt . xlabel (" X") 
    plt . legend(loc="best") 
    plt . tight_layout() 
    plt . show() 
    '''  
    data = ['C:\Users\123\Desktop\weather\2015.txt',]  
    w = np. loadtxt ( data [0] , skiprows =1)  
    y = w[:,7]/10  
    x = w[:,10]  
    plt . figure ()  
    plt . plot(x,y,"b*",label="Atmospheric pressure")  
    plt . ylabel (" Temperatures"  )  
    plt . xlabel ("Atmospheric pressure "  )  
    plt . title (' Temperatures trent chart of Shanghai in year 2015 ')  
    plt . tight_layout()  
    plt . legend(loc="best")  
    plt . show()  
      
      
    x = x.reshape(-1, 1)  
    x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1)  
    lr = LinearRegression()  
    lr . fit ( x_train , y_train)  
    y_lr = lr.predict ( x_test )  
    cv = RidgeCV(alphas=np.logspace(-3, 2, 100))  
    cv . fit ( x_train , y_train)  
    y_cv = cv.predict ( x_test )  
    print lr.coef_  
    print lr.intercept_  
    print "mes of Linear Regresion squares is", np. mean(( y_lr - y_test ) ** 2)  
    print "accuracy of Linear regression is",lr.score(x_test,y_test)  
    print cv.coef_  
    print cv.intercept_  
    print "mes of Linear Regresion+Ridge squares is", np. mean(( y_cv - y_test ) ** 2)  
    print "accuracy of Linear regression is",cv.score(x_test,y_test)  
      
    x1 = np.arange(len(x_test))  
    plt.plot(x1,y_test,"y*-",label="Test")  
    plt.plot(x1,y_lr,"ro-",label="Predict")  
    plt.plot(x1,y_cv,"b^-",label="Predict+Ridge")  
    plt . ylabel (" Temperatures"  )  
    plt . xlabel (" Atmospheric pressure")  
    plt . title (' Predict chart ')  
    plt . legend(loc="best")  
    plt . tight_layout()  
    plt . show()  
    运行代码作图如下:
    图一是2015年气温和气压的曲线图,可以看到有比较明显的线性趋势的关系,说明我们可以用线性回归来进行预测,接下来我们就进行预测
    预测后的test和predict的图如下:
     
    上图分别用了线性回归的解析解以及基于Ridge 惩罚的线性回归,从拟合结果看,两种方法效果差不多,最后,将预测准确率输出:
    两种方法的准确率大概都在~87%,Ridge回归的效果稍好但不明显。
    原文地址:https://blog.csdn.net/july_sun/article/details/53223962
  • 相关阅读:
    shell getopt getopts获取参数
    apache+svn+ladp认证
    SVN 迁移项目分支
    iptables 优先级
    很实用的一篇HTTP状态码
    套路还在——矩阵计算估值
    CU上看到的一个简单的算法帖子
    linux下服务端实现公网数据转发
    c++接口实现与分离(转载)
    c++继承概念
  • 原文地址:https://www.cnblogs.com/yiduobaozhiblog1/p/8870753.html
Copyright © 2020-2023  润新知