Я работаю над проектом на C#, который использует компонентный компонентный анализ, чтобы применить уменьшение функции/уменьшение размера в матрице [,]. Матричные столбцы - это функции (слова и биграммы), которые были извлечены из набора писем. В начале у нас было около 156 писем, в результате которых около 23000 терминов и все работало, как это предполагалось, используя следующий код:Как решить OutOfMemoryException, которое выбрасывается с использованием анализа основных компонентов
public static double[,] GetPCAComponents(double[,] sourceMatrix, int dimensions = 20, AnalysisMethod method = AnalysisMethod.Center)
{
// Create Principal Component Analysis of a given source
PrincipalComponentAnalysis pca = new PrincipalComponentAnalysis(sourceMatrix, method);
// Compute the Principal Component Analysis
pca.Compute();
// Creates a projection of the information
double[,] pcaComponents = pca.Transform(sourceMatrix, dimensions);
// Return PCA Components
return pcaComponents;
}
компоненты, которые мы получили классифицировались позже с помощью метода линейный дискриминантный анализ Классифицировать из рамки Accord.NET. Все работало так, как должно.
Теперь, когда мы увеличили размер набора данных (1519 писем и 68375 терминов), мы сначала получали некоторые исключения OutOfMemory. Мы смогли решить эту проблему, отрегулировав некоторые части нашего кода, пока мы не смогли достичь той части, где мы вычисляем компоненты PCA. Сейчас это занимает около 45 минут, что слишком долго. После проверки the website of Accord.NET on PCA мы решили попробовать и использовать последний пример, который использует матрицу ковариации, поскольку он говорит: «Некоторые пользователи хотели бы анализировать огромные объемы данных. В этом случае вычисление SVD непосредственно на данных может привести к исключениям в памяти или чрезмерное время вычислений ". Поэтому мы изменили наш код на:
public static double[,] GetPCAComponents(double[,] sourceMatrix, int dimensions = 20, AnalysisMethod method = AnalysisMethod.Center)
{
// Compute mean vector
double[] mean = Accord.Statistics.Tools.Mean(sourceMatrix);
// Compute Covariance matrix
double[,] covariance = Accord.Statistics.Tools.Covariance(sourceMatrix, mean);
// Create analysis using the covariance matrix
var pca = PrincipalComponentAnalysis.FromCovarianceMatrix(mean, covariance);
// Compute the Principal Component Analysis
pca.Compute();
// Creates a projection of the information
double[,] pcaComponents = pca.Transform(sourceMatrix, dimensions);
// Return PCA Components
return pcaComponents;
}
Это, однако, вызывает исключение System.OutOfMemoryException. кто-нибудь знает, как решить эту проблему?
Перейти на x64 и установить больше памяти? – xanatos
Насколько велика матрица источника входного массива? Является ли исключение также поднятым, если вы предоставляете только одну запись? –
У меня квад CPU Q9300 2.50GHz - оперативная память 8 ГБ и 64-разрядная операционная система, поэтому я не уверен, проблема в этом или нет. При использовании первого примера выборки кода не выдает ошибку, но занимает + - 45 минут. Использование ковариационной матрицы должно быть лучше, но порождает ошибку. – Redesign1991