请选择 进入手机版|继续访问电脑版
发新帖

求教参数稀疏化算法,谢谢!

[复制链接]
135 1

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 3473606200 于 2019-1-5 15:31 编辑

来自407299695@QQ.COM的邮件

PYTHON的代码如下:
参数压缩
def shrinkage(a,b)
    z = np.maximum(a - b, 0) - np.maximum( -a - b, 0)
    return z
这个算法不太通俗,通俗的解释是:首先 如果|a|>b取|a|-b然后加上a的正负号,否则直接为0

参数稀疏化
def sparse_bls(A,b):  A是原始参数矩阵,也就是说A就是自变量数据集X,b是标量?向量?矩阵?行数、列数有什么要求?代表什么意义?数值从何处获取?
    lam = 0.001
    itrs = 50         itrs为迭代次数
    AA = A.T.dot(A)   MATLAB的代码是AA=(A')*A,矩阵AA=A的转置矩阵*矩阵A
    m = A.shape[1]    m=矩阵A的列数
    n = b.shape[1]    n=矩阵b的列数   
    x1 = np.zeros([m,n]) 生成一个m行n列的矩阵x1,数字都是0
    wk = x1           矩阵wk=x1,即每个元素的初始数字是0
    ok = x1           矩阵ok=x1,即每个元素的初始数字是0
    uk = x1           矩阵uk=x1,即每个元素的初始数字是0
    L1 = np.mat(AA + np.eye(m)).I  MATLAB的代码是L1=eye(m)/(AA+eye(m));  MATLAB中 x=A\B就是A*x=B的解;x=B/A就是x*A=B的解.
                                   eye(m)表示对角线都是1其余为0的m*m单位矩阵
                                   np.mat(AA + np.eye(m)).I的算法如何与MATLAB的/起到等的结果?尤其是 .I什么意思???
    L2 = (L1.dot(A.T)).dot(b)      MATLAB的代码是L2=L1*A'*b; 比PYTHON更简洁,更容易理解
    for i in range(itrs):          MATLAB的代码是for i = 1:itrs,  从1开始循环itrs次(50次)
        ck = L2 + np.dot(L1,(ok - uk)) MATLAB的代码是ck=L2+L1*(ok-uk);
        ok = shrinkage(ck+uk,lam)  参数压缩,使ck+uk的绝对值减小lam,如果相减后绝对值小于lam按0处理
        uk = uk+ck-ok
        wk = ok   
    return wk

MATLAB的代码如下:
function wk = sparse_bls(A,b,lam,itrs)
AA = (A') * A;
m = size(A,2);
n = size(b,2);
x = zeros(m,n);
wk = x;
ok=x;uk=x;
L1=eye(m)/(AA+eye(m));
L2=L1*A'*b;
for i = 1:itrs,
  ck=L2+L1*(ok-uk);
  ok=shrinkage(ck+uk,lam);
  uk=uk+(ck-ok);
  wk=ok;
end
end

function z = shrinkage(x, kappa)
  z = max( x - kappa,0 ) - max( -x - kappa ,0);
end

参考文献.zip

232.04 KB, 下载次数: 1

参考文献

举报 使用道具

回复

精彩评论1

江海志  管理员  发表于 2019-1-28 02:09:38 | 显示全部楼层
楼主可否把你的问题描述清楚一点? 是不太清楚函数sparse_bls(A,b)?

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表