Во многих областях знания выполняется предположение, что воздействие разных факторов на наблюдаемый сигнал разделяется на функции от независимых переменных:
Тогда можно измерить сигнал при всех комбинациях всех переменных, получить многомерную (
) матрицу наблюдений и оценить профили по каждому из измерений, минимизируя сумму квадратов ошибок восстановления:
Минимизацию обычно выполняют методом покоординатного спуска (alternating least squares), по очереди фиксируя все, кроме одной, матрицы, вычисляя новые оптимальные значения для оставшейся, затем повторяя процесс, пока не выполнится критерий остановки (относительное изменение параметров меньше заданного порога).
Такой метод называется PARAFAC или CANDECOMP. При этом встаёт вопрос выбора числа компонентов
: чем оно больше, тем меньше, естественно, будет ошибка восстановления, но тем менее будут определены сами получающиеся компоненты. Принятым в сообществе способом проверки решения на переобученность является вариант кросс-валидации, когда по одной из осей (например, по той, по которой располагаются отдельные образцы) многомерный массив делят на 2 половины, выполняют PARAFAC для каждой и сравнивают компоненты по оставшимся осям. По идее, хорошо обученная модель должна описывать данные только одним способом (минимум ошибки восстановления в пространстве значений матриц
только один и компактно расположен), а переобученная - иметь широкую, как сковородка, область, в которой данные описываются с примерно одинаковой ошибкой. Может быть, определить, насколько узка область оптимума, можно аналитически?
В
Numerical recipes: the art of scientific computing. W.H. Press, 3rd ed., Cambridge, UK; New York: Cambridge University Press, 2007 §§15.5.1-15.6 рассказывается о том, как оценивать доверительные интервалы параметров, находимых методом наименьших квадратов, если предположение о нормальности распределения остатков выполняется.
(Numerical Recipes о методе наименьших квадратов)
Пусть выполняется поиск параметров
для множества точек
. Тогда минимизировать нужно функционал:
Вдали от оптимума решение производится шагами градиентного спуска
; вблизи оптимума функцию можно считать квадратичной формой
где компоненты вектора
- первые производные
по параметрам
, а матрицы
- вторые производные:
Причём
Numerical Recipes советует игнорировать слагаемое
, поскольку вблизи оптимума вторая производная должна быть близка к нулю, а
- случайная ошибка измерения. Так что если определить матрицу
первых производных аппроксимируемой функции
, то
.
Имея гессиану
,
, посчитанную в найденном оптимуме, мы можем обратить её и получить матрицу ковариации
, после чего использовать диагональные элементы для оценки доверительных интервалов:
(где
- обратная функция распределения хи-квадрат с данным числом степеней свободы).
Я попробовал выписать производные:
и посчитать
как
, но матрица получилась необратимой. Код на R:
Код:
# install.packages('multiway')
library(multiway)
# взято из example(parafac):
# сформируем данные, удовлетворяющие требованиям PARAFAC
set.seed(3)
mydim <- c(50, 20, 5)
nf <- 3
Amat <- matrix(rnorm(mydim[1]*nf), nrow = mydim[1], ncol = nf)
Bmat <- matrix(runif(mydim[2]*nf), nrow = mydim[2], ncol = nf)
Cmat <- matrix(runif(mydim[3]*nf), nrow = mydim[3], ncol = nf)
Xmat <- tcrossprod(Amat, krprod(Cmat, Bmat))
Xmat <- array(Xmat, dim = mydim)
# добавим шум
Emat <- array(rnorm(prod(mydim)), dim = mydim)
Emat <- nscale(Emat, 0, ssnew = sumsq(Xmat)*.1)
X <- Xmat + Emat
# рассчитаем оценки Amat, Bmat, Cmat
pfac <- parafac(X, nfac = nf, nstart = 1)
pfac
# J: матрица производных X[i,j,k] по cbind(A,B,C)[l,r]
J <- array(data = 0, dim = c(mydim, sum(mydim), nf))
for (i in 1:mydim[1]) for (j in 1:mydim[2]) for (k in 1:mydim[3]) for (r in 1:nf) {
# d X[i,j,k] / d A[i,r] = B[j,r]*C[k,r]
J[i, j, k, 0+i, r] <- pfac$B[j,r] * pfac$C[k,r]
# d X[i,j,k] / d B[j,r] = A[i,r]*C[k,r]
J[i, j, k, mydim[1]+j, r] <- pfac$A[i,r] * pfac$C[k,r]
# d X[i,j,k] / d C[k,r] = A[i,r]*B[j,r]
J[i, j, k, mydim[1]+mydim[2]+k, r] <- pfac$A[i,r] * pfac$B[j,r]
}
# развернём первые 3 измерения ("образцы") и последние 2 ("переменные"), получим якобиан
dim(J) <- c(prod(mydim), sum(mydim)*nf)
# посчитаем оценку гессианы и попытаемся её обратить
C <- solve(crossprod(J))
Согласно сообщению об ошибке, число обусловленности у такой матрицы получается порядка
. Обычное замечание в таком случае - это свидетельствует об очень плохо поставленной задаче, не удовлетворяющей модели - не похоже на правду: метод PARAFAC широко используется, о нём публикуются статьи в признанных в сообществе журналах, его продолжают развивать. Где я допускаю ошибку? Почему для данного вида задачи на наименьшие квадраты не получается найти матрицу ковариации?