P1问题求解相关算法

1. BP

利用matlab的线性规划工具箱,即linprog

主要思想:如何将P1问题转换为线性规划问题

即由3.1变为3.2

令x=[u; v],其中u,v均为正,a=u-v

A=[phi,-phi]  (显示不了符号,读出来就好。。。 )

b=s

则b=Ax=(u-v)=a=s

求解:x0=linprog(c,[],[],A,b,zeros(2*p,1));

问题P1的最优解即为x0(1:p)-x0(p+1:2p)

注:这里要去掉绝对值,证明如下:

2. BPDN 基追踪去噪

利用quadprog

x0=quadprog(B,c,[],[],[],[],zeros(2*m,1));

x0=x0(1:m)-x0(m+1:2*m);

和BP思想一样,将P1问题转换为二次规划问题,

令x=u-v

不一样的地方是,BPDN允许噪声的存在,可以参考IRLS-noNoise和IRLS的区别。

n=20;m=30;
A=randn(n,m);
W=sqrt(diag(A‘*A));
for k=1:1:m
    A(:,k)=A(:,k)/W(k);
end
S=5;
x=zeros(m,1);
pos=randperm(m);
x(pos(1:S))=sign(randn(S,1)).*(1+rand(S,1));  %x的稀疏度为S,即稀疏度逐渐增加到Smax
b=A*x;
lamda=0.0001*2.^(0:0.75:15);
for i=1:1:21
    %{%BP
    bb=A‘*b;
    c=lamda(i)*ones(2*m,1)+[-bb;bb];
    B=[A‘*A, -A‘*A;-A‘*A, A‘*A];
    x0=quadprog(B,c,[],[],[],[],zeros(2*m,1));
    x0=x0(1:m)-x0(m+1:2*m);
    %}%BPDN
    bb=A‘*b;
    c=lamda(i)*ones(2*m,1)+[-bb;bb];%注意lamda取值,这里取为0.05
    B=[A‘*A, -A‘*A;-A‘*A, A‘*A];
    x0=quadprog(B,c,[],[],[],[],zeros(2*m,1));
    x0=x0(1:m)-x0(m+1:2*m);
    err(i)=(x0-x)‘*(x0-x)/(x‘*x);
end
h=semilogx(lambda,err,‘k--‘);
set(h,‘LineWidth‘,2);

  

3.IRLS 迭代重加权最小二乘

将l0松弛到l1,得到P1,即BPDN(基追踪降噪 basis pursuit denoising),将P1写成标准的优化问题即Q1,添加拉格朗日乘子。

一般定义Q1为套锁回归(LASSO)

主要思想:为方便对问题Q1求导,

输入A、x、b、

问题M的最小二乘求解:

xout=inv(2*lambda(ll)*XX+AA)*Ab;

对角加权矩阵X的更新,XX为X的逆:

XX=diag(1./(abs(xout)+1e-10));

当||小于预设阈值时停止迭代

输出问题Q1的近似解

n=100; m=200; S=4; sigma=0.1;

A=randn(n,m);
W=sqrt(diag(A‘*A));
for k=1:1:m,
    A(:,k)=A(:,k)/W(k);
end;

x0=zeros(m,1);
pos=randperm(m);
x0(pos(1:S))=sign(randn(S,1)).*(1+rand(S,1));
b=A*x0+randn(n,1)*sigma;

% The IRLS algorithm for varying lambda
Xsol=zeros(m,101);
Err=zeros(101,1);
Res=zeros(101,1);
lambda=0.0001*2.^(0:0.15:15);
AA=A‘*A;
Ab=A‘*b;
for ll=1:1:101
    xout=zeros(m,1);
    XX=eye(m);%单位对角矩阵
    for k=1:1:15
        xout=inv(2*lambda(ll)*XX+AA)*Ab;
        XX=diag(1./(abs(xout)+1e-10));
        % disp(norm(xout-x0)/norm(x0));
    end;
    Xsol(:,ll)=xout;
    Err(ll)=(xout-x0)‘*(xout-x0)/(x0‘*x0);%误差
    Res(ll)=(A*xout-b)‘*(A*xout-b)/sigma^2/n; %残差
end;

  

如何选择拉格朗日乘子?

