В Haskell, ridge regression может быть выражена как:Сколько пространства требуется для регрессии гребня?
import Numeric.LinearAlgebra
createReadout :: Matrix Double → Matrix Double → Matrix Double
createReadout a b = oA <\> oB
where
μ = 1e-4
oA = (a <> (tr a)) + (μ * (ident $ rows a))
oB = a <> (tr b)
Однако, эта операция очень дорого памяти. Вот минималистский пример, который требует более 2 ГБ на моей машине и занимает 3 минуты.
import Numeric.LinearAlgebra
import System.Random
createReadout :: Matrix Double -> Matrix Double -> Matrix Double
createReadout a b = oA <\> oB
where
mu = 1e-4
oA = (a <> (tr a)) + (mu * (ident $ rows a))
oB = a <> (tr b)
teacher :: [Int] -> Int -> Int -> Matrix Double
teacher labelsList cols' correctRow = fromBlocks $ f <$> labelsList
where ones = konst 1.0 (1, cols')
zeros = konst 0.0 (1, cols')
rows' = length labelsList
f i | i == correctRow = [ones]
| otherwise = [zeros]
glue :: Element t => [Matrix t] -> Matrix t
glue xs = fromBlocks [xs]
main :: IO()
main = do
let n = 1500 -- <- The constant to be increased
m = 10000
cols' = 12
g <- newStdGen
-- Stub data
let labels = take m . map (`mod` 10) . randoms $ g :: [Int]
a = (n >< (cols' * m)) $ take (cols' * m * n) $ randoms g :: Matrix Double
teachers = zipWith (teacher [0..9]) (repeat cols') labels
b = glue teachers
print $ maxElement $ createReadout a b
return()
$ междусобойчик Exec GHC - -O2 Test.hs
$ Время ./test
./test 190.16s пользователя 5.22s система 106% CPU 3: 03,93 общая
Задача состоит в том, чтобы увеличить константу n, по крайней мере, до n = 4000, в то время как оперативная память ограничена 5 ГБ. Что такое минимальное пространство, которое требует теория преобразования матрицы? Как оптимизировать эту операцию с точки зрения пространства? Может ли регрессия гребня быть эффективно заменена более дешевым методом?
Я читаю это право, 'a' является матрицей 1500 x 120000? –
Полностью правильно. И это может быть еще больше. – penkovsky
Являются ли матрицы [разреженными] (https://en.wikipedia.org/wiki/Sparse_matrix)? Это может сэкономить вам много места и времени (но вам, вероятно, понадобится выделенный алгоритм, такой как [сопряженный градиент] (https://en.wikipedia.org/wiki/Conjugate_gradient_method)). – leftaroundabout