2015-03-13 2 views
0

Goodevening для всех. Я не могу понять вывод функции Spams.lassoWeighted. Если вы запустите пример на своей странице http://spams-devel.gforge.inria.fr/doc-python/html/doc_spams005.html#sec16:SPAMS. spams.lassoСветовое неправильное выпадение?

import spams 
import numpy as np 
np.random.seed(0) 
print "test lasso weighted" 
############################################## 
# Decomposition of a large number of signals 
############################################## 
# data generation 
X = np.asfortranarray(np.random.normal(size=(64,10000))) 
X = np.asfortranarray(X/np.tile(np.sqrt((X*X).sum(axis=0)),(X.shape[0],1)),dtype= myfloat) 
D = np.asfortranarray(np.random.normal(size=(64,256))) 
D = np.asfortranarray(D/np.tile(np.sqrt((D*D).sum(axis=0)),(D.shape[0],1)),dtype= myfloat) 
param = { 'L' : 20, 
    'lambda1' : 0.15, 'numThreads' : 8, 'mode' : spams.PENALTY} 
W = np.asfortranarray(np.random.random(size = (D.shape[1],X.shape[1])),dtype= myfloat) 
tic = time.time() 
alpha = spams.lassoWeighted(X,D,W,**param) 
tac = time.time() 
t = tac - tic 
print "%f signals processed per second\n" %(float(X.shape[1])/t) 

вы получите в качестве выходного сигнала матрицы А 64x1, который содержит только один ненулевой элемент. И это то же самое для каждого случая, которое он дает каждый раз только один ненулевой элемент на сигнал. Я не могу понять, почему решение при || x-Dα || 2 + λ || diag (w) α || 1. было бы с одним только ненулевым элементом?

ответ

0

Выходная матрица alpha должна иметь 10000 столбцов, так как X 64x10000 и 256 строк, так как словарь 64x256 (с Da = x). Таким образом, alpha должен быть 256x10000. Глядя на документы INRIA Spams, выход для LassoWeighted является:

Output: 
    A: double sparse p x n matrix (output coefficients) 

Параметр lambda1 определяет число не-нулей, так как он умножает l1 регуляризатором. Их реализация также имеет параметр L, который является максимальным числом ненулевых элементов на разреженный вектор.

Так что, если я запускаю следующее:

import spams 
import numpy as np 
import time 

np.random.seed(0) 
print "test lasso weighted" 
X = np.asfortranarray(np.random.normal(size=(64,10000))) 
X = np.asfortranarray(X/np.tile(np.sqrt((X*X).sum(axis=0)),(X.shape[0],1)),dtype=float) 
D = np.asfortranarray(np.random.normal(size=(64,256))) 
D = np.asfortranarray(D/np.tile(np.sqrt((D*D).sum(axis=0)),(D.shape[0],1)),dtype=float) 
param = { 'L' : 20, 
    'lambda1' : 0.15, 'numThreads' : 8, 'mode' : spams.PENALTY} 
W = np.asfortranarray(np.random.random(size = (D.shape[1],X.shape[1])),dtype=float) 
tic = time.time() 
alpha = spams.lassoWeighted(X,D,W,**param) 
tac = time.time() 
t = tac - tic 
non_zero = [] 
for col in alpha.T: 
    non_zero.append(col.nnz) 
print 'Shape Output Matrix:', alpha.shape 
print 'Min non-zeros of %d columns: %d'%(alpha.shape[1], np.min(non_zero)) 
print 'Max non-zeros of %d columns: %d'%(alpha.shape[1], np.max(non_zero)) 
print "%f signals processed per second\n" %(float(X.shape[1])/t) 

я получаю:

test lasso weighted 
Shape Output Matrix: (256, 10000) 
Min non-zeros of 10000 columns: 20 
Max non-zeros of 10000 columns: 20 
7691.130169 signals processed per second 

Таким образом, каждый из 10000 разреженных приближений, которые на самом деле 256x1 векторов, имеет 20 не-нулей.

Если мы изменили params до (максимум 5, не являющихся нулями):

param = { 'L' : 5, 
    'lambda1' : 0.15, 'numThreads' : 8, 'mode' : spams.PENALTY} 

Выход:

test lasso weighted 
Shape Output Matrix: (256, 10000) 
Min non-zeros of 10000 columns: 5 
Max non-zeros of 10000 columns: 5 
26600.540090 signals processed per second 

Если вы хотите более плотные редкие приближения (столбцы альфа), вы можете сделать L больше или избавиться от всего этого:

param = { 'lambda1' : 0.15, 'numThreads' : 8, 'mode' : spams.PENALTY} 

Выход:

test lasso weighted 
Shape Output Matrix: (256, 10000) 
Min non-zeros of 10000 columns: 40 
Max non-zeros of 10000 columns: 61 
1697.975321 signals processed per second 
Смежные вопросы