文档章节

线性回归原理和实现基本认识

wangxuwei
 wangxuwei
发布于 06/24 23:29
字数 1821
阅读 9
收藏 0
点赞 0
评论 0

一:介绍

       定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商品的大小,y代表为销售量;当月份x =5时,我们就能根据线性模型预测出 y =11销量;对于上面的简单的例子来说,我们可以粗略把 y =2x+1看到回归的模型;对于给予的每个商品大小都能预测出销量;当然这个模型怎么获取到就是我们下面要考虑的线性回归内容;并且在现实中影响销量(y)的因素好有很多,我们就拿商品大小(x₁),商品价格为例 (x₂)为例:

      在机器学习之前,获取数据是第一步(无米难巧妇之炊),假定我们的样本如下:其中x1 为商品的大小,x2 为商品的价格,y 为商品的销量;

    

二 :模型推导

        为了推导模型,在假设数据满足线性模型条件下,可以设定线性模型为;x1特征为商品的大小,X2特征为商品的价格;

         

       模型假定好后,我们把训练数据代入上面的设定模型中,可以通过模型预测一个样本最终值;

         

      然后样本真实值 y 和模型训练预测的值之间是有误差 ε ,再假设训练样本的数据量很大的时候,根据中心极限定律可以得到   ∑ε   满足 (u ,δ²)高斯分布的;由于方程有截距项 ,故使用可以 u =0; 故满足(0,δ²)的高斯分布;

  

如上面可知,对于每一个样本 x ,代入到 p (y |x ;θ) 都会得到一个y 的概率;又因为设定样本是独立同分布的;对其求最大似然函数:

对其化简如下:

以上就得到了回归的损失函数最小二乘法的公式,对于好多介绍一般对线性回归的线性损失函数就直接给出了上面的公式二乘法。下面我们就对上面做了阶段性的总结:线性回归,根据大数定律和中心极限定律假定样本无穷大的时候,其真实值和预测值的误差ε 的加和服从u=0,方差=δ²的高斯分布且独立同分布,然后把ε =y-Øx 代入公式,就可以化简得到线性回归的损失函数;

    第二步:对损失函数进行优化也就是求出w,b,使的损失函数最小化;第一种方法使用矩阵(需要满足可逆条件)

 以上就是按矩阵方法优化损失函数,但上面方法有一定的局限性,就是要可逆;下面我们来说一说另外一个优化方法 梯度下降法;对于梯度下降法的说明和讲解资料很多,深入的讲解这里不进行,可以参考:http://www.cnblogs.com/ooon/p/4947688.html这篇博客,博主对梯度下降方法进行了讲解,我们这里就简单的最了流程解说;

总体流程就如上所示,就是求出每个变量的梯度;然后顺着梯度方向按一定的步长a,进行变量更新;下面我们就要求出每个变量的梯度,下面对每个θ进行梯度求解公式如下:

如上我们求出变量的梯度;然后迭代代入下面公式迭代计算就可以了:

上面每次更新变量,都要把所有的样本的加起来,数据量大的时候效率不高,下面还有一种就是按单个样本进行优化,就是随机梯度下降:

按上面优化步骤就可以求出w,b,就可以获得优化的特征方程:说这么多先上个代码:

# -*- coding:utf-8 -*-

import numpy as np
import warnings
from sklearn.exceptions import ConvergenceWarning
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression, RidgeCV, LassoCV, ElasticNetCV
import matplotlib as mpl
import matplotlib.pyplot as plt