经验法则:选择接近噪声偏差值和期望非零值的标准差的比值

注:残差和噪声功率相等时取得最优

确定最优方法:根据经验法则确定大致值lambda=0.0001*2.^(0:0.15:15);

对进行验算,最小误差对应的即最优

posL=find(Err==min(Err),1);

注:BPDN执行较IRLS慢

4. LARS(least angle regression stagewise)最小角度回归分布

这个要多写点~

forward selection 和OMP的思想比较接近

forward stagewise感觉就是更加平滑,因为步长更小

LAR取的步长是两者之间,即最小角度回归。

结合两者的思想即为LARS。

主要思想:

为稀疏(回归)系数列向量,为估计向量

首先取,即

c正比于X和当前残差向量的相关度(怪怪的。。)

取|cj|最大的方向

算法步骤:

  1. 求j,并不断更新A=[A,j];

    为方便理解,可引入XA

  2. 计算 gamma

联立15.16两式:

3.更新mu

4.求bita

n=100; m=200; S=4; sigma=0.1;

A=randn(n,m);
W=sqrt(diag(A‘*A));
for k=1:1:m,
    A(:,k)=A(:,k)/W(k);
end;

x0=zeros(m,1);
pos=randperm(m);
x0(pos(1:S))=sign(randn(S,1)).*(1+rand(S,1));
b=A*x0+randn(n,1)*sigma;

Err=zeros(n,1);
Res=zeros(n,1);
XsolLARS=lars(A,b);%求稀疏向量
for k=1:1:n
    xout=XsolLARS(k,:)‘;
    ErrLARS(k)=(xout-x0)‘*(xout-x0)/(x0‘*x0);
end;

function beta = lars( X,y )
%求稀疏向量
[n,m]=size(X);
nvars=min(n-1,m);%%???
mu=zeros(n,1);
beta = zeros(2*nvars, m);
I=1:m;
A=[];k=0;vars=0;
gram=X‘*X;
while vars<nvars
    k=k+1;
    c=X‘*(y-mu);
    [C,j]=max(abs(c(I)));%c(I) 即不包含之前取过的j
    j=I(j);
    A=[A j];
    vars=vars+1;
    I(I==j)=[];%这里不是置零,而是直接去掉j
    s=sign(c(A));
    G=s‘*inv(gram(A,A))*s;
    AA=G^(-1/2);
    WA=AA*inv(gram(A,A))*s;
    u=X(:,A)*WA;
    if vars==nvars
        gamma=C/AA;
    else
        a=X‘*u;
        temp=[(C-c(I))./(AA-a(I));(C+c(I))./(AA+a(I))];%减去c、a中不属于A的j列向量,从而得到gamma
        gamma=min([temp(temp>0);C/AA]);
    end
    mu=mu+gamma*u;
    beta(k+1,A) = beta(k,A) + gamma*WA‘;
end
if size(beta,1) > k+1
  beta(k+2:end, :) = [];%只取nvars个,beta即为稀疏向量
end
end

  

拓展:硬阈值、软阈值

如果A 是酋矩阵,则AA(t)=I,故P0问题可写为:

误差最小的解,即为接近的最稀疏向量,只需将的各项按绝对值降序排列选择前几项即可。

其中T()为硬阈值。怎么取?

用LARS的思想

lambda即为软阈值

时间: 2024-11-07 03:58:36

P1问题求解相关算法的相关文章

P0问题求解相关算法

1.OMP 搜寻最小误差即求<>的最大值 对误差求导, 即, A中对应SS的列与残差正交. 算法步骤: 输入稀疏向量x(m*1),列归一化矩阵A(n*m),理想输出b,稀疏度K,误差精度 初始化残差r1为b 找到A'*r1的最大值所在索引posZ(列索引,有相对应的x的元素) 更新索引向量SS=sort([SS,posZ(1)]) 找到||A(:,SS)x-b||最小二乘解x0= pinv(A(:,SS))*b 求残差r1=b-A(:,SS)*x0= b-A(:,SS)* pinv(A(:,S

探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤(转)

