算法设计与智能计算 || 专题六: 不可导凸函数的最优解搜索问题

news2024/11/29 6:39:08

不可导凸函数的最优解搜索问题

文章目录

  • 不可导凸函数的最优解搜索问题
    • 1. 次梯度下降方法
      • 1.1 基于次梯度的 Lasso 回归求解
      • 1.2 次梯度求解 Lasso 算法
      • 1.3 编程实现
    • 2. 软阈值方法
      • 2.1 软阈值求解Lasso回归

1. 次梯度下降方法

如目标函数包含不可微分的部分,形如
E ( w ) = 1 N ∥ y − y ^ ( w ) ∥ 2 2 + λ ⋅ ∥ w ∥ 1 E(\boldsymbol{w})=\frac{1}{N}\Big\Vert\boldsymbol{y-\hat{y}(\boldsymbol{w})}\Big\Vert_2^2+\lambda\cdot \Big\Vert\boldsymbol{w}\Big\Vert_1 E(w)=N1 yy^(w) 22+λ w 1

其最优解则无法使用经典的梯度下降法进行求解。我们需要引入次梯度的概念

次梯度:设 F : R n → R F:\mathbb{R}^n\to\mathbb{R} F:RnR 为一个 n n n元函数,如果 g , w ∈ R n \boldsymbol{g},\boldsymbol{w}\in\mathbb{R}^n g,wRn 满足如下性质:
F ( u ) ≥ F ( w ) + ⟨ g , u − w ⟩        ∀ u ∈ R n F(\boldsymbol{u})\ge F(\boldsymbol{w})+\lang\boldsymbol{g},\boldsymbol{u}-\boldsymbol{w}\rang\;\;\; \forall \boldsymbol{u}\in\mathbb{R}^n F(u)F(w)+g,uwuRn
则称 g \boldsymbol{g} g F F F 在 $ w \boldsymbol{w} w 处的次梯度。称集合 ∂ F ( u ) = { g ∈ R n : g 为 F 在 w 处的次梯度 } \partial F(\boldsymbol{u})=\{\boldsymbol{g}\in\mathbb{R}^n:\boldsymbol{g}为F在\boldsymbol{w}处的次梯度\} F(u)={gRn:gFw处的次梯度} F F F w \boldsymbol{w} w 处的次梯度.

:求目标函数 F ( w ) = ∥ w ∥ 1 F(\boldsymbol{w})=\Vert \boldsymbol{w}\Vert_1 F(w)=w1 的次梯度。
:由于 F ( w ) = ∥ w ∥ 1 = ∣ x 1 ∣ + ∣ x 2 ∣ + ⋯ + ∣ x d ∣ F(\boldsymbol{w})=\Vert \boldsymbol{w}\Vert_1=\vert x_1\vert+\vert x_2\vert+\cdots+\vert x_d\vert F(w)=w1=x1+x2++xd,对任意的分量 F ( w ) = ∣ w ∣ F(w)=\vert w\vert F(w)=w, 则有
F ( u ) ≥ F ( 0 ) + g ⋅ ( u − 0 ) F(u)\geq F(0) + g\cdot(u-0) F(u)F(0)+g(u0)

∣ u ∣ ≥ ∣ 0 ∣ + g ⋅ ( u − 0 ) \vert u\vert\geq\vert 0\vert+g\cdot(u-0) u∣0∣+g(u0)

