图Lasso求逆协方差矩阵(Graphical Lasso for inverse covariance matrix)
图Lasso求逆协方差矩阵(Graphical Lasso for inverse covariance matrix)
作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/
1. 图Lasso方法的基本理论
2. 坐标下降算法
3. 图Lasso算法
4. MATLAB程序
数据见参考文献[2]
4.1 方法一
demo.m
load SP500
data = normlization(data);
S = cov(data); %样本协方差
[X, W] = glasso_1(double(S), 0.5);
%X:sigma^(-1), W:sigma
[~, idx] = sort(info(:,3));
colormap gray
imagesc(X(idx, idx) == 0)
axis off %% Data Normalization
function data = normlization(data)
data = bsxfun(@minus, data, mean(data));
data = bsxfun(@rdivide, data, std(data));
end
glasso_1.m
function [X, W] = glasso_1(S, lambda)
%% Graphical Lasso - Friedman et. al, Biostatistics, 2008
% Input:
% S - 样本的协方差矩阵
% lambda - 罚参数
% Output:
% X - 精度矩阵 sigma^(-1)
% W - 协方差矩阵 sigma
%%
p = size(S,1); %数据维度
W = S + lambda * eye(p); %W=S+λI
beta = zeros(p) - lambda * eye(p); %β=-λI
eps = 1e-4;
finished = false(p); %finished:p*p的逻辑0矩阵
while true
for j = 1 : p
idx = 1 : p; idx(j) = [];
beta(idx, j) = lasso(W(idx, idx), S(idx, j), lambda, beta(idx, j));
W(idx, j) = W(idx,idx) * beta(idx, j); %W=W*β
W(j, idx) = W(idx, j);
end
index = (beta == 0);
finished(index) = (abs(W(index) - S(index)) <= lambda);
finished(~index) = (abs(W(~index) -S(~index) + lambda * sign(beta(~index))) < eps);
if finished
break;
end
end
X = zeros(p);
for j = 1 : p
idx = 1 : p; idx(j) = [];
X(j,j) = 1 / (W(j,j) - dot(W(idx,j), beta(idx,j)));
X(idx, j) = -1 * X(j, j) * beta(idx,j);
end
% X = sparse(X);
end
lasso.m
function w = lasso(A, b, lambda, w)
% Lasso
p = size(A,1);
df = A * w - b;
eps = 1e-4;
finished = false(1, p);
while true
for j = 1 : p
wtmp = w(j);
w(j) = soft(wtmp - df(j) / A(j,j), lambda / A(j,j));
if w(j) ~= wtmp
df = df + (w(j) - wtmp) * A(:, j); % update df
end
end
index = (w == 0);
finished(index) = (abs(df(index)) <= lambda);
finished(~index) = (abs(df(~index) + lambda * sign(w(~index))) < eps);
if finished
break;
end
end
end
%% Soft thresholding
function x = soft(x, lambda)
x = sign(x) * max(0, abs(x) - lambda);
end
结果
注意:罚参数lamda的设定对逆协方差的稀疏性的影响很大,可以用交叉验证方式得到。
4.2 方法二
graphicalLasso.m
function [Theta, W] = graphicalLasso(S, rho, maxIt, tol)
% http://www.ece.ubc.ca/~xiaohuic/code/glasso/glasso.htm
% Solve the graphical Lasso
% minimize_{Theta > 0} tr(S*Theta) - logdet(Theta) + rho * ||Theta||_1
% Ref: Friedman et al. (2007) Sparse inverse covariance estimation with the
% graphical lasso. Biostatistics.
% Note: This function needs to call an algorithm that solves the Lasso
% problem. Here, we choose to use to the function *lassoShooting* (shooting
% algorithm) for this purpose. However, any Lasso algorithm in the
% penelized form will work.
%
% Input:
% S -- sample covariance matrix
% rho -- regularization parameter
% maxIt -- maximum number of iterations
% tol -- convergence tolerance level
%
% Output:
% Theta -- inverse covariance matrix estimate
% W -- regularized covariance matrix estimate, W = Theta^-1 p = size(S,1); if nargin < 4, tol = 1e-6; end
if nargin < 3, maxIt = 1e2; end % Initialization
W = S + rho * eye(p); % diagonal of W remains unchanged
W_old = W;
i = 0; % Graphical Lasso loop
while i < maxIt,
i = i+1;
for j = p:-1:1,
jminus = setdiff(1:p,j);
[V D] = eig(W(jminus,jminus));
d = diag(D);
X = V * diag(sqrt(d)) * V'; % W_11^(1/2)
Y = V * diag(1./sqrt(d)) * V' * S(jminus,j); % W_11^(-1/2) * s_12
b = lassoShooting(X, Y, rho, maxIt, tol);
W(jminus,j) = W(jminus,jminus) * b;
W(j,jminus) = W(jminus,j)';
end
% Stop criterion
if norm(W-W_old,1) < tol,
break;
end
W_old = W;
end
if i == maxIt,
fprintf('%s\n', 'Maximum number of iteration reached, glasso may not converge.');
end Theta = W^-1; % Shooting algorithm for Lasso (unstandardized version)
function b = lassoShooting(X, Y, lambda, maxIt, tol), if nargin < 4, tol = 1e-6; end
if nargin < 3, maxIt = 1e2; end % Initialization
[n,p] = size(X);
if p > n,
b = zeros(p,1); % From the null model, if p > n
else
b = X \ Y; % From the OLS estimate, if p <= n
end
b_old = b;
i = 0; % Precompute X'X and X'Y
XTX = X'*X;
XTY = X'*Y; % Shooting loop
while i < maxIt,
i = i+1;
for j = 1:p,
jminus = setdiff(1:p,j);
S0 = XTX(j,jminus)*b(jminus) - XTY(j); % S0 = X(:,j)'*(X(:,jminus)*b(jminus)-Y)
if S0 > lambda,
b(j) = (lambda-S0) / norm(X(:,j),2)^2;
elseif S0 < -lambda,
b(j) = -(lambda+S0) / norm(X(:,j),2)^2;
else
b(j) = 0;
end
end
delta = norm(b-b_old,1); % Norm change during successive iterations
if delta < tol, break; end
b_old = b;
end
if i == maxIt,
fprintf('%s\n', 'Maximum number of iteration reached, shooting may not converge.');
end
结果
>> A=[5.9436 0.0676 0.5844 -0.0143
0.0676 0.5347 -0.0797 -0.0115
0.5844 -0.0797 6.3648 -0.1302
-0.0143 -0.0115 -0.1302 0.2389
];
>> [Theta, W] = graphicalLasso(A, 1e-4) Theta = 0.1701 -0.0238 -0.0159 0.0003
-0.0238 1.8792 0.0278 0.1034
-0.0159 0.0278 0.1607 0.0879
0.0003 0.1034 0.0879 4.2369 W = 5.9437 0.0675 0.5843 -0.0142
0.0675 0.5348 -0.0796 -0.0114
0.5843 -0.0796 6.3649 -0.1301
-0.0142 -0.0114 -0.1301 0.2390
5. 补充:近端梯度下降(Proximal Gradient Descent, PGD)求解Lasso问题
6. 参考文献
[1] 林祝莹. 图Lasso及相关方法的研究与应用[D].燕山大学,2016.
[2] Graphical Lasso for sparse inverse covariance selection
[3] 周志华. 机器学习[M]. 清华大学出版社, 2016.
[4] Graphical lasso in R and Matlab
[5] Graphical Lasso
图Lasso求逆协方差矩阵(Graphical Lasso for inverse covariance matrix)的更多相关文章
- ZOJ3574(归并排序求逆数对)
Under Attack II Time Limit: 5 Seconds Memory Limit: 65536 KB Because of the sucessfully calcula ...
- Day2:T4求逆序对(树状数组+归并排序)
T4: 求逆序对 A[I]为前缀和 推导 (A[J]-A[I])/(J-I)>=M A[j]-A[I]>=M(J-I) A[J]-M*J>=A[I]-M*I 设B[]=A[]-M*( ...
- 洛谷P4841 城市规划(生成函数 多项式求逆)
题意 链接 Sol Orz yyb 一开始想的是直接设\(f_i\)表示\(i\)个点的无向联通图个数,枚举最后一个联通块转移,发现有一种情况转移不到... 正解是先设\(g(n)\)表示\(n\)个 ...
- 【bzoj3456】城市规划(多项式求逆+dp)
Description 求\(~n~\)个点组成的有标号无向连通图的个数.\(~1 \leq n \leq 13 \times 10 ^ 4~\). Solution 这道题的弱化版是poj1737, ...
- POJ 2299树状数组求逆序对
求逆序对最常用的方法就是树状数组了,确实,树状数组是非常优秀的一种算法.在做POJ2299时,接触到了这个算法,理解起来还是有一定难度的,那么下面我就总结一下思路: 首先:因为题目中a[i]可以到99 ...
- [bzoj3456] 城市规划 [递推+多项式求逆]
题面 bzoj权限题面 离线题面 思路 orz Miskcoo ! 先考虑怎么算这个图的数量 设$f(i)$表示$i$个点的联通有标号无向图个数,$g(i)$表示$n$个点的有标号无向图个数(可以不连 ...
- SGU180 Inversions(树状数组求逆序数)
题目: 思路:先离散化数据然后树状数组搞一下求逆序数. 离散化的方法:https://blog.csdn.net/gokou_ruri/article/details/7723378 自己对用树状数组 ...
- <Sicily>Inversion Number(线段树求逆序数)
一.题目描述 There is a permutation P with n integers from 1 to n. You have to calculate its inversion num ...
- JDOJ 1927 求逆序对
洛谷 P1908 逆序对 洛谷传送门 JDOJ 1927: 求逆序对 JDOJ传送门 题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现 ...
随机推荐
- [a0003] <创作> 全局视图索引
100篇博文再考虑 需求: 包含随笔.转载文章,能够容易区分
- PHP转Go系列:map映射
映射的定义 初识映射会很懵,因为在PHP中没有映射类型的定义.其实没那么复杂,任何复杂的类型在PHP中都可以用数组表示,映射也不例外. $array['name'] = '平也'; $array['s ...
- Educational Codeforces Round 76 (Rated for Div. 2) E. The Contest dp
E. The Contest A team of three programmers is going to play a contest. The contest consists of
- HTML连载48-清除浮动的其中两种方式
一.清除浮动的方式一 给前面一个父元素设置高度,注意:企业开发中能不写高度就不写高度 <!DOCTYPE html> <html lang="en"> & ...
- npm 被墙怎么办
npm install typescript --registry=http://registry.npm.taobao.org 使用下面的命令.
- python做中学(六)os.getcwd() 的用法
概述 os.getcwd() 方法用于返回当前工作目录. 语法 getcwd()方法语法格式如下: os.getcwd() 参数 无 返回值 返回当前进程的工作目录. 实例 以下实例演示了 getcw ...
- [debug]ubuntu共享文件夹所在目录
使用Vmware虚拟机,Vmware Tools工具的复制粘贴一直无效,之后采用共享文件夹. 其默认的是在 \mnt\hgfs 下,在Vmware的设置中建立好文件夹,将文件传入进去,之后就可以去 \ ...
- 在.net 程序中使用Mustache模板字符串
今天弄了一个配置随着使用环境动态切换的功能,一个基本的思路是: 将配置配置为模板的形式, 根据不同的环境定义环境变量 根据环境变量渲染模板,生成具体的配置 这里面就涉及到了一个字符串模板的功能,关于模 ...
- Java生鲜电商平台-IntelliJ IDEA 最新注册码,亲测可用
2019年IntelliJ IDEA 最新注册码(截止到2020年3月11日) 操作步骤: 第一步: 修改 hosts 文件 ~~~ 在hosts文件中,添加以下映射关系: 0.0.0.0 acco ...
- TCP协议的三次握手与四次挥手
1.数据包说明 1)源端口号(16位):它(连同源主机IP地址)标识源主机的一个应用进程. 2)目标端口号(16位):它(连同源主机IP地址)标识目的主机的一个应用进程.这两个值加上IP报头中的源主机 ...