if __name__ == "__main__":

    warnings.filterwarnings(action='ignore', category=ConvergenceWarning)
    np.random.seed(0)
    np.set_printoptions(linewidth=1000)
    N = 9
    x = np.linspace(0, 6, N) + np.random.randn(N)
    x = np.sort(x)
    y = x ** 2 - 4 * x - 3 + np.random.randn(N)
    x.shape = -1, 1
    y.shape = -1, 1
    p = Pipeline([
        ('poly', PolynomialFeatures()),
        ('linear', LinearRegression(fit_intercept=False))])
    mpl.rcParams['font.sans-serif'] = [u'simHei']
    mpl.rcParams['axes.unicode_minus'] = False
    np.set_printoptions(suppress=True)
    plt.figure(figsize=(8, 6), facecolor='w')
    d_pool = np.arange(1, N, 1)  # 阶
    m = d_pool.size
    clrs = []  # 颜色
    for c in np.linspace(16711680, 255, m):
        clrs.append('#%06x' % c)
    line_width = np.linspace(5, 2, m)
    plt.plot(x, y, 'ro', ms=10, zorder=N)
    for i, d in enumerate(d_pool):
        p.set_params(poly__degree=d)
        p.fit(x, y.ravel())
        lin = p.get_params('linear')['linear']
        output = u'%s:%d阶,系数为:' % (u'线性回归', d)
        print output, lin.coef_.ravel()
        x_hat = np.linspace(x.min(), x.max(), num=100)
        x_hat.shape = -1, 1
        y_hat = p.predict(x_hat)
        s = p.score(x, y)
        z = N - 1 if (d == 2) else 0
        label = u'%d阶,$R^2$=%.3f' % (d, s)
        plt.plot(x_hat, y_hat, color=clrs[i], lw=line_width[i], alpha=0.75, label=label, zorder=z)
        plt.legend(loc='upper left')
        plt.grid(True)
        # plt.title('线性回归', fontsize=18)
        plt.xlabel('X', fontsize=16)
        plt.ylabel('Y', fontsize=16)
    plt.show()

运行代码后可见打印控制台信息如下:

/home/mymotif/PycharmProjects/py2/venv/bin/python /opt/pycharm-2018.1.3/helpers/pydev/pydev_run_in_console.py 40267 39581 /home/mymotif/PycharmProjects/py2/ml1.py
Running /home/mymotif/PycharmProjects/py2/ml1.py
import sys; print('Python %s on %s' % (sys.version, sys.platform))
sys.path.extend(['/home/mymotif/PycharmProjects/py2'])
线性回归:1阶,系数为: [-12.12113792   3.05477422]
线性回归:2阶,系数为: [-3.23812184 -3.36390661  0.90493645]
线性回归:3阶,系数为: [-3.90207326 -2.61163034  0.66422328  0.02290431]
线性回归:4阶,系数为: [-8.20599769  4.20778207 -2.85304163  0.73902338 -0.05008557]
线性回归:5阶,系数为: [ 21.59733285 -54.12232017  38.43116219 -12.68651476   1.98134176  -0.11572371]
线性回归:6阶,系数为: [ 14.73304784 -37.87317493  23.67462341  -6.07037979   0.42536833   0.06803132  -0.00859246]
线性回归:7阶,系数为: [ 314.3034477  -827.89447307  857.33293579 -465.46543848  144.21883914  -25.67294689    2.44658613   -0.09675941]
线性回归:8阶,系数为: [-1189.50155038  3643.69126592 -4647.92962086  3217.22828675 -1325.87389914   334.32870442   -50.57119322     4.21251834    -0.14852101]
PyDev console: starting.
Python 2.7.12 (default, Dec  4 2017, 14:50:18) 
[GCC 5.4.0 20160609] on linux2

 

图像显示如下:

从上面图像可以看出,当模型复杂度提高的时候,对训练集的数据拟合很好,但会出现过度拟合现象,为了防止这种过拟合现象的出现,我们在损失函数中加入了惩罚项,根据惩罚项不同分为以下:

 

       

最后一个为Elastic Net 回归,把 L1 正则和 L2 正则按一定的比例结合起来:

L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,这些特征都会接近于0。Lasso在特征选择时候非常有用,而Ridge就只是一种规则化而已。在所有特征中只有少数特征起重要作用的情况下,选择Lasso比较合适,因为它能自动选择特征。而如果所有特征中,大部分特征都能起作用,而且起的作用很平均,那么使用Ridge也许更合适。对于各种回归的比较可以看下图:

 

本文转载自:https://blog.csdn.net/lisi1129/article/details/68925799

共有 人打赏支持
wangxuwei
粉丝 21
博文 329
码字总数 112490
作品 0
杭州
其他
每周一本书之《深度学习入门与实践》

  来源:数据猿 作者:abby   目前,人工智能真可谓炙手可热的技术。AlphaGo完败李世乭的战绩宣告了人类智力最后的堡垒——围棋被攻破。大量资本涌入人工智能领域,大量人工智能明星企业...

数据猿
01/09
0
0
《机器学习实战》 (3) logistic regression(逻辑斯蒂回归)小结(上)

最近一直在学习《机器学习实战》这一本书,之前学习了kNN 算法和决策树算法,因为想迫切的接触logistic回归算法,所以我跳过了朴素贝叶斯(下一讲会说),而是首先学习了logistic回归,这也是...

lwpyh
05/28
0
0
Python3入门机器学习(五)-线性回归算法

1.线性回归算法简介 线性回归算法以一个坐标系里一个维度为结果,其他维度为特征(如二维平面坐标系中横轴为特征,纵轴为结果),无数的训练集放在坐标系中,发现他们是围绕着一条执行分布。...

Meet相识_bfa5
04/19
0
0
机器学习从零开始系列连载(2)——线性回归

作者:张磊 编辑:赵一帆 本周剩余内容: 2. 建模方法回顾 2.0 偏差与方差 2.1 线性回归-Linear Regression 2.1.1 模型原理 2.1.2 损失函数 2.2 支持向量机-Support Vector Machine 2.2.1 模...

szm21c11u68n04vdclmj
2017/11/27
0
0
机器学习常见分类算法

机器学习常见分类算法 朴素贝叶斯分类器(Naive Bayes) 主要思想: 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/...

srcool
2016/11/05
56
0
机器学习:XGBoost 安装及实战应用

请点击上面公众号,免费订阅。  《实例》阐述算法,通俗易懂,助您对算法的理解达到一个新高度。包含但不限于:经典算法,机器学习,深度学习,LeetCode 题解,Kaggle 实战。期待您的到来!...

xo3ylaf9kgs
2017/12/12
0
0
《机器学习》周志华-CH3 线性模型

写在前面 线性模型,可以说是机器学习中最简单的一种模型;它形式简单,易于实现,却同时也是SVM、神经元等复杂非线性模型的基础。CH1和CH2,介绍了机器学习领域的基本概念,和获得模型的一般...

qq_34100655
02/03
0
0
Machine Learning 2 - 非线性回归算法分析

2017-08-02@erixhao 技术极客TechBooster AI 机器学习第二篇 - 非线形回归分析。我们上文深入本质了解了机器学习基础线性回归算法后,本文继续研究非线性回归。 非线性回归在机器学习中并非热...

erixhao
2017/08/07
0
0
Netflix工程总监眼中的分类算法:深度学习优先级最低

英文原文:What are the advantages of different classification algorithms?(翻译/王玮编辑/周建丁)   【编者按】针对 Quora 上的一个老问题:不同分类算法的优势是什么?Netflix 公司...

老朱第八
2017/11/11
0
0
搞定机器学习面试,这些是基础!

一、决策树 1.1 原理 顾名思义,决策树就是用一棵树来表示我们的整个决策过程。这棵树可以是二叉树(比如CART只能是二叉树),也可以是多叉树(比如ID3、C4.5可以是多叉树或二叉树)。 根节点...

技术小能手
07/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
35分钟前
0
0
从MySQL全备文件中恢复单个库或者单个表

从MySQL全备文件中恢复单个库或者单个表 提取建库语句 sed -n '/^-- Current Database: db_cms/,/^-- Current Database: `/p' backup.sql > db_cms.sql & 提取ddl sed -e'/./{H;$!d;}' -e ......

yysue
今天
0
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
0
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
1
0
流利阅读笔记33-20180722待学习

黑暗中的生物:利用奇技淫巧快活生存 Daniel 2018-07-22 1.今日导读 如果让你在伸手不见五指的黑暗当中生存,你能熬过几天呢?而大千世界,无奇不有。在很多你不知道的角落,有些生物在完全黑...

aibinxiao
昨天
6
0
Hystrix降级逻辑中如何获取触发的异常

通过之前Spring Cloud系列教程中的《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》一文,我们已经知道如何通过Hystrix来保护自己的服务不被外部依赖方拖垮的情况。但是实际...

程序猿DD
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部