− 1 ≤ g ≤ 1 -1 \leq g\leq 1 1g1
综上
∂ F ( w ) = { − 1 x < 0 [ − 1 , 1 ] x = 0 1 x > 0 \partial F(w)=\left\{ \begin{aligned} -1 \quad x<0\\ [-1,1] \quad x=0\\ 1 \quad x>0\\ \end{aligned} \right. F(w)= 1x<0[1,1]x=01x>0

注意:由于次梯度是一个集合,编程实现时我们只需要取其中一个值即可。
∂ ∥ w ∥ 1 = s i g n ( w ) = { − 1 w < 0 0 w = 0 1 w > 0 \partial\Vert \boldsymbol{w}\Vert_1 =sign(\boldsymbol{w})=\left\{ \begin{aligned} \boldsymbol{-1} \quad \boldsymbol{w}<\boldsymbol{0}\\ \boldsymbol{0} \quad \boldsymbol{w}=\boldsymbol{0}\\ \boldsymbol{1} \quad \boldsymbol{w}>\boldsymbol{0}\\ \end{aligned} \right. w1=sign(w)= 1w<00w=01w>0

1.1 基于次梯度的 Lasso 回归求解

Lasso 回归的目标函数为

F ( w ) = 1 n ∥ X w − y ∥ 2 2 + λ ⋅ ∥ w ∥ 1 F(\boldsymbol{w})=\frac{1}{n}\Big\Vert\boldsymbol{Xw-y}\Big\Vert_2^2+\lambda\cdot \Big\Vert\boldsymbol{w}\Big\Vert_1 F(w)=n1 Xwy 22+λ w 1

次梯度为

2 n X ⊤ ( X w − y ) + λ ⋅ sign ( w ) ∈ ∂ F ( w ) \frac{2}{n}\boldsymbol{X}^\top\Big(\boldsymbol{Xw-y}\Big)+\lambda\cdot \text{sign}(\boldsymbol{w})\in\partial F(\boldsymbol{w}) n2X(Xwy)+λsign(w)F(w)

其中

sign ( w ) = { − 1 w < 0 0 w = 0 1 w > 0 \text{sign}(\boldsymbol{w})=\left\{ \begin{aligned} \boldsymbol{-1} \quad \boldsymbol{w}<\boldsymbol{0}\\ \boldsymbol{0} \quad \boldsymbol{w}=\boldsymbol{0}\\ \boldsymbol{1} \quad \boldsymbol{w}>\boldsymbol{0}\\ \end{aligned} \right. sign(w)= 1w<00w=01w>0

1.2 次梯度求解 Lasso 算法

算法 1: 基于次梯度的lasso回归算法
输入: X X X, y \boldsymbol{y} y
1:      \;\; w = 0 \boldsymbol{w}=\boldsymbol{0} w=0
2:      \;\; for t = 1 , 2 , ⋯   , N t=1,2,\cdots,N t=1,2,,N
3: e = 2 X T ( X w − y ) / n + s i g n ( w ) \qquad \boldsymbol{e}=2X^T(X\boldsymbol{w}-\boldsymbol{y})/n+sign(\boldsymbol{w}) e=2XT(Xwy)/n+sign(w) ;
4: w = w − α ⋅ e \qquad \boldsymbol{w}=\boldsymbol{w}-\alpha\cdot \boldsymbol{e} w=wαe ;
5: \qquad 转入step 3;
输出: w \boldsymbol{w} w

1.3 编程实现

# 基于次梯度的lasso回归最优解
# 输入:
#     X:m*d维矩阵(其中第一列为全1向量,代表常数项),每一行为一个样本点,维数为d
#     y: m维向量
# 参数:
#     Lambda: 折中参数
#     eta:次梯度下降的步长
#     maxIter: 梯度下降法最大迭代步数
# 返回:
#    weight:回归方程的系数
class LASSO_SUBGRAD:
    def __init__(self, Lambda=1,eta=0.1, maxIter=1000):
        self.Lambda = Lambda
        self.eta = eta
        self.maxIter = maxIter

    def fit(self, X, y):
        n,d = X.shape
        w = np.zeros((d,1)) 
        self.w = w
        for t in range(self.maxIter):
            e = X@w - y
            v = 2 * X.T@e / n + self.Lambda * np.sign(w)
            w = w - self.eta * v  
            self.w += w
        self.w /= self.maxIter
        return 
    
    def predict(self, X):
        return X@self.w
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
import matplotlib.pyplot as plt

def generate_samples(m):
    X = 2 * (np.random.rand(m, 1) - 0.5) 
    y = X + np.random.normal(0, 0.3, (m,1))
    return X, y

np.random.seed(100)
X, y = generate_samples(10)
poly = PolynomialFeatures(degree = 10)
X_poly = poly.fit_transform(X)
model = LASSO_SUBGRAD(Lambda=0.001, eta=0.01, maxIter=50000)
model.fit(X_poly, y)

plt.axis([-1, 1, -2, 2])
plt.scatter(X, y)
W = np.linspace(-1, 1, 100).reshape(100, 1)
W_poly = poly.fit_transform(W)
u = model.predict(W_poly)
plt.plot(W, u)
plt.show()

在这里插入图片描述

import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score

def process_features(X):
    scaler = StandardScaler()
    X = scaler.fit_transform(X)
    m, n = X.shape
    X = np.c_[np.ones((m, 1)), X]  
    return X
    
housing = fetch_california_housing()
X = housing.data  
y = housing.target.reshape(-1,1)  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
X_train = process_features(X_train)
X_test = process_features(X_test)

model = LASSO_SUBGRAD(Lambda=0.1)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
score = r2_score(y_test, y_pred)
print("mse = {}, r2 = {}".format(mse, score))

2. 软阈值方法

目标函数
L ( x ) = 1 2 ∥ x − b ∥ 2 2 + γ ∥ x ∥ 1 \mathcal{L}\left(\boldsymbol{x}\right)=\frac{1}{2} \left \| \boldsymbol{x}- \boldsymbol{b}\right \|_2^2+\gamma \left \| \boldsymbol{x} \right \|_1 L(x)=21xb22+γx1
存在问题:不可微分。

策略:转化成分量,即解藕成几个分量的和
L ( x ) = { 1 2 ( x 1 − b 1 ) 2 + γ ∣ x 1 ∣ } + { 1 2 ( x 2 − b 2 ) 2 + γ ∣ x 2 ∣ } + ⋯ + { 1 2 ( x n − b n ) 2 + γ ∣ x n ∣ } \mathcal{L}\left(\boldsymbol{x}\right)=\left \{ \frac{1}{2} ( x_1- b_1)^2+\gamma \left | x_1 \right | \right \}+\left \{ \frac{1}{2} ( x_2- b_2)^2+\gamma \left | x_2 \right | \right \}+\cdots+\left \{ \frac{1}{2} ( x_n- b_n)^2+\gamma \left | x_n \right | \right \} L(x)={21(x1b1)2+γx1}+{21(x2b2)2+γx2}++{21(xnbn)2+γxn}
每个独立的部门均是同一个优化问题
Q ( x ) = 1 2 ( x − b ) 2 + γ ∣ x ∣ x , b ∈ R Q(x)=\frac{1}{2} ( x- b)^2+\gamma \left | x\right | \qquad x,b \in R Q(x)=21(xb)2+γxx,bR
对上式关于 x x x求导得:
∂ Q ( x ) ∂ x = x − b + γ ⋅ s i g n ( x ) = 0 \frac{\partial Q(x)}{\partial x}=x-b+\gamma·sign(x)=0 xQ(x)=xb+γsign(x)=0
则有
x = b − γ ⋅ s i g n ( x ) = 0 ⋯ ( 6 ) x=b-\gamma·sign(x)=0 \qquad \cdots (6) x=bγsign(x)=0(6)
公式(6)中的解 x x x与其符号有很大关系需讨论

(i)当 x > 0 x>0 x>0时, x = b − γ > 0 x=b-\gamma>0 x=bγ>0,同时需要 b > Γ b>\Gamma b>Γ

∙ \bullet b < − Γ b<-\Gamma b<Γ时, x = b + Γ x=b+\Gamma x=b+Γ

∙ \bullet − Γ ≤ b ≤ 0 -\Gamma \le b \le 0 Γb0时, x x x无极点( x > 0 x>0 x>0), x = 0 x=0 x=0为目标函数最大值。

综上可知
x ^ = S γ ( b ) = { b − γ b > γ 0 − γ ≤ b ≤ γ b + γ b < − γ \hat{x} =S_\gamma(b)=\left\{\begin{matrix} b-\gamma & b>\gamma\\ 0 & -\gamma\le b\le \gamma\\ b+\gamma & b<-\gamma \end{matrix}\right. x^=Sγ(b)= bγ0b+γb>γγbγb<γ

x ^ = S γ ( b ) = s i g n ( b ) ⋅ m a x { ∣ b ∣ − γ , 0 } \hat{x} =S_\gamma(b)=sign(b)·max\left \{ \left | b \right | -\gamma,0 \right \} x^=Sγ(b)=sign(b)max{bγ,0}

2.1 软阈值求解Lasso回归

# 基于软阈值法的lasso回归最优解(ADMM)
# 输入:
#     X:m*d维矩阵(其中第一列为全1向量,代表常数项),每一行为一个样本点,维数为d
#     y: m维向量
# 参数:
#     Lambda: 折中参数
#     maxIter: 梯度下降法最大迭代步数
# 返回:
#    weight:回归方程的系数
class LASSO_ADMM:  
    def __init__(self, Lambda=1, maxIter=1000):
        self.lambda_ = Lambda
        self.maxIter = maxIter
    
    def soft_threshold(self, t, x):
        if x>t:
            return x-t
        elif x>=-t:
            return 0
        else:
            return x+t

    def fit(self, X, y):
        m,n = X.shape
        alpha = 2 * np.sum(X**2, axis=0) / m
        w = np.zeros(n)
        for t in range(self.maxIter):
            j = t % n
            w[j]=0
            e_j = X@(w.reshape(-1,1)) - y
            beta_j = 2 * X[:, j]@e_j / m
            u = self.soft_threshold(self.lambda_/alpha[j], -beta_j/alpha[j])
            w[j] = u
        self.w = w
    
    def predict(self, X):
        return X@(self.w.reshape(-1,1))
import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score

def process_features(X):
    scaler = StandardScaler()
    X = scaler.fit_transform(X)
    m, n = X.shape
    X = np.c_[np.ones((m, 1)), X]  
    return X
    
housing = fetch_california_housing()
X = housing.data  
y = housing.target.reshape(-1,1)  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
X_train = process_features(X_train)
X_test = process_features(X_test)

model = LASSO_ADMM(Lambda=0.1, maxIter=1000)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
score = r2_score(y_test, y_pred)
print("mse = {}, r2 = {}".format(mse, score))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计组2.3——浮点数的表示和运算

计组2.3 浮点数 #mermaid-svg-hwjyO2bt7hFXy1eD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hwjyO2bt7hFXy1eD .error-icon{fill:#552222;}#mermaid-svg-hwjyO2bt7hFXy1eD .error-text{fill:#552222;stroke:#552…

视频美颜sdk的开发流程与注意事项

目前&#xff0c;视频美颜技术逐渐成为了人们关注的焦点。而视频美颜sdk作为实现视频美颜的重要工具&#xff0c;也因此备受关注。本文将从视频美颜sdk的开发流程和注意事项两个方面进行探讨。 一、视频美颜sdk的开发流程 1、确定需求 在进行视频美颜sdk的开发之前&#xff0…

Solon v2.2.10 发布,助力信创国产化

Solon 是一个高效的 Java 应用开发框架&#xff1a;更快、更小、更简单。它不是 Spring、没有使用 Servlet、JavaEE 接口&#xff0c;是一个有自己接口标准的开放生态。可以为应用软件国产化提供支持&#xff0c;助力信创建设。 150来个生态插件&#xff0c;覆盖各种不同的应用…

天猫数据分析:饮料市场头部份额下滑,无糖饮料占比40%

如今&#xff0c;全世界减糖、控糖的大趋势已经拉开帷幕。 根据沸点测评数据&#xff0c;今年所有在新加坡销售的饮料&#xff0c;必须在包装上注明A、B、C或D的营养等级标签&#xff0c;列明饮料含糖分和饱和脂肪的百分比&#xff0c;营养等级为D的饮品则会被禁止做广告营销。…

Tinymce富文本编辑器在vue项目中的使用;引入第三方插件和上传视频、图片等

先放张效果图第一步&#xff1a;安装依赖 npm install tinymce5.0.12第二步&#xff1a;在项目中的public文件夹中新建tinymce文件夹&#xff08;因为我的项目是脚手架创建的&#xff0c;所以公共文件夹是public&#xff09;&#xff1b;在node_modules中找到skins文件夹复制到…

插件化换肤原理—— 布局加载过程、View创建流程、Resources 浅析

作者&#xff1a;孙先森Blog 本文主要分析了 Android 布局加载流程 分析 一般的换肤功能大概是这样的&#xff1a;在 App 的皮肤商城内下载“皮肤包”&#xff0c;下载完成后点击更换界面上的 View 相关资源&#xff08;颜色、样式、图片、背景等&#xff09;发生改变&#xf…

栈的实现及相关OJ题

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

28岁,他是如何成为上市公司测试总监的

现在的大环境下&#xff0c;各行各业都开始内卷起来&#xff0c;测试也不例外&#xff0c;企业要求也越来越高&#xff0c;“会代码”逐渐成为测试工程师的一个标签。你要想拿到一个不错的薪资&#xff0c;必不可少的一个技能—自动化测试&#xff0c;自动化测试难吗&#xff1…

Oracle集合查询详解加练习题

#集合查询 概念&#xff1a;将不同的数据集合&#xff08;SQL查询语句&#xff09;按照集合的规则&#xff0c;拼接一个临时的&#xff0c;新的数据集合&#xff08;表&#xff09; 1.集合&#xff1a;并集、交集、差集 并集 union all 语法&#xff1a;select column1,COLUM…

「MongoDB」时序数据库和MongoDB第二部分-模式设计最佳实践

在上一篇博客文章时间序列数据与MongoDB&#xff1a;第一部分-简介中&#xff0c;我们介绍了时间序列数据的概念&#xff0c;然后介绍了一些可以用于帮助收集时间序列应用程序需求的发现问题。对这些问题的回答有助于指导支持大容量生产应用程序部署所需的模式和MongoDB数据库配…

基于深度学习PaddleOcr身份证识别

之前使用opencv机械学习处理图片&#xff0c;使用Testseract-OCR进行身份证和姓名识别&#xff0c;发现受背景图片的影响比较大&#xff0c;转PaddleOcr&#xff0c;识别成功率能达到使用要求。 PaddleOcr官网地址&#xff1a;飞桨PaddlePaddle-源于产业实践的开源深度学习平台…

Python爬虫-某跨境电商(AM)搜索热词

前言 本文是该专栏的第42篇,后面会持续分享python爬虫干货知识,记得关注。 关于某跨境电商(AM),本专栏前面有单独详细介绍过,获取配送地的cookie信息以及商品库存数据,感兴趣的同学可往前翻阅。 1. python爬虫|爬取某跨境电商AM的商品库存数据(Selenium实战) 2. Seleni…

偶数科技发布实时湖仓数据平台 Skylab 5.0

2023 年 4 月 11 日&#xff0c; 偶数发布了最新的实时湖仓数据平台 Skylab 5.0&#xff0c;平台各个组件进行了全面升级。新版 Skylab 的发布标志着偶数科技具有从数据存储、计算、管理到分析、应用和 AI 能力的完整的数据管理生态闭环&#xff0c;帮助用户实现批流一体、实时…

贴完车衣开车就走?

贴完车衣之后&#xff0c;你以为直接开走就好了吗&#xff1f; 大错特错&#xff01;&#xff01;&#xff01; 正确流程&#xff0c;记得收藏起来&#xff01; 1&#xff1a;膜开箱&#xff1a;这个当场开箱&#xff0c;防止偷梁换柱 2&#xff1a;装贴过程&#xff1a;确认施…

损失函数(Loss Function)一文详解-分类问题常见损失函数Python代码实现+计算原理解析

目录 前言 一、损失函数概述 二、损失函数分类 1.分类问题的损失函数 1.交叉熵损失函数&#xff08;Cross Entropy Loss&#xff09; 2.Hinge损失函数 3.余弦相似度损失函数&#xff08;Cosine Similarity Loss&#xff09; 4.指数损失函数&#xff08;Exponential Los…

Next.js Polygon, Solidity,The Graph,IPFS,Hardhat web3博客系统

参考 源文档The Complete Guide to Full Stack Web3 Development - DEV Community 源码&#xff0c;源文章里的github项目无法直接运行&#xff0c;经过修改后可mac中可用GitHub - daocodedao/web3-blog: https://linzhji.blog.csdn.net/article/details/130125634 框架 博客…

python pandas数据处理excel、csv列转行、行转列(具体示例)

一、数据处理需求 对Excel或CSV格式的数据,我们经常都是使用pandas库读取后转为DataFrame进行处理。有的时候我们需要对其中的数据进行行列转换,但是不是简单的行列转换,因为数据中有重复的数据属性。比如我们的数据在Excel中的格式如下: 那么,我们如何将上面的数据格式转…

2023爱分析·商业智能应用解决方案市场厂商评估报告:数聚股份

目录 1. 研究范围定义 2. 商业智能应用解决方案市场分析 3. 厂商评估&#xff1a;数聚股份 4. 入选证书 1. 研究范围定义 商业智能&#xff08;BI&#xff09;是在实现数据集成和统一管理的基础上&#xff0c;利用数据存储和处理、分析与展示等技术&#xff0c;满足企…

Java多线程案例-Java多线程(3)

各位观众老爷们, 创作不易, 多多支持&#x1f636;‍&#x1f32b;️&#x1f64f;&#x1f618; 字数11223, 时间:2023年4月16日11:19:58 状态: 精神恍恍惚惚, 想打游戏&#x1f975; 目录(点击传送) 单例模式 饿汉模式 懒汉模式 单线程版 多线程版 阻塞队列 什么是阻塞队…

助力工业物联网,工业大数据之ODS层及DWD层建表语法【七】

文章目录ODS层及DWD层构建01&#xff1a;课程回顾02&#xff1a;课程目标03&#xff1a;数仓分层回顾04&#xff1a;Hive建表语法05&#xff1a;Avro建表语法ODS层及DWD层构建 01&#xff1a;课程回顾 一站制造项目的数仓设计为几层以及每一层的功能是什么&#xff1f; ODS&am…