l1范数最小化

考虑函数,显然其在零点不可微,其对应的的次微分为:

注意的取值为一个区间

两个重要定理:

1)一个凸函数,当且仅当为全局最小值,即 为最小值点  

2)为函数不一定是凸函数)的最小值点,当且仅当在该点可次微分且

考虑最简单的一种情况,目标函数为:

对应的次微分为:

进一步可以表示为:

故,若,最小值点为:

,最小值点为:

, 最小值点为:

简而言之,最优解通常被称为软阈值(soft threshold)算子

次梯度(subgradient)求解L1正则化问题

考虑最小化问题:

随机生成矩阵和向量,仅为已知量,为参数。

那么次梯度为:

对于次梯度求解方法,次梯度可以进一步表示为:

进一步,可以得到次梯度的更新公式为:

python代码如下:

# -*- coding: utf-8 -*-import numpy as np
import scipy as spy
from scipy.sparse import csc_matrix
import matplotlib.pyplot as plt
import time   #用来计算运行时间#=======模拟数据======================m = 512
n = 1024#稀疏矩阵的产生,A使用的是正态稀疏矩阵
u= spy.sparse.rand(n,1,density=0.1,format='csc',dtype=None)
u1 = u.nonzero()
row = u1[0]
col = u1[1]
data = np.random.randn(int(0.1*n))
u = csc_matrix((data, (row, col)), shape=(n,1)).toarray() #1024 * 1#u1 = u.nonzero()        #观察是否是正态分布
#plt.hist(u[u1[0],u1[1]].tolist())#u = u.todense()  #转为非稀疏形式a = np.random.randn(m,n) #512 * 1024
b = np.dot(a,u) # a * u, 512 * 1
v = 1e-3      #v为题目里面的miudef f(x0):    #目标函数 1/2*||Ax - b||^2 + mu*||x||1return 1/2*np.dot((np.dot(a,x0)-b).T,np.dot(a,x0)-b)+v*sum(abs(x0))#==========初始值=============================
x0 = np.zeros((n,1)) #1024 * 1y = []
time1 = []start = time.clock()
print("begin to train!")
#=========开始迭代==========================
for i in range(1000):if i %100 == 0:if len(y) > 0:print("step " + str(i) + "val: " + str(y[len(y) - 1]))mid_result = f(x0) y.append(f(x0)[0,0])    #存放每次的迭代函数值g0 = (np.dot(np.dot(a.T,a),x0)-np.dot(a.T,b) + v*np.sign(x0)) #次梯度, A^T(Ax - b) + mu * sign(x)t = 0.01/np.sqrt(sum(np.dot(g0.T,g0)))    #设为0.01效果比0.1好很多,步长x1 = x0 - t[0]*g0  x0 = x1end = time.clock()time1.append(end)y = np.array(y).reshape((1000,1))    time1 = np.array(time1)
time1 = time1 - start
time2 = time1[np.where(y - y[999] < 10e-4)[0][0]]plt.plot(y)
plt.show()
for val in y:print(val)#    if i % 100 == 0:
#        f = 1/2*np.dot((np.dot(a,x0)-b).T,np.dot(a,x0)-b)+v*sum(abs(x0))
#        print(f)#在计算机计算时,可以明显感受到proximal gradient方法比次梯度方法快

结果如下:

前几个参数值:

可以看到参数具有稀疏性。

近端梯度下降法 (proximal gradient descent)方法求解L1正则化

proximal gradient算法推导

对于梯度下降的每一步,可以看做是一个平方模型的局部最小化:

其中,为合适的步长,那么,同理对于有L1正则项的情况,上式变为:

考虑前面介绍的soft threshold,利用soft threshold的方法,我们可以马上得到最优解:

对与上面的例子,我们可以得到基于此方法的梯度更新公式为:

这就是通常所说的Iterative Shrinkage Thresholding Algorithm (ISTA)算法,与subgradient算法相比,由于soft threshold的限制,使得参数的稀疏性更强

相应的python代码为:

# -*- coding: utf-8 -*-import numpy as np
import scipy as spy
from scipy.sparse import csc_matrix
import matplotlib.pyplot as plt
import time   #用来计算运行时间#=======模拟数据======================m = 512
n = 1024#稀疏矩阵的产生,A使用的是正态稀疏矩阵
u= spy.sparse.rand(n,1,density=0.1,format='csc',dtype=None)
u1 = u.nonzero()
row = u1[0]
col = u1[1]
data = np.random.randn(int(0.1*n))
u = csc_matrix((data, (row, col)), shape=(n,1)).toarray() #1024 * 1#u1 = u.nonzero()        #观察是否是正态分布
#plt.hist(u[u1[0],u1[1]].tolist())#u = u.todense()  #转为非稀疏形式a = np.random.randn(m,n) #512 * 1024
b = np.dot(a,u) # a * u, 512 * 1
v = 1e-3      #v为题目里面的miudef f(x0):    #目标函数 1/2*||Ax - b||^2 + mu*||x||1return 1/2*np.dot((np.dot(a,x0)-b).T,np.dot(a,x0)-b)+v*sum(abs(x0))def S(x1,v):for i in range(len(x1)):if np.abs(x1[i]) - v > 0:x1[i] = np.sign(x1[i]) * (np.abs(x1[i]) - v)else:x1[i] = 0return x1#==========初始值=============================
#x0 = np.zeros((n,1)) #1024 * 1
x0 = (2.0*np.random.random((n,1)) - 1.0) * 0.01y = []
time1 = []start = time.clock()
print("begin to train!")
#=========开始迭代==========================
for i in range(2000):if i %10 == 0:if len(y) > 0:print("step " + str(i) + "val: " + str(y[len(y) - 1]))mid_result = f(x0) y.append(f(x0)[0,0])    #存放每次的迭代函数值#g0 = (np.dot(np.dot(a.T,a),x0)-np.dot(a.T,b) + v*np.sign(x0)) #次梯度, A^T(Ax - b) + mu * sign(x)g0 = np.dot(np.dot(a.T,a),x0)-np.dot(a.T,b)t = 0.025/np.sqrt(sum(np.dot(g0.T,g0)))    #设为0.01效果比0.1好很多,步长   x1 = S(x0 - t[0]*g0, v)  x0 = x1end = time.clock()time1.append(end)y = np.array(y).reshape((2000,1))    time1 = np.array(time1)
time1 = time1 - start
time2 = time1[np.where(y - y[999] < 10e-4)[0][0]]plt.plot(y)
plt.show()
for val in y:print(val)#    if i % 100 == 0:
#        f = 1/2*np.dot((np.dot(a,x0)-b).T,np.dot(a,x0)-b)+v*sum(abs(x0))
#        print(f)#在计算机计算时,可以明显感受到proximal gradient方法比次梯度方法快

