文章目录

  • 前言
  • 一、机器学习算法(四)- 岭回归算法(Ridge Regression Algorithm)
    • 多重共线性
    • 算法步骤
      • L2范数:
    • 代码实现
  • 二、机器学习算法(五)- Lasso回归算法(Lasso Regression Algorithm)
    • 算法步骤
      • 坐标下降法(coordinate descent)
      • 最小角回归法(Least Angle Regression,LARS)
    • 代码实现
      • 坐标下降法
      • 最小角回归法
  • 总结

前言

This week, I only learned about the algorithms of machine learning and haven’t read the paper. Machine learning algorithms,the ridge regression algorithm and the Lasso regression algorithm,are about linear regression. This algorithm is used to solve multicollinearity problems。


一、机器学习算法(四)- 岭回归算法(Ridge Regression Algorithm)

上一周学习了机器学习算法中的标准线性回归算法和口袋算法。口袋算法很好的解决了分类问题,而标准线性回归算法也成功解决了部分回归问题,但紧接着人们又发现了新的问题:如果输入矩阵的不可逆的,或者说自变量x之间存在多重共线性,那么标准线性回归的代价函数就很难求得权重w了。
标准线性回归的代价函数的解析解 w 为:
w=(XT X)−1 XT y

于是在多个自变量 x 之间存在多重共线性的情况下,人们想出了另一种算法弥补这个缺陷-- 岭回归算法(Ridge Regression Algorithm)。

多重共线性

在学习岭回归算法之前,先了解一下多重共线性:

多重共线性(Multicollinearity)是指多变量线性回归中,变量之间由于存在精确相关关系或高度相关关系而使回归估计不准确。

结合例子分析:
精确相关关系:(1)式w1=2,w2=3,同时如果又存在(2)式的关系,这时就说明x1,x2存在精确相关关系。
高度相关关系: 当x1和x2,之间存在近似精确相关关系,例如x1约等于 2 倍的x2,则说明存在高度相关关系。

多重共线性的问题既然是自变量之间存在相关关系,其中一个解决方法就是剔除掉共线的自变量,可以通过计算方差扩大因子5(Variance inflation factor,VIF)来量化自变量之间的相关关系,方差扩大因子越大说明自变量的共线性越严重。

另一种方式是通过对代价函数正则化加入惩罚项来解决,其中一种正则化方式被称为吉洪诺夫正则化(Tikhonov regularization),这种代价函数正则化后的线性回归被称为岭回归(Ridge Regression)。

算法步骤

岭回归的代价函数第一项与标准线性回归的一致,都是欧几里得距离的平方和,只是在后面加上了一个 w 向量的 L2-范数 的平方作为惩罚项,其中 λ 表示惩罚项的系数,人为的控制惩罚项的大小。由于正则项是 L2-范数,有时这种正则化方式也被称为 L2 正则化。

L2范数:

