python实现次梯度(subgradient)和近端梯度下降法 (proximal gradient descent)方法求解L1正则化
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正则化相关推荐
- 近端梯度下降法 (proximal gradient descent)
本文参考了知乎的文章 机器学习 | 近端梯度下降法 (proximal gradient descent), 写的非常棒,但感觉有些微的赘余, 因此以这篇博客,希望更精简地介绍 近端梯度下降法 这种略 ...
- LASSO近端梯度下降法Proximal Gradient Descent公式推导及代码
文章目录 LASSO by Proximal Gradient Descent Proximal Gradient Descent Framework近端梯度下降算法框架 Proximal Gradi ...
- 【优化】近端梯度下降(Proximal Gradient Descent)求解Lasso线性回归问题
文章目录 近端梯度下降的背景 常见线性回归问题 近端算子(Proximal Operator) 近端梯度下降迭代递推方法 以Lasso线性回归问题为例 参考资料 近端梯度下降的背景 近端梯度下降(Pr ...
- ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)
引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归.逻辑回归.Softmax回归.神经网络和SVM等等,主要学习资料来自网上的免费课程和一些经典书籍,免费课 ...
- [机器学习] ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)
本文转自:https://blog.csdn.net/walilk/article/details/50978864 引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记, ...
- 近端梯度法(Proximal Gradient Descent)
总目录 一. 凸优化基础(Convex Optimization basics) 凸优化基础(Convex Optimization basics) 二. 一阶梯度方法(First-order met ...
- 50行代码,带你理解梯度下降法(Gradient Descent Method)
梯度下降法是一种常见的优化算法,在机器学习中应用很广泛.本文从代码的角度,带你理解梯度下降法. 优化算法 优化指的是改变x以最小化或最大化某个函数 f(x) 的任务.通常以最小化 f(x) 指代大多数 ...
- CNN的Python实现——第五章:梯度下降法的最优化方法
第二部分 优化篇 文章目录 第二部分 优化篇 第5章 基于梯度下降法的最优化方法 5.1 随机梯度下降法SGD 5.2 基本动量法 5.3 Nesterov动量法 5.4 AdaGrad 5.5 RM ...
- 机器学习数学知识补习——梯度下降(Gradient Descent)
导数 导数与微分: 图中的Δy.dy等符号的意义及关系如下: Δx:x的变化量: dx:x的变化量 Δ x Δx Δx趋于0时,则记作微元 d x dx dx: Δy: Δ y = f ( x 0 + ...
最新文章
- ZABBIX 企业级分布式监控系统 1 监控系统简介
- php如何写回调函数,php – 如何使用类方法作为回调函数?
- jzoj4051-序列统计【NTT】
- 工作392-选择Hbuilder x导入项目
- 论文浅尝 | 基于局内去噪和迁移学习的关系抽取
- python 倒排索引(Inverted Index)
- 腾讯推出基于区块链存证的“点亮莫高窟”活动
- 在CentOS7上实现NFS共享
- Ubuntu Make新版上线:支持安装Swift编程语言
- HDU 1712 ACboy needs your help(简单分组DP)
- Flutter之ScrollView简析
- jQuery使table表格隔行显示不同颜色
- java 获取当前文件的路径+文件全名
- Nginx的configure各项中文说明
- 虚拟机安装MySQL教程
- 电视剧《乡村爱情2》之演员表(ZT)
- 城市场景车路协同网络该怎么建?
- 程序员,别太把技术入股当做一回事
- Java导出excel文件以.xlsx后缀结尾,可设置部分单元格只读
- 计算机无法连接网络错误651,651错误代码,详细教您宽带连接提示错误651怎么办...
热门文章
- 04 TCP/IP协议详解
- 全国大学生英语竞赛考题总结
- 【C++】-命名空间的概念及使用
- python3.7反编译生成的.exe
- python3分解质因数_Python 质因数分解的研究
- Jackknife,Bootstrap, Bagging, Boosting, AdaBoost, RandomForest 和 Gradient Boosting的区别
- Spring Cloud升级之路 - Hoxton - 10. 网关重试带Body的请求Body丢失的问题
- matplotlib中箱线图、极线图、阶梯图的绘制
- Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
- 3dmax渲染大图有斑点怎么办?