2013-11-02 2 views
5

Привет всем Я python новичок Я должен реализовать регрессию lasso L1 для назначения класса. Это включает в себя решение квадратичного уравнения с блочными матрицами.Умножение матричных матриц в Numpy

minimize x^t * H * x + f^t * x 
where x > 0 

Где H представляет собой блок-матрица 2 × 2 с каждым элементом, являющимся к мерной матрице и х и е будучи 2 х 1 векторы причем каждый элемент A K вектор размерности.

Я думал об использовании ndarrays.

Такой, что:

np.shape(H) = (2, 2, k, k) 
    np.shape(x) = (2, k) 

Но я понял, что np.dot (X, H) не работает здесь. Есть ли простой способ решить эту проблему? Заранее спасибо.

ответ

1

Прежде всего, я убежден, что преобразование в матрицы приведет к более эффективным вычислениям. Заявив, что если вы считаете, что ваша матрица 2k x 2k является матрицей 2 x 2, вы работаете в тензорном произведении векторных пространств и должны использовать tensordot вместо dot.

Пусть дать ему попробовать, с к = 5, например:

>>> import numpy as np 
>>> k = 5 

Определить нашу матрицу a и вектор x

>>> a = np.arange(1.*2*2*k*k).reshape(2,2,k,k) 
>>> x = np.arange(1.*2*k).reshape(2,k) 
>>> x 
array([[ 0., 1., 2., 3., 4.], 
     [ 5., 6., 7., 8., 9.]]) 

теперь мы можем Multipy наши тензоры. Не забудьте выбрать правильную ось, я не испытывался в формуле explicetely, и там могу быть ошибка

>>> result = np.tensordot(a,x,([1,3],[0,1])) 
>>> result 
array([[ 985., 1210., 1435., 1660., 1885.], 
     [ 3235., 3460., 3685., 3910., 4135.]]) 
>>> np.shape(result) 
(2, 5) 
+0

Большое спасибо! который работал как шарм –

+0

@AdaXu, пожалуйста. Если ваша проблема решена, не стесняйтесь отметить наиболее полезный ответ, как принято, [узнайте, как и почему] (http://meta.stackexchange.com/a/5235) – alko

1

np.einsum дает хороший контроль над которыми осями суммируются.

np.einsum('ijkl,jk',H,x) 

является одним из возможных (обобщенный) скалярное произведение, (2,4) (первый и последний тусклый Н)

np.einsum('ijkl,jl',H,x) 

это другое. Вам нужно быть явным - какие размеры x идут с H.

+0

Спасибо большое! Я рассмотрю einsum –