假设X是n维的特征
X =(x1,x2,x3,······,xn


可以看到岭回归代价函数的解析解相较于标准线性回归来说多了一个可以人为控制的对角矩阵,这时可以通过调整不同的 λ 来使得括号内的矩阵可逆。

不够加了惩罚项后,相较于标准线性回归的结果,拟合变差了,但是通过人为的控制惩罚项的大小,解决了自变量多重共线性的问题。

代码实现

  1. 在数据集中随机生成一条划分线
  2. 判断该线的错误数量
  3. 临时更新错误的点的权重
  4. 新的划分线和旧的划分线比较,若新的错误点更少则永久更新权重,反之进入下一次循环
import numpy as npdef ridge(X, y, lambdas=0.1):"""岭回归args:X - 训练数据集y - 目标标签值lambdas - 惩罚项系数return:w - 权重系数"""return np.linalg.inv(X.T.dot(X) + lambdas * np.eye(X.shape[1])).dot(X.T).dot(y)

参考:文章

二、机器学习算法(五)- Lasso回归算法(Lasso Regression Algorithm)

解决多重共线性的一种方法是对代价函数正则化,其中一种正则化的算法叫岭回归算法(Ridge Regression Algorithm)。另一种正则化的算法 - Lasso回归算法1(Lasso Regression Algorithm),LASSO的完整名称叫最小绝对值收敛和选择算子算法(least absolute shrinkage and selection operator)。
岭回归的代价函数,在原来标准线性回归代价函数上加上了一个带惩罚系数 λ 的 w 向量的 L2-范数的平方:

Lasso回归算法也同岭回归一样加上了正则项,只是改成加上了一个带惩罚系数 λ 的 w 向量的 L1-范数作为惩罚项(L1-范数的含义为向量 w 每个元素绝对值的和),所以这种正则化方式也被称为L1正则化。

由于加入的是向量的 L1-范数,其中存在绝对值,导致其代价函数不是处处可导的,所以就没办法通过直接求导的方式来直接得到 w 的解析解。下面介绍两种求解权重系数 w 的方法:坐标下降法(coordinate descent)、最小角回归法(Least Angle Regression,LARS)

算法步骤

坐标下降法(coordinate descent)和最小角回归法(Least Angle Regression,LARS)

坐标下降法(coordinate descent)

文字表达:
坐标下降法的核心与它的名称一样,就是沿着某一个坐标轴方向,通过一次一次的迭代更新权重系数的值,来渐渐逼近最优解。
(1)初始化权重系数 w,例如初始化为零向量。
(2)遍历所有权重系数,依次将其中一个权重系数当作变量,其他权重系数固定为上一次计算的结果当作常量,求出当前条件下只有一个权重系数变量的情况下的最优解。
(3)步骤(2)为一次完整迭代,当所有权重系数的变化不大或者到达最大迭代次数时,结束迭代。

举例子:

每次迭代固定其他的权重系数,只朝着其中一个坐标轴的方向更新,最后到达最优解。

最小角回归法(Least Angle Regression,LARS)

最小角回归算法(Least Angle Regression,LAR)是一种针对于线性回归问题,快速进行特征选择和回归系数计算的迭代算法,其被广泛推广用于求解线性回归以及Lasso回归问题。
最小角回归算法的核心思想为:将回归目标向量依次分解为若干组特征向量的线性组合,最终使得与所有特征均线性无关的残差向量最小。

在学习最小角回归法之前还有两个算法:前向选择算法 和 前向梯度算法。
感兴趣可以自行学习,不影响直接学习 最小角回归法,学习文章:算法文章

最小角回归法是一种特征选择的方法,计算出每个特征的相关性,通过数学公式逐渐计算出最优解。
文字表达:
(1)初始化权重系数 w,例如初始化为零向量。
(2)初始化残差向量 residual 为目标标签向量 y − Xw,由于此时 w 为零向量,所以残差向量等于目标标签向量 y
(3)选择一个与残差向量相关性最大的特征向量 xi,沿着特征向量 xi的方向找到一组权重系数 w,出现另一个与残差向量相关性最大的特征向量 xj 使得新的残差向量 residual 与这两个特征向量的相关性相等(即残差向量等于这两个特征向量的角平分向量上),重新计算残差向量。
(4)重复步骤(3),继续找到一组权重系数 w,使得第三个与残差向量相关性最大的特征向量 xk 使得新的残差向量 residual 与这三个特征向量的相关性相等(即残差向量等于这三个特征向量的等角向量上),以此类推。
(5)当残差向量 residual 足够小或者所有特征向量都已被选择,结束迭代。

举例子:


注意:这里是只有两个变量,所以x1结束之后就x2的权重系数,但实际上是求另一个与残差向量相关性最大的特征向量 xj ,倘若有x3比x2 的残差向量相关性更大,则下一步就先求x3的权重系数。

代码实现

坐标下降法

使用 Python 实现Lasso回归算法(坐标下降法):
注:本实现未考虑偏移量 b ,需要对特征进行归一化处理

def lassoUseCd(X, y, lambdas=0.1, max_iter=1000, tol=1e-4):"""Lasso回归,使用坐标下降法(coordinate descent)args:X - 训练数据集y - 目标标签值lambdas - 惩罚项系数max_iter - 最大迭代次数tol - 变化量容忍值return:w - 权重系数"""# 初始化 w 为零向量w = np.zeros(X.shape[1])for it in range(max_iter):done = True# 遍历所有自变量for i in range(0, len(w)):# 记录上一轮系数weight = w[i]# 求出当前条件下的最佳系数w[i] = down(X, y, w, i, lambdas)# 当其中一个系数变化量未到达其容忍值,继续循环if (np.abs(weight - w[i]) > tol):done = False# 所有系数都变化不大时,结束循环if (done):breakreturn wdef down(X, y, w, index, lambdas=0.1):"""cost(w) = (x1 * w1 + x2 * w2 + ... - y)^2 + ... + λ(|w1| + |w2| + ...)假设 w1 是变量,这时其他的值均为常数,带入上式后,其代价函数是关于 w1 的一元二次函数,可以写成下式:cost(w1) = (a * w1 + b)^2 + ... + λ|w1| + c (a,b,c,λ 均为常数)=> 展开后cost(w1) = aa * w1^2 + 2ab * w1 + λ|w1| + c (aa,ab,c,λ 均为常数)"""# 展开后的二次项的系数之和aa = 0# 展开后的一次项的系数之和ab = 0for i in range(X.shape[0]):# 括号内一次项的系数a = X[i][index]# 括号内常数项的系数b = X[i][:].dot(w) - a * w[index] - y[i]# 可以很容易的得到展开后的二次项的系数为括号内一次项的系数平方的和aa = aa + a * a# 可以很容易的得到展开后的一次项的系数为括号内一次项的系数乘以括号内常数项的和ab = ab + a * b# 由于是一元二次函数,当导数为零时,函数值最小值,只需要关注二次项系数、一次项系数和 λreturn det(aa, ab, lambdas)def det(aa, ab, lambdas=0.1):"""通过代价函数的导数求 w,当 w = 0 时,不可导det(w) = 2aa * w + 2ab + λ = 0 (w > 0)=> w = - (2 * ab + λ) / (2 * aa)det(w) = 2aa * w + 2ab - λ = 0 (w < 0)=> w = - (2 * ab - λ) / (2 * aa)det(w) = NaN (w = 0)=> w = 0"""w = - (2 * ab + lambdas) / (2 * aa)if w < 0:w = - (2 * ab - lambdas) / (2 * aa)if w > 0:w = 0return w

最小角回归法

使用 Python 实现Lasso回归算法(最小角回归法):

def lassoUseLars(X, y, lambdas=0.1, max_iter=1000):"""Lasso回归,使用最小角回归法(Least Angle Regression)论文:https://web.stanford.edu/~hastie/Papers/LARS/LeastAngle_2002.pdfargs:X - 训练数据集y - 目标标签值lambdas - 惩罚项系数max_iter - 最大迭代次数return:w - 权重系数"""n, m = X.shape# 已被选择的特征下标active_set = set()# 当前预测向量cur_pred = np.zeros((n,), dtype=np.float32)# 残差向量residual = y - cur_pred# 特征向量与残差向量的点积,即相关性cur_corr = X.T.dot(residual)# 选取相关性最大的下标j = np.argmax(np.abs(cur_corr), 0)# 将下标添加至已被选择的特征下标集合active_set.add(j)# 初始化权重系数w = np.zeros((m,), dtype=np.float32)# 记录上一次的权重系数prev_w = np.zeros((m,), dtype=np.float32)# 记录特征更新方向sign = np.zeros((m,), dtype=np.int32)sign[j] = 1# 平均相关性lambda_hat = None# 记录上一次平均相关性prev_lambda_hat = Nonefor it in range(max_iter):# 计算残差向量residual = y - cur_pred# 特征向量与残差向量的点积cur_corr = X.T.dot(residual)# 当前相关性最大值largest_abs_correlation = np.abs(cur_corr).max()# 计算当前平均相关性lambda_hat = largest_abs_correlation / n# 当平均相关性小于λ时,提前结束迭代# https://github.com/scikit-learn/scikit-learn/blob/2beed55847ee70d363bdbfe14ee4401438fba057/sklearn/linear_model/_least_angle.py#L542if lambda_hat <= lambdas:if (it > 0 and lambda_hat != lambdas):ss = ((prev_lambda_hat - lambdas) / (prev_lambda_hat - lambda_hat))# 重新计算权重系数w[:] = prev_w + ss * (w - prev_w)break# 更新上一次平均相关性prev_lambda_hat = lambda_hat# 当全部特征都被选择,结束迭代if len(active_set) > m:break# 选中的特征向量X_a = X[:, list(active_set)]# 论文中 X_a 的计算公式 - (2.4)X_a *= sign[list(active_set)]# 论文中 G_a 的计算公式 - (2.5)G_a = X_a.T.dot(X_a)G_a_inv = np.linalg.inv(G_a)G_a_inv_red_cols = np.sum(G_a_inv, 1)     # 论文中 A_a 的计算公式 - (2.5)A_a = 1 / np.sqrt(np.sum(G_a_inv_red_cols))# 论文中 ω 的计算公式 - (2.6)omega = A_a * G_a_inv_red_cols# 论文中角平分向量的计算公式 - (2.6)equiangular = X_a.dot(omega)# 论文中 a 的计算公式 - (2.11)cos_angle = X.T.dot(equiangular)# 论文中的 γgamma = None# 下一个选择的特征下标next_j = None# 下一个特征的方向next_sign = 0for j in range(m):if j in active_set:continue# 论文中 γ 的计算方法 - (2.13)v0 = (largest_abs_correlation - cur_corr[j]) / (A_a - cos_angle[j]).item()v1 = (largest_abs_correlation + cur_corr[j]) / (A_a + cos_angle[j]).item()if v0 > 0 and (gamma is None or v0 < gamma):gamma = v0next_j = jnext_sign = 1if v1 > 0 and (gamma is None or v1 < gamma):gamma = v1next_j = jnext_sign = -1if gamma is None:# 论文中 γ 的计算方法 - (2.21)gamma = largest_abs_correlation / A_a# 选中的特征向量sa = X_a# 角平分向量sb = equiangular * gamma# 解线性方程(sa * sx = sb)sx = np.linalg.lstsq(sa, sb)# 记录上一次的权重系数prev_w = w.copy()d_hat = np.zeros((m,), dtype=np.int32)for i, j in enumerate(active_set):# 更新当前的权重系数w[j] += sx[0][i] * sign[j]# 论文中 d_hat 的计算方法 - (3.3)d_hat[j] = omega[i] * sign[j]# 论文中 γ_j 的计算方法 - (3.4)gamma_hat = -w / d_hat# 论文中 γ_hat 的计算方法 - (3.5)gamma_hat_min = float("+inf")# 论文中 γ_hat 的下标gamma_hat_min_idx = Nonefor i, j in enumerate(gamma_hat):if j <= 0:continueif gamma_hat_min > j:gamma_hat_min = jgamma_hat_min_idx = iif gamma_hat_min < gamma:# 更新当前预测向量 - (3.6)cur_pred = cur_pred + gamma_hat_min * equiangular# 将下标移除至已被选择的特征下标集合active_set.remove(gamma_hat_min_idx)# 更新特征更新方向集合sign[gamma_hat_min_idx] = 0else:# 更新当前预测向量cur_pred = X.dot(w)# 将下标添加至已被选择的特征下标集合active_set.add(next_j)# 更新特征更新方向集合sign[next_j] = next_signreturn w

总结

由于考试紧张,没有阅读论文,下次会积极学习论文。本周学习了处理自变量x之间存在多重共线性的线性回归问题,使用正则化方法: 岭回归算法(Ridge Regression Algorithm)和 Lasso回归算法(Lasso Regression Algorithm)。其共同点都是在标准线性回归方程的后面加入了范数(L1-范数 和 L2-范数)。下周将继续学习新的机器学习的算法。

2023.3.5 第十六次周报相关推荐

  1. 2022.10.16 第二十六次周报

    目录 前言 文献阅读-<基于卷积神经网络的手语静态手势识别及基于ORB描述符和Gabor滤波器的特征提取方法> 核心思路 主要操作 1.预处理 2.特征提取 3.结构的架构 工程-CNN内 ...

  2. 第十六周学习周报(20180618-20180624)

    第十六周学习周报 一.本周学习情况 1.本周主要学习李宏毅老师的机器学习课程 Unsupervised Learning-Linear Methods Unsupervised Learning-Ne ...

  3. 研究生周报(第十六周)

    研究生周报(第十六周) 学习目标 语音与语言处理--机器翻译和编码器解码器模型 语音与语言处理--成分语法 语音与语言处理--成分解析 语音与语言处理--依存解析 Scala基本语法和简单使用 地址项 ...

  4. Shell脚本学习-阶段二十六-Web服务与端口

    文章目录-Shell阶段二十六-端口与服务对照表 前言 端口与Web服务对照表 简介 前言 端口与Web服务对照表 2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口: ...

  5. 第十六届中国大数据技术大会五大分论坛顺利举办!

    1月8日下午,由苏州市人民政府指导.中国计算机学会主办.苏州市吴江区人民政府支持,CCF大数据专家委员会.苏州市吴江区工信局.吴江区东太湖度假区管委会.苏州市吴江区科技局.苏州大学未来科学与工程学院及 ...

  6. 第十六节 springboot 打包vue代码实现前后端统一部署

    svbadmin学习日志 本学习日志是使用Springboot和Vue来搭建的后台管理系统: 演示地址:http://118.31.68.110:8081/index.html 账号:root 密码: ...

  7. 庚子年十月十六——十月廿二

    庚子年十月十六--十月廿二 安全组--电信2002姜毅 2020.11.30--2020.12.6 文章目录 庚子年十月十六--十月廿二 本周任务 一.Web基础 5.Web服务器 6.对上一周htt ...

  8. 美学心得(第二百四十六集) 罗国正

    美学心得(第二百四十六集) 罗国正 (2023年3月) 3046.清朝画家董棨,是浙江秀水(今浙江嘉兴市)人.他的主要美学观点如下: 1.绘画可把"家贫境苦"变得"陶然自 ...

  9. 2021年大数据HBase(十六):HBase的协处理器(Coprocessor)

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 HBase的协处理器(Coprocessor) 一.起源 二 ...

最新文章

  1. Be Close To The Real World
  2. 处理时间_7_60个Mysql日期时间函数汇总
  3. HBase基础和伪分布式安装配置
  4. 网页错误排查 如何?
  5. LINUX访问WINDOWS网络共享目录
  6. 写好PPT的四大要点
  7. 【区块链】量子链命令行qtum-cli全命令详解
  8. 对linux信号量的理解以及实现
  9. QQ浏览器,正式推出,9.0版本又多些好东西!
  10. Pyecharts直角坐标系图:象形柱状图 PictorialBar
  11. c语言编程马克思手稿 百例,清华大学出版社-图书详情-《C语言趣味编程100例》...
  12. 网页嵌入谷歌翻译js插件
  13. 任天堂被黑了!早期游戏源码及设计图大批曝光,原来塞尔达传说还有个血腥版本?
  14. Python 唤起QQ对话框 QQ客服效果
  15. el-tree 关键字搜索
  16. 官方出品!手把手教你在华为HMS平台开发App
  17. 罗德里格旋转和李群、李代数的指数映射的关系
  18. vscode背景图片设置分享
  19. 学习区块链(一)--我为什么要学习区块链?
  20. 如何在Windows 10 上安装SQL Server 2000数据库?

热门文章

  1. memcached 详聊
  2. 在Python中编写动态SQL语句
  3. 变电所计算机监控系统设计技术规程,《59.DL5149-2016 220-500kV变电所计算机监控系统设计技术规程》.pdf...
  4. 2023全新FL Studio 21中文版水果编曲制作软件下载安装教程
  5. (三层架构入门)最基本的三层架构搭建方法(详细过程及所有代码)
  6. 同时使用jsp与thyme leaf
  7. Java基础之设计模式七大原则
  8. React中的“计算属性”
  9. springboot微信公众号开发者配置 token验证失败和参数错误
  10. 【我的第一份开发工作】1.找工作前的经历