第 2 部分: 深入推荐引擎相关算法 - 协同过滤 本系列的第一篇为读者概要介绍了推荐引擎,下面几篇文章将深入介绍推荐引擎的相关算法,并帮助读者高效的实现这些算法. 在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法.它以其方法模型简单,数据依赖性低,数据方便采集 , 推荐效果较优等多个优点成为大众眼里的推荐算法“No.1”.本文将带你深入了解协同过滤的秘密,并给出基于 Apache Mahout 的协同过滤算法的高效实现.Apache Mahout 是 ASF 的一个

数据结构(C语言版)顺序栈相关算法的代码实现

这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的是从栈底想栈顶方向运行visit()函数,这是之前的学习中所忽略的:栈的遍历解除了栈的输出顺序只能从栈顶像栈底方向的限制. 二.清空栈时要不要将stacksize重置 网上看到有的人在实现清空栈这一功能时,将stacksize重置为0,我觉得有点问题,起初的想法是将其重置为初始化时的值,在与同学讨论

加密类型及其相关算法

在互联网通信过程中,如何保证数据的安全性? 在通信过程中,数据安全主要从三个方面考虑:机密性(数据的内容不能被窃取) 完整性(数据的内容不能被修改) 身份验证(确定通信双方的身份) 加密类型:1.对称加密,加密和解密使用同一个密钥,但是密钥如何安全传输比较重要,对称加密数度较快,适于加密数据 2.单向加密,提取数据指纹,主要用于保证数据的完整性 单向加密的特点:输入相同则输出一定相同 雪崩效应:输入的微小改变会引起结果的巨大反差 定长输出 3.非对称加密,使用一对密钥(public-key和pr

探索推荐引擎内部的秘密,第 3 部分: 深入推荐引擎相关算法 - 聚类

聚类分析 什么是聚类分析? 聚类 (Clustering) 就是将数据对象分组成为多个类或者簇 (Cluster),它的目标是:在同一个簇中的对象之间具有较高的相似度,而不同簇中的对象差别较大.所以,在很多应用中,一个簇中的数据对象可以被作为一个整体来对待,从而减少计算量或者提高计算质量. 其实聚类是一个人们日常生活的常见行为,即所谓"物以类聚,人以群分",核心的思想也就是聚类.人们总是不断地改进下意识中的聚类模式来学习如何区分各个事物和人.同时,聚类分析已经广泛的应用在许多应用中,包

linux学习之路之加密类型及其相关算法

加密类型及其相关算法 随着互联网越演越烈,互联网上的各种攻击层出不穷,因此在互联网上相互传递的信息越来越不安全,因此为了防止用户在互联网上传递的数据被窃取,因此我们很有必须加强传递的数据的安全性. 数据的安全性主要包括以下三个方面: 数据的机密性:保证传递的数据不被读取 要想使传递的数据不被读取,可以对这些数据进行加密,因为默认这些数据是以明文来传递的 整个加密过程可以这么来理解: 加密:plaintext--->转换规则--->ciphertext 解密:ciphertext--->转

二分查找的相关算法题

最近笔试经常遇到二分查找的相关算法题 1)旋转数组中的最小数字 2)在旋转数组中查找某个数 2)排序数组中某个数的出现次数 下面我来一一总结 1 旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 实现数组的旋转见左旋转字符串. 和二分查找法一样,用两个指针分别指向数组的第一个元素和最后一个元素. 我们注意到旋转

深入推荐引擎相关算法 - 协同过滤

集体智慧和协同过滤 什么是集体智慧 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web 应用中利用集体智慧构建更加有趣的应用或者得到更好的用户体验.集体智慧是指在大量的人群的行为和数据中收集答案,帮助你对整个人群得到统计意义上的结论,这些结论是我们在单个个体上无法得到的,它往往是某种趋势或者人群中共性的部分. Wikipedia 和 Google 是两个典型的利用集体智慧的 Web 2.0 应用: Wikip

容器set相关算法

 set_union 算法set_union可构造S1.S2的并集.此集合内含S1或S2内的每一个元素.S1.S2及其并集都是以排序区间表示.返回值是一个迭代器,指向输出区间的尾端. 由于S1和S2内的每个元素都不需唯一,因此,如果某个值在S1出现n次,在S2出现m次,那么该值再输出区间中会出现max(m,n)次,其中n个来自S1,其余来自S2.在STL set容器内,m小于等于1,n小于等于1. template <class InputIterator1,classInputIterat