Покопавшись в коде я обнаружил, что недокументированная регуляризация все же добавлена но в странном виде. Одним из параметров идет число которое можно задать перед вычислением, далее в коде как Вы и говорите единичный тензор умножается на это число и далее эта конструкция прибавляется к псевдо инверсии на каждой итерации. Очевидно данное значение регуляризатора никак не модифицируется в ходе вычислений. А Ваш Тихоновский должен вычисляться каждый цикл.
Там же есть еще один параметр, ограничитель максимального числа итераций.
Имея эти 2 рычага можно исправить данный недостаток ограничив функцию решателя до 1 итерации и вычислять регуляризатор Тихонова.
в нейчере это есть, особенно если по супплементу погулять и посмотреть как мы это делали.
Опа, а вот это я упустил. Ну ничего прочитал сейчас.
Но я до сих пор не могу понять что получается на выходе разложения. Помимо векторов решения есть еще какие то веса, что это за веса? У меня они почему то всегда равны 1.
Давайте рассмотрим пример. Например у нас будут 2 гармоники:
Код генерации и вывод программы
(Оффтоп)
Код:
signal1 = np.empty((Length,))
signal2 = np.empty((Length,))
for i in range(Length):
signal1[i] = 0.0 + 10.0 * math.sin(i/100 * 2.0*math.pi*1.3 + 0.0)
signal2[i] = 0.0 + 10.0 * math.sin(i/100 * 2.0*math.pi*10.0 + 0.0)
signal = signal1 + signal2
Дискретные значения:
0. 6.69375864 11.13693681 11.93655747 9.08728862
3.97147891 -1.1708132 -4.09935264 -3.43126219 0.82900324
7.28968627 13.70176063 17.81652415 18.24318971 14.97891223
9.40880769 3.77596387 0.32388689 0.43894501 4.120371
9.98026728 15.77361371 19.25583389 19.04035858 15.12862459
8.91006524 2.6320923 -1.45748631 -1.96805136 1.10380167
6.3742399 11.60217378 14.54679718 13.82512562 9.44197131
2.78991106 -3.88075272 -8.31959356 -9.13366334 -6.31753371
-1.25333234 3.81922644 6.66037254 5.8878115 1.50669486
-5.09041416 -11.65357956 -15.93309169 -16.53706486 -13.46147168
-8.09016994 -2.66492179 0.57215092 0.23611363 -3.67079292
-9.75916762 -15.78246678 -19.49458066 -19.50740706 -15.82086043
-9.82287251 -3.75938426 0.12322659 0.43572092 -2.82398502
-8.27080574 -13.66247554 -16.75709646 -16.17068384 -11.90714794
-5.35826795 1.22634174 5.59682849 6.36069997 3.51286255
-1.56434465 -6.63112058 -9.44773372 -8.6320532 -4.18951808
2.48689887
Выбираю 81 значение, основание системы счисления 3, ранк 5
Код:
fac = (weights, factors) : rank-5 CPTensor of shape (3, 3, 3, 3)
weights = [1. 1. 1. 1. 1.]
factors = [array([
[-1.52870949, 1.33616223, 0. , 0.0862158 , -1.54259496],
[-1.87217963, -0.178804 , 0. , -1.35967955, -1.58081122],
[-1.89511359, -2.00860176, 0. , -2.55644413, -1.43904873]]),
array([
[ 0.19385824, -0.91555159, 0. , 1.76845806, 1.13059629],
[-2.438654 , -0.70153956, 0. , -0.28094468, 2.1881782 ],
[-1.8571081 , 2.12635579, 0. , -2.27710218, 0.93970888]]),
array([
[ 0.92023131, -1.83597749, 0. , 1.68339403, -1.60299346],
[ 1.98287081, -1.48736182, 0. , 1.91761919, 0.28275873],
[ 2.15751304, -0.51838487, 0. , 1.37130937, 2.07361618]]),
array([
[ 2.21854656, 1.15246083, 0. , -2.04440791, 0.07835575],
[-0.16318326, -2.12633716, 0. , 1.57984291, 1.7510471 ],
[-2.11775522, -0.04801803, 0. , 1.30998508, -1.96904012]])]
Что есть что?
Не понимаю, что из этого есть альфа (из чего Тихоновский регуляризатор считается)?
Там написано, что в разложении каждый вектор представляет точки экспоненты.
Значит, если я возьму первый вектор:
Код:
[-1.52870949, 1.33616223, 0. , 0.0862158 , -1.54259496]
Это точки одной экспоненты?
Нужно ли до разложения вычитать константную составляющую из данных?
А как получите нормальное разложение - просто в каждой компоненте у вас будет своя экспонента, которую можно просто по нескольким точкам построить (вернее аппроксимировать) но тут уже можно например, отлогарифмировать и в лоб МНК по двум параметрам.
Как это логарифмировать если есть и нули и отрицательные значения?
Если мое разложение не верно, можно Вас попросить, не могли бы Вы эти данные разложить и представить результат, чтобы я мог понять как сделать верное разложение.