Я предлагаю использовать KarhunenLoeveSVDAlgorithm
в OpenTURNS. Это обеспечивает 4 реализации случайного алгоритма SVD. Ограничение заключается в том, что число вычисляемых значений единственного числа должно быть установлено заранее.
Чтобы включить алгоритм, мы должны установить ключ KarhunenLoeveSVDAlgorithm-UseRandomSVD
в ResourceMap
. Затем клавиша KarhunenLoeveSVDAlgorithm-RandomSVDMaximumRank
устанавливает количество вычисляемых значений (по умолчанию оно равно 1000).
Предусмотрены две реализации:
- Натан Халко, Per- Гуннар Мартинссон, Джоэл А. Тропп. Нахождение структуры со случайностью: вероятностные алгоритмы c для построения приближенных матричных разложений,
- Натан Халко, Пер-Гуннар Мартиссон, Йоэль Школьнский и Марк Тигерт. Алгоритм анализа главных компонентов больших наборов данных.
Эти алгоритмы можно выбрать с помощью клавиши KarhunenLoeveSVDAlgorithm-RandomSVDVariant
.
В следующем примере я моделирую большую выборку процесса из гауссовского процесса с AbsoluteExponential
ковариационной моделью.
import openturns as ot
mesh = ot.IntervalMesher([10]*2).build(ot.Interval([-1.0]*2, [1.0]*2))
s = 0.01
model = ot.AbsoluteExponential([1.0]*2)
sampleSize = 100000
sample = ot.GaussianProcess(model, mesh).getSample(sampleSize)
Затем используется случайный алгоритм SVD:
ot.ResourceMap_SetAsBool('KarhunenLoeveSVDAlgorithm-UseRandomSVD', True)
algorithm = ot.KarhunenLoeveSVDAlgorithm(sample, s)
algorithm.run()
result = algorithm.getResult()
Объект result
содержит разложение Кархунена-Лоэва обработать. Это соответствует PCA с регулярной сеткой (и равными весами).