前几个参数如下:

显然与基础次梯度算法相比,此方法稀疏性明显更好。

python实现次梯度(subgradient)和近端梯度下降法 (proximal gradient descent)方法求解L1正则化相关推荐

  1. 近端梯度下降法 (proximal gradient descent)

    本文参考了知乎的文章 机器学习 | 近端梯度下降法 (proximal gradient descent), 写的非常棒,但感觉有些微的赘余, 因此以这篇博客,希望更精简地介绍 近端梯度下降法 这种略 ...

  2. LASSO近端梯度下降法Proximal Gradient Descent公式推导及代码

    文章目录 LASSO by Proximal Gradient Descent Proximal Gradient Descent Framework近端梯度下降算法框架 Proximal Gradi ...

  3. 【优化】近端梯度下降(Proximal Gradient Descent)求解Lasso线性回归问题

    文章目录 近端梯度下降的背景 常见线性回归问题 近端算子(Proximal Operator) 近端梯度下降迭代递推方法 以Lasso线性回归问题为例 参考资料 近端梯度下降的背景 近端梯度下降(Pr ...

  4. ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)

    引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归.逻辑回归.Softmax回归.神经网络和SVM等等,主要学习资料来自网上的免费课程和一些经典书籍,免费课 ...

  5. [机器学习] ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)

    本文转自:https://blog.csdn.net/walilk/article/details/50978864 引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记, ...

  6. 近端梯度法(Proximal Gradient Descent)

    总目录 一. 凸优化基础(Convex Optimization basics) 凸优化基础(Convex Optimization basics) 二. 一阶梯度方法(First-order met ...

  7. 50行代码,带你理解梯度下降法(Gradient Descent Method)

    梯度下降法是一种常见的优化算法,在机器学习中应用很广泛.本文从代码的角度,带你理解梯度下降法. 优化算法 优化指的是改变x以最小化或最大化某个函数 f(x) 的任务.通常以最小化 f(x) 指代大多数 ...

  8. CNN的Python实现——第五章:梯度下降法的最优化方法

    第二部分 优化篇 文章目录 第二部分 优化篇 第5章 基于梯度下降法的最优化方法 5.1 随机梯度下降法SGD 5.2 基本动量法 5.3 Nesterov动量法 5.4 AdaGrad 5.5 RM ...

  9. 机器学习数学知识补习——梯度下降(Gradient Descent)

    导数 导数与微分: 图中的Δy.dy等符号的意义及关系如下: Δx:x的变化量: dx:x的变化量 Δ x Δx Δx趋于0时,则记作微元 d x dx dx: Δy: Δ y = f ( x 0 + ...

最新文章

  1. ZABBIX 企业级分布式监控系统 1 监控系统简介
  2. php如何写回调函数,php – 如何使用类方法作为回调函数?
  3. jzoj4051-序列统计【NTT】
  4. 工作392-选择Hbuilder x导入项目
  5. 论文浅尝 | 基于局内去噪和迁移学习的关系抽取
  6. python 倒排索引(Inverted Index)
  7. 腾讯推出基于区块链存证的“点亮莫高窟”活动
  8. 在CentOS7上实现NFS共享
  9. Ubuntu Make新版上线:支持安装Swift编程语言
  10. HDU 1712 ACboy needs your help(简单分组DP)
  11. Flutter之ScrollView简析
  12. jQuery使table表格隔行显示不同颜色
  13. java 获取当前文件的路径+文件全名
  14. Nginx的configure各项中文说明
  15. 虚拟机安装MySQL教程
  16. 电视剧《乡村爱情2》之演员表(ZT)
  17. 城市场景车路协同网络该怎么建?
  18. 程序员,别太把技术入股当做一回事
  19. Java导出excel文件以.xlsx后缀结尾,可设置部分单元格只读
  20. 计算机无法连接网络错误651,651错误代码,详细教您宽带连接提示错误651怎么办...

热门文章

  1. 04 TCP/IP协议详解
  2. 全国大学生英语竞赛考题总结
  3. 【C++】-命名空间的概念及使用
  4. python3.7反编译生成的.exe
  5. python3分解质因数_Python 质因数分解的研究
  6. Jackknife,Bootstrap, Bagging, Boosting, AdaBoost, RandomForest 和 Gradient Boosting的区别
  7. Spring Cloud升级之路 - Hoxton - 10. 网关重试带Body的请求Body丢失的问题
  8. matplotlib中箱线图、极线图、阶梯图的绘制
  9. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
  10. 3dmax渲染大图有斑点怎么办?