精华内容
下载资源
问答
  • 2.弹性回归引擎:用于列表已经滑动到顶端(末端)需要再往下(往上)移动一些距离,表示别表已经到头。 引擎每隔0.04秒(大约是每秒24帧)就刷新一次,由于是GC绘制,所以每次滑动时需要条用绘制函数。效

    ----------------------------------------------------欢迎查看IM软件业务知识《专栏》-------------------------------------------------------------------
    使用状态机来保持在线状态 【点击】                      拼图算法,将零碎小图,整理到一张大图上【点击
    登录导航 【点击】                                                   会话session的概念【点击】       
    “假在线’ 【点击】                                                    非对称加密,RSA算法【点击
    如何建立安全socket连接、登录 【点击】               浅谈断线重连、心跳和长在线 【点击
    iOS 客户端创建网络连接,常见错误汇总 【点击】 protocolBuf 在iOS上的使用入门、讲解、指南 【点击
    实现富文本解析【点击】                                          UITableview Deceleration 加速滑动(惯性滑动)、弹性回归原理【点击
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------

    一、前言

    之前做Symbian项目,由于软件的界面完全是自绘的,列表也是自绘,所以列表的滚动也要自己做,然后就试着做了两个引擎:

    1.惯性滑动引擎:由于列表比较长,快速滑动,加速滑动。

    2.弹性回归引擎:由于列表已经滑动到顶端(末端)需要再往下(往上)继续离开顶部(底部)一些距离,表示别表已无内容,列表到头。

    当时做symbian的时候不知道Deceleration这个术语,本人只是从效果上看是惯性滑动,并且下拉的时候是回归动作。所以之前的名字是:惯性滑动,弹性回归!

    基本思想就是按照每秒24帧的速度刷新列表,即每隔0.04秒刷新一次,由于是GC绘制,所以每次滑动时需要条用绘制函数,所以该引擎的效率还是不行。

    这两天,将着两个引擎移植到iOS上发现,效果也不怎么滴。所以GC直接绘制效率太低。因为iOS上通常是使用“偏移量”来达到滑动效果。

    相关文章: 探究contentOffset和contentInset,并解决上拉加载更多,uitableview抖动问题

    二、算法思路

    第一、“惯性滑动”的思路

    列表较长的情况下用手拨动屏幕,实现较长的滑动。但是这个滑动又不是线性的,还要有一些阻尼效果。

    所以,第一次我想到了抛物线,是源自物体掉落的轨迹,后来经过测试这个效果不好。

    于是,我又想到了标准正态分布曲线,这个阻尼效果更明显。如图1所示:




    用户拨动屏幕,当手指离开屏幕时,必然带着初速度。那么我把这个初速度对应到图1中的Y轴最高点的值,然后这个值随着时间的推移,不断减小,从而达到模拟自然情况下阻尼滑动的效果。

    如何求出初速度?

    设计两个长度为5的数组,一个用于记录用户滑动时的坐标Y值。另外一个用于记录时间。不管用户滑动多长距离只保留最后5个坐标和5个时间值。然后,用户滑动的距离除以时间即可算出来速度。当然这里的单位就比较模糊了(严格上说是像素/微秒)。

    还有一个技术点:如果用户在屏幕上来回滑屏,即轨迹并不是一个方向。这种情况怎么判断出来。如图2所示:



    (图2)

    判断最后5个点是否在同一条直线上。

    第二、再说“弹性回归”的思路。

    其实弹性回归要比惯性滑动复杂。为什么?因为,惯性滑动时,具体滑动的距离我不用关心,滑动多点儿也行,少点儿也行。但是弹性回归是一个固定的距离。比如:把列表从顶端往下拉动了100个像素,那么我的弹性回归引擎,需要在一定时间内按照某个曲线正好滑动完这100个像素。这次我选的是抛物线了,下面将详细说明理由。如下图3所示:100个像素就表示图中阴影部分的面积,弹性回归引擎要


    (图3)


    根据抛物线弓形面积公式等于:以割线为底,以平行于底的切线的切点为顶点的内接三角形的3/4,即: 抛物线弓形面积=S+1/4*S+1/16*S+1/64*S+……=4/3*S

    根据阴影的面积可以求出,b的值。所以,每次滑动的距离即x1,x2,x3...x(b-1)。这里x1的面积需要微积分了。

    总而言之:这两个引擎核心是两个曲线,仅供参考。这个方法也让公司申请了专利。专利号CN102331877A

    代码我放到:http://download.csdn.net/detail/hherima/5161117 

    注意:该工程包含里富文本解析。只需要看MyListBrowserSlideEngine.m就行了。


    展开全文
  • 主要介绍了用tensorflow实现弹性网络回归算法
  • 线性回归、lasso回归、岭回归以及弹性网络的系统解释声明背景介绍概述线性回归模型函数及损失函数线性回归算法多项式回归(线性回归的推广)广义线性回归(线性回归的推广)岭回归(Ridge回归)lasso回归为什么lasso...

    声明

    本博客集合了网上众多大牛的博客和观点,后面将对主要的引用源进行列举。在此对各位博主大牛表示感谢,若有侵权,请联系我。

    第一次写博客,任何意见,请不吝赐教!

    背景介绍

    线性回归模型的偏回归系数的表达式:θ=(XX)1XY\theta =(X^\intercal X)^{−1}X^\intercal Y要能保证该回归系数有解,必须确保XTX矩阵是满秩的,即XTX可逆,但在实际的数据当中,自变量之间可能存在高度自相关性,就会导致偏回归系数无解或结果无效。为了能够克服这个问题,可以根据业务知识,将那些高自相关的变量进行删除;或者选用岭回归也能够避免XTX的不可逆。
    (岭回归的必要性还有为了防止过拟合)

    岭回归一般可以用来解决线性回归模型系数无解的两种情况,一方面是自变量间存在高度多重共线性,另一方面则是自变量个数大于等于观测个数。针对这两种情况,我们不妨设计两个矩阵,来计算一下XTX的行列式。
    比如:第一种矩阵:第一列和第三列存在两倍关系(即多重共线性);第二种矩阵:列数比行数多(非满秩)

    所以,不管是高度多重共线性的矩阵还是列数多于观测数的矩阵,最终算出来的行列式都等于0或者是近似为0,类似于这样的矩阵,都会导致线性回归模型的偏回归系数无解或解无意义(因为矩阵行列式近似为0时,其逆将偏于无穷大,导致回归系数也被放大)。那如何来解决这个问题呢?1970年Heer提出了岭回归方法,非常巧妙的化解了这个死胡同,即在XXX^\intercal X的基础上加上一个较小的α\alpha扰动 (具体做法是在损失函数中加入了线性回归系数的L2正则项),从而使得行列式不再为0。LASSO回归与岭回归非常类似,不同的是在损失函数中加入了线性回归系数的L1正则项。

    概述

    线性回归问题算是机器学习中最基本的问题了,它主要包含线性回归算法、多项式回归算法(线性回归算法的推广)和广义线性回归(线性回归算法的推广)。
    以线性回归为基础,可以衍生出lasso回归、岭回归和弹性回归。线性回归采用误差平方和来作为损失函数,虽然这种算法简单,但是也会出现过拟合的现象,在线性回归损失函数中加入正则项可以有效地解决过拟合问题;线性回归的损失函数中加入自变量系数向量的L1范数后,线性回归变为lasso回归;线性回归的损失函数中加入自变量系数向量的L2范数后,线性回归变为岭回归(Ridge回归);线性回归的损失函数中加入自变量系数的L1范数和L2范数的结合后,线性回归变为弹性网络(Elastic Net)
    线性回归衍生出的三种回归方法各有优缺点,其详细内容后面会一一介绍。

    线性回归模型函数及损失函数

    线性回归遇到的问题可以做这样的描述,假设我们有m个样本,每个样本 ii 包含nn个特征xi1,xi2,...,xinx_{i1},x_{i2},...,x_{in}和一个输出yiy_i,如下:(x1(1),x2(1),...,xn(1),y1),(x1(2),x2(2),...,xn(2),y2),......(x1(m),x2(m),...,xn(m),ym), (x_1^{(1)}, x_2^{(1)}, ...,x_n^{(1)}, y_1),\\(x_1^{(2)}, x_2^{(2)}, ...,x_n^{(2)}, y_2), \\......\\(x_1^{(m)}, x_2^{(m)},...,x_n^{(m)},y_m),
    我们的问题是,当给定一个新的(x1(m+1),x2(m+1),...,xn(m+1)(x_1^{(m+1)}, x_2^{(m+1)}, ...,x_n^{(m+1)}时,如何确定其对应的输出ym+1y_{m+1}呢?如果这个问题中的 yy 是连续的,那么这是一个回归问题,如果 yy 是离散的,那么这是一个分类问题。
    对于nn维特征的样本数据,如果我们决定使用线性回归,那么对应的模型是这样的:
    hθ(x1,x2,...,xn)=θ0+θ1x1+...+θnxn,h_\theta(x_1,x_2,...,x_n)=\theta_0+\theta_1x_1+...+\theta_nx_n, 其中θi(i=0,1,2...n)\theta_i (i = 0,1,2... n)为模型参数,xi(i=0,1,2...n)x_i (i = 0,1,2... n)为每个样本的nn个特征值。这个表示可以简化,我们增加一个特征x0=1x_0=1 ,这样
    hθ(x0,x1,...,xn)=i=0nθixih_\theta(x_0,x_1,...,x_n)= \sum_{i=0}^n\theta_ix_i。进一步用矩阵形式表达更加简洁如下:hθ(X)=Xθh_\theta(X)=X\theta其中, 假设函数hθ(X)h_\theta(X)m×1m\times1的向量,θθn×1n\times1的向量,里面有nn个代数法的模型参数。XXm×nm\times n维的矩阵。mm代表样本的个数,nn代表样本的特征数。
    得到了模型,我们需要求出需要的损失函数,一般线性回归我们用均方误差作为损失函数。损失函数的代数法表示如下:J(θ0,θ1,...,θn)=i=1m(hθ(x0(i),x1(i),...xn(i))yi)2J(\theta_0,\theta_1,...,\theta_n)=\sum_{i=1}^m(h_\theta(x^{(i)}_0,x^{(i)}_1,...x^{(i)}_n)-y_i)^2进一步用矩阵形式表达损失函数:J(θ)=12(XθY)(XθY)J(\theta)=\dfrac{1}{2}{(X\theta−Y)}^\intercal(X\theta−Y)YYm×1m\times1维的矩阵,表示输出矩阵,即由yi(i=1,2,...,n)y_i(i=1,2,...,n)组成的矩阵。由于矩阵法表达比较的简洁,后面我们将统一采用矩阵方式表达模型函数和损失函数。

    线性回归算法

    对于线性回归的损失函数J(θ)=12(XθY)(XθY)J(\theta)=\dfrac{1}{2}(X\theta−Y)^\intercal(X\theta−Y),我们常用的有两种方法来求损失函数最小化时候的 θ\theta 参数:一种是梯度下降法,一种是最小二乘法。由于不是本文内容且不影响读者理解线性回归,在此不对梯度下降法和最小二乘法进行详细介绍,若不明白,可以百度,推荐这个网址,梯度下降法最小二乘法
    如果采用梯度下降法,则 θ\theta 的迭代公式是这样的:θ=θαX(XθY)\theta=\theta−\alpha X^\intercal(X\theta−Y)通过若干次迭代后,我们可以得到最终的θ的结果。
    如果采用最小二乘法,则 θ\theta 的结果公式如下:θ=(XX)1XY\theta=(X^\intercal X)^{−1}X^\intercal Y当然对于求线性回归的系数,还有其他的常用算法,比如牛顿法和拟牛顿法,不是本文重点,这里不详细描述。

    多项式回归(线性回归的推广)

    回到我们开始的线性模型,hθ(x1,x2,...,xn)=θ0+θ1x1+...+θnxnh_θ(x_1,x_2,...,x_n)=θ_0+θ_1x_1+...+θ_nx_n, 如果这里不仅仅是 xx 的一次方,比如增加二次方,那么模型就变成了多项式回归。这里写一个只有两个特征的2次方多项式回归的模型:hθ(x1,x2)=θ0+θ1x1+θ2x2+θ3x12+θ4x22+θ5x1x2h_θ(x_1,x_2)=θ_0+θ_1x_1+θ_2x_2+θ_3x_1^2+θ_4x_2^2+θ_5x_1x_2我们令x0=1,x1=x1,x2=x2,x3=x12,x4=x22,x5=x1x2x_0=1,x_1=x_1,x_2=x_2,x_3=x_1^2,x_4=x_2^2,x_5=x_1x_2 ,这样我们就得到了下式:hθ(x1,x2)=θ0+θ1x1+θ2x2+θ3x3+θ4x4+θ5x5h_θ(x_1,x_2)=θ_0+θ_1x_1+θ_2x_2+θ_3x_3+θ_4x_4+θ_5x_5可以发现,我们又重新回到了线性回归,这是一个五元线性回归,可以用线性回归的方法来完成算法。对于每个二元样本特征(x1,x2)(x_1,x_2),我们得到一个五元样本特征(1,x1,x2,x12,x22,x1x2)(1,x_1,x_2,x_1^2,x_2^2,x_1x_2),通过这个改进的五元样本特征,我们重新把不是线性回归的函数变回线性回归。

    广义线性回归(线性回归的推广)

    在上一节的线性回归的推广中,我们对样本特征端做了推广,这里我们对于特征 yy 做推广。比如我们的输出 YY 不满足和 XX 的线性关系,但是 lnY\ln YXX 满足线性关系,模型函数如下:lnY=Xθ\ln Y=X\theta这样对与每个样本的输入 yy,我们用 lny\ln y 去对应, 从而仍然可以用线性回归的算法去处理这个问题。我们把 lny\ln y 一般化,假设这个函数是单调可微函数 g(.)g(.),则一般化的广义线性回归形式是:g(Y)=Xθg(Y)=X\theta 或者 Y=g1(Xθ)Y=g^{−1}(X\theta) 这个函数 g(.)g(.)我们通常称为联系函数, g1(.)g^{-1}(.)g(.)g(.)反函数

    岭回归(Ridge回归)

    在前面的概述中已经对岭回归(Ridge)和lasso回归的产生背景进行了介绍,本小节将对岭回归的原理进行概述。
    线性回归的L2正则化通常称为Ridge回归,它和一般线性回归的区别是在损失函数上增加了一个L2正则化的项,和Lasso回归的区别是Ridge回归的正则化项是L2范数,而Lasso回归的正则化项是L1范数。具体Ridge回归的损失函数表达式如下:J(θ)=12(XθY)(XθY)+12αθ22J(θ)=\dfrac{1}{2}(Xθ−Y)^\intercal(Xθ−Y)+\dfrac{1}{2}\alpha||\theta||_2^2其中α\alpha为常数系数,代表正则化系数,太小就会失去处理过拟合的能力,太大就会因矫正过重而出现欠拟合的现象,需要进行调优。θ2||θ||_2为L2范数。
    Ridge回归在不抛弃任何一个特征的情况下,缩小了回归系数,使得模型相对而言比较的稳定,但和Lasso回归比,这会使得模型的特征留的特别多,模型解释性差。至于为什么会这样,在后面的章节中会讲到。
    Ridge回归的求解比较简单,一般用最小二乘法。这里给出用最小二乘法的矩阵推导形式,和普通线性回归类似。
    令J(θ)的导数为0,得到下式:X(XθY)+αθ=0X^\intercal(Xθ−Y)+\alpha\theta=0整理即可得到最后的θ的结果:θ=(XX+αE)1XY \theta=(X^\intercal X+\alpha E)^{−1}X^\intercal Y其中EE为单位矩阵。
    针对α\alpha的设置,需要单独提一下,python中有可以辅助设置此参数的库RidgeCV,RidgeCV算法与Ridge算法的损失函数与损失函数的优化方法是一致的,只是在验证方法上有所不同。RidgeCV算法对损失函数的常数系数进行了交叉验证,从而自动选择一个合适的系数。在初始化RidgeCV类时候,我们可以传一组备选的值,10个,100个都可以。RidgeCV类会帮我们选择一个合适的系数。

    lasso回归

    Ridge回归在不抛弃任何一个变量的情况下,缩小了回归系数,使得模型相对而言比较的稳定,但这会使得模型的变量特别多,模型解释性差。有没有折中一点的办法呢?即又可以防止过拟合,同时克服Ridge回归模型变量多的缺点呢?有,这就是下面说的Lasso回归。
     Lasso回归有时也叫做线性回归的L1正则化,和Ridge回归的主要区别就是在正则化项,Ridge回归用的是L2正则化,而Lasso回归用的是L1正则化。Lasso回归的损失函数表达式如下:J(θ)=12n(XθY)(XθY)+αθ1J(\theta)=\dfrac{1}{2n}(X\theta−Y)^\intercal(X\theta−Y)+\alpha||\theta||_1其中nn为样本个数,α\alpha为常数系数,需要进行调优。θ1||\theta||_1为L1范数。
     
    Lasso回归使得一些系数变小,甚至还是一些绝对值较小的系数直接变为0,因此特别适用于参数数目缩减与参数的选择,因而用来估计稀疏参数的线性模型。
    但是Lasso回归有一个很大的问题,导致我们需要把它单独拎出来讲,就是它的损失函数不是连续可导的,由于L1范数用的是绝对值之和,导致损失函数有不可导的点。也就是说,我们的最小二乘法,梯度下降法,牛顿法与拟牛顿法对它统统失效了。此时我们可以通过坐标轴下降法(coordinate descent)和最小角回归法( Least Angle Regression, LARS)来求有这个L1范数的损失函数极小值。
    使用坐标轴下降法和最小角回归法进行求解的过程可以参考这个网址

    为什么lasso回归容易使得不重要的变量的系数变为0而岭回归却会保留它们

    经过上面的介绍,大家已经对岭回归和lasso回归有了基本的认识。不知大家有没有这个疑问,为什么lasso回归容易使得不重要的变量的系数变为0而岭回归却会保留它们呢?本小节将通过图形来解释。

    假设线性回归模型中只有两个自变量,系数为β1β2\beta_1、\beta_2(等同于上文中θ1θ2\theta_1、\theta_2。由于岭回归是在线性回归损失函数中加入了系数的L2正则项,lasso回归是在线性回归损失函数中加入了系数的L1正则项,所以可以得到下图,分别展示了岭回归和lasso回归系数的解,
    在这里插入图片描述
    可以清晰地看到:求解的交点不再是最小二乘的最小值(红点),而变成了与正则项的交点(黄点)。这个区别可以从二维图中更好地观察出来:岭回归中两个图形(没有棱角)的交点永远不会落在两个轴上,而LASSO回归中,正则化的几何图形是有棱角的,可以很好的让交点落在某一个轴上。这种稀疏化的不同也导致了LASSO回归可以用于特征选择(让特征权重变为0从而筛选掉特征),而岭回归却不行。

    弹性网络(Elastic Net)

    介绍完lasso回归和ridge回归,弹性网络就很简单了,损失函数如下:J(θ)=12(XθY)(XθY)+rαθ1+1r2αθ22J(\theta)=\dfrac{1}{2}(Xθ−Y)^\intercal(Xθ−Y)+r\alpha||\theta||_1+\dfrac{1−r}2\alpha||\theta||_2^2使用这种方式方法所得到的模型就像纯粹的Lasso回归一样稀疏,但同时具有与岭回归提供的一样的正则化能力。
    弹性网络在很多特征互相联系的情况下是非常有用的。Lasso 很可能只随机考虑这些特征中的一个,而弹性网络更倾向于选择两个,在实践中,Lasso 和 Ridge 之间权衡的一个优势是它允许在循环过程(Under rotate)中继承 Ridge 的稳定性。

    结语

    本文对线性回归及其相关的延伸进行了基础的介绍,可以帮助大家有一个基本的理解,里面有些细节没有深入展开,若有兴趣,读者可通过更专业的资料进行学习。

    参考资料

    1. https://www.cnblogs.com/yongfuxue/p/9971749.html
    2. https://blog.csdn.net/lsxxx2011/article/details/98764995
    3. https://blog.csdn.net/JH_Zhai/article/details/82694937
    4. https://blog.csdn.net/lsxxx2011/article/details/98764594
    5. https://www.cnblogs.com/pinard/p/6004041.html
    6. https://www.cnblogs.com/pinard/p/6018889.html
    展开全文
  • : [158.41] [ 34 0 170 165 170 165 170 165] : [176.03076923] 岭回归、lasso回归弹性网络回归预测结果比较 #以iris数据为例 #导入基本程序包 import pandas as pd import numpy as np from sklearn.datasets ...

    预测儿童身高案例

    案例背景介绍

    理论上,一个人的身高除了随年龄变大而增长之外,在一定程度上还受到遗传和饮食习惯以及其他因素的影响。在这里我们把问题简化一下,假定一个人的身高只受年龄、性别、父母身高、祖父母身高和外祖父母身高这几个因素的影响,并假定大致符合线性关系。

    %config InteractiveShell.ast_node_interactivity = 'all'   #同时输出多行结果
    import copy
    import numpy as np
    from sklearn import linear_model
    # 训练数据,每一行表示一个样本,包含的信息分别为:
    # 儿童年龄,性别(0女1男)
    # 父亲、母亲、祖父、祖母、外祖父、外祖母的身高
    x = np.array([[1, 0, 180, 165, 175, 165, 170, 165],
                  [3, 0, 180, 165, 175, 165, 173, 165],
                  [4, 0, 180, 165, 175, 165, 170, 165],
                  [6, 0, 180, 165, 175, 165, 170, 165],
                  [8, 1, 180, 165, 175, 167, 170, 165],
                  [10, 0, 180, 166, 175, 165, 170, 165],
                  [11, 0, 180, 165, 175, 165, 170, 165],
                  [12, 0, 180, 165, 175, 165, 170, 165],
                  [13, 1, 180, 165, 175, 165, 170, 165],
                  [14, 0, 180, 165, 175, 165, 170, 165],
                  [17, 0, 170, 165, 175, 165, 170, 165]])
    
    # 儿童身高,单位:cm
    y = np.array([60, 90, 100, 110, 130, 140, 150, 164, 160, 163, 168])
    
    
    # 创建线性回归模型
    lr = linear_model.LinearRegression()
    # 根据已知数据拟合最佳直线
    lr.fit(x, y)
    
    
    LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
    
    # 待测的未知数据,其中每个分量的含义和训练数据相同
    xs = np.array([[10, 0, 180, 165, 175, 165, 170, 165],
                   [17, 1, 173, 153, 175, 161, 170, 161],
                   [34, 0, 170, 165, 170, 165, 170, 165]])
    
    for item in xs:
        # 为不改变原始数据,进行深复制,并假设超过18岁以后就不再长高了
        # 对于18岁以后的年龄,返回18岁时的身高
        item1 = copy.deepcopy(item)
        if item1[0] > 18:
            item1[0] = 18
        print(item, ':', lr.predict(item1.reshape(1,-1)))
    
    [ 10   0 180 165 175 165 170 165] : [140.56153846]
    [ 17   1 173 153 175 161 170 161] : [158.41]
    [ 34   0 170 165 170 165 170 165] : [176.03076923]
    

    岭回归、lasso回归、弹性网络回归预测结果比较

    #以iris数据为例
    #导入基本程序包
    import pandas  as pd
    import numpy  as np
    from sklearn.datasets import load_iris
    from sklearn import linear_model
    from sklearn import metrics
    #导入IRIS数据集 
    iris = load_iris() 
     #特征矩阵 
    X=iris.data 
     #目标向量 
    y=iris.target
    from sklearn.cross_validation import train_test_split #导入数据划分包
    #以20%的数据构建测试样本,剩余作为训练样本
    X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.20,random_state =1)
    elastic= linear_model.ElasticNet(alpha=0.1,l1_ratio=0.5)  # 设置lambda值,l1_ratio值 ,这里需要注意的是,ElasticNet最基本的参数是alpha、l1_ratio,alpha其正则化选项中的λ,l1_ratio则是对应α。这里的random_state就是为了保证程序每次运行都分割一样的训练集和测试集。
    elastic.fit(X_train,y_train)  #使用训练数据进行参数求解
    y_hat2 = elastic.predict(X_test)  #对测试集的预测
    print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat2)))  #计算RMSE
    
    ElasticNet(alpha=0.1, copy_X=True, fit_intercept=True, l1_ratio=0.5,
          max_iter=1000, normalize=False, positive=False, precompute=False,
          random_state=None, selection='cyclic', tol=0.0001, warm_start=False)
    RMSE: 0.25040264500501913
    

    比较三种回归的不同

    岭回归

    ridge= linear_model.Ridge(alpha=0.1)  # 设置lambda值
    ridge.fit(X_train,y_train)  #使用训练数据进行参数求解
    y_hat = ridge.predict(X_test)  #对测试集的预测
    from sklearn import metrics  #导入metrics评价模块
    print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat)))  #计算RMSE
    
    
    Ridge(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=None,
       normalize=False, random_state=None, solver='auto', tol=0.001)
    RMSE: 0.24949141419802737
    

    lasso回归

    lasso= linear_model.Lasso(alpha=0.1)  # 设置lambda值
    lasso.fit(X_train,y_train)  #使用训练数据进行参数求解
    y_hat1 = lasso.predict(X_test)  #对测试集的预测
    print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat1)))  #计算RMSE
    
    Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,
       normalize=False, positive=False, precompute=False, random_state=None,
       selection='cyclic', tol=0.0001, warm_start=False)
    
    RMSE: 0.2555801316884705
    
    #得到岭回归的RMSE: 0.249491414198027;得到Lasso回归的RMSE: 0.2555801316884705
    #我们看到,在相同的lambda值下,ElasticNet回归的RMSE介于岭回归、lasso之间,即比Lasso回归的效果好,比岭回归的效果差。
    #当然我们可以调整参数,会得到不同结果。
    
    
    展开全文
  • 自适应弹性回归的目标跟踪
  • 线性回归(五)---弹性网络回归

    千次阅读 2020-06-01 15:58:55
    弹性网络回归 弹性网络ElasticNet是同时使用了系数向量的 l1 范数和 l2 范数的线性回归模型,使得可以学习得到类似于Lasso的一个稀疏模型,同时还保留了 Ridge 的正则化属性,结合了二者的优点,尤其适用于有多个...

    弹性网络回归

    弹性网络ElasticNet是同时使用了系数向量的 l1 范数和 l2 范数的线性回归模型,使得可以学习得到类似于Lasso的一个稀疏模型,同时还保留了 Ridge 的正则化属性,结合了二者的优点,尤其适用于有多个特征彼此相关的场合。
    

    主要参数说明

    alpha: a值。

    fit_intercept:一个布尔值,指定是否需要计算b值。如果为False,那么不计算b值(模型会认为你已经将数据中心化了)。

    max_iter:整数值,指定最大迭代次数。

    normalize:一个布尔值。如果为True,那么训练样本会在回归之前被归一化。

    copy_X:一个布尔值,如果为True,则会复制X值

    precompute:一个布尔值或者一个序列。他决定是否提前计算Gram矩阵来加速计算。

    tol:一个浮点数,指定判断迭代收敛与否的阈值。

    warm_start:一个布尔值,如为True,那么使用前一次训练结果继续训练。否则重头开始训练。

    positive:一个布尔值,如为Ture,那么强制要求全中响亮的分量都为整数。

    selection:一个字符串,可以为‘cyclic’(更新时候,从前向后一次选择权重向量的一个分量来更新)或者‘random’(随机选择权重向量的一个分量来更新),他指定了当每轮迭代的时候,选择权重向量的一个分量来更新

    random_state:一个整数或者一个RandomState实例,或者为None。如果为整数,则他指定了随机数生成器种子。如果为RandomState实例,则指定了随机数生成器。如果为None,则使用默认的随机数生成器。

    %config InteractiveShell.ast_node_interactivity = 'all'   #同时输出多行结果
    from sklearn.linear_model import ElasticNet
    reg = ElasticNet(alpha=1.0, l1_ratio=0.7)
    X = [[3], [8]]
    y = [1, 2]
    reg.fit(X, y)
    ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.7,
      max_iter=1000, normalize=False, positive=False, precompute=False,
      random_state=None, selection='cyclic', tol=0.0001, warm_start=False)   #参数含义和lasso和ridge类似
    reg.predict([[6]])
    reg.coef_
    reg.intercept_
    
    
    ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.7,
          max_iter=1000, normalize=False, positive=False, precompute=False,
          random_state=None, selection='cyclic', tol=0.0001, warm_start=False)
    
    
    ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.7,
          max_iter=1000, normalize=False, positive=False, precompute=False,
          random_state=None, selection='cyclic', tol=0.0001, warm_start=False)
    
    array([1.54198473])
    array([0.08396947])
    1.0381679389312977
    
    #修改参数比较结果
    reg = ElasticNet(alpha=1.0, l1_ratio=0.3)   # 修改参数,进行对比
    reg.fit(X, y)
    ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.3,
      max_iter=1000, normalize=False, positive=False, precompute=False,
      random_state=None, selection='cyclic', tol=0.0001, warm_start=False)
    reg.predict([[6]])
    reg.coef_
    reg.intercept_
    
    
    ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.3,
          max_iter=1000, normalize=False, positive=False, precompute=False,
          random_state=None, selection='cyclic', tol=0.0001, warm_start=False)
    
    ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.3,
          max_iter=1000, normalize=False, positive=False, precompute=False,
          random_state=None, selection='cyclic', tol=0.0001, warm_start=False)
    
    array([1.56834532])
    array([0.13669065])
    0.748201438848921
    
    #利用IRIS数据集进行弹性网络回归
    import pandas  as pd
    import numpy  as np
    from sklearn.datasets import load_iris
    from sklearn import linear_model
    from sklearn import metrics
    #导入IRIS数据集 
    iris = load_iris() 
     #特征矩阵 
    X=iris.data 
     #目标向量 
    y=iris.target
    from sklearn.cross_validation import train_test_split #导入数据划分包
    #以20%的数据构建测试样本,剩余作为训练样本
    X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.20,random_state =1)
    elastic= linear_model.ElasticNet(alpha=0.1,l1_ratio=0.5)  # 设置lambda值,l1_ratio值
    elastic.fit(X_train,y_train)  #使用训练数据进行参数求解
    y_hat2 = elastic.predict(X_test)  #对测试集的预测
    print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat2)))  #计算RMSE
    
    ElasticNet(alpha=0.1, copy_X=True, fit_intercept=True, l1_ratio=0.5,
          max_iter=1000, normalize=False, positive=False, precompute=False,
          random_state=None, selection='cyclic', tol=0.0001, warm_start=False)
    
    RMSE: 0.25040264500501913
    
    展开全文
  • 线性回归 算法简介 线性回归,就是利用数理统计中的回归分析,来确定两种或两种以上变量间,相互依赖的定量关系的一种统计分析方法。 线性回归试图学得: 求解w和b的关键在于衡量f(xi)与yi之间的差别.由于均方...
  •  主要介绍了线性回归模型,岭回归,lasso回归弹性网的基础理论。 线性回归模型  线性回归回归分析中最基本的一类回归问题,对于一般的线性回归模型来说,假设预测变量的个数为ppp,样本容量为NNN,则: {yi...
  • 回归模型目标函数 一、岭回归模型 1、介绍 Ridge/RidgeCV:使用结构风险最小化=损失函数(平方损失)+正则化(L2范数) Ridge 回归通过对系数的大小施加惩罚来解决 普通最小二乘法 的一些问题。 岭系数最小化的是...
  • 用TensorFlow实现弹性网络回归算法

    千次阅读 2018-02-24 17:03:25
    弹性网络回归算法(Elastic Net Regression)是综合lasso回归和岭回归的一种回归算法,通过在损失函数中增加L1和L2正则项。 本文使用多线性回归的方法实现弹性网络回归算法,以iris数据集为训练数据,用花瓣长度、...
  • 弹性网络回归的特点是在线性回归的损失函数上加上L1和L2正则化项。import matplotlib.pyplot as plt import numpy as np import tensorflow as tf from sklearn import datasets sess = tf.Session()iris = ...
  • 套索回归回归 回归分析是一种统计技术,可对因变量与一个或多个自变量之间的关系进行建模和近似。 本文将快速介绍三个使用R和Boston住房数据集的常用回归模型:Ridge,Lasso和Elastic Net。 首先,我们需要...
  • 机器学习3:岭回归 ~LASSO回归 ~弹性网 岭回归 原理 算法实现 手工实现 import numpy as np from numpy import genfromtxt import matplotlib.pyplot as plt # 读入数据 data = genfromtxt(r"longley.csv",...
  • 回归,Lasso回归弹性网络回归原理及R实现

    千次阅读 多人点赞 2020-10-24 09:53:48
    Table of Contents 收缩方法 岭回归 Lasso回归 弹性网络回归 加载R包 准备数据 计算惩戒线性回归 准备数据 R函数 计算岭回归 计算lasso回归 计算弹性网络回归 模型比较 收缩方法 岭回归回归缩小了回归系数,因此...
  • 一、弹性网络回归简介 要想理解弹性网络(Elastic Net)回归,正则化是必须要首先知道的,其次是岭回归和Lasso回归,知道了这些,弹性网络回归自然也就明白了。 1. 正则化 假设利用最小二乘法来做线性回归,最小...
  • 在一定条件下,它可以恢复一组非零权重的精确集 弹性网络 1、弹性网络 是一种使用 L1, L2 范数作为先验正则项训练的线性回归模型。 2、这种组合允许学习到一个只有少量参数是非零稀疏的模型,就像 Lasso 一样,...
  • 一、线性回归的变种:局部加权线性回归(本地散点平滑估计LOESS) 1.形式:一种非参数学习算法。局部加权线性回归中,针对每个要预测的样本点,我们都要对整个训练集进行一次拟合,因为我们要根据不同训练样本与...
  • LASSO回归 LASSO是由1996年Robert Tibshirani首次提出,该方法是一种压缩估计。与岭回归类似,LASSO也是通过构造一个惩罚函数得到一个性能更好的模型。相比于岭回归,LASSO更极端。它通过惩罚函数压缩回归系数,使得...
  • 弹性网络回归算法(Elastic Net Regression)综合了Lasso回归和岭回归,即损失函数同时包含了L1正则和L2正则. import matplotlib.pyplot as plt import numpy as np import tensorflow as tf from sklearn import ...
  • 弹性网络回归算法是综合lasso回归和岭回归的一种回归算法,通过在损失函数中增加L1正则和L2正则项,进而控制单个系数对结果的影响 import tensorflow as tf import numpy as np import matplotlib.pyplot as ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,939
精华内容 3,975
关键字:

弹性回归