Я работаю над проектом на С#, который использует анализ основных компонентов для применения уменьшения характеристик/уменьшения размеров к матрице [,]. Столбцы матрицы представляют собой функции (слова и биграммы), извлеченные из набора электронных писем. В начале у нас было около 156 писем, что привело к примерно 23000 терминов, и все работало, как и предполагалось, используя следующий код:
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;
}
Полученные нами компоненты были классифицированы позже с использованием метода Classify линейного дискриминантного анализа из среды Accord.NET. Все работало как надо.
Теперь, когда мы увеличили размер нашего набора данных (1519 электронных писем и 68375 терминов), мы сначала получили некоторые исключения OutOfMemory. Мы смогли решить эту проблему, изменив некоторые части нашего кода, пока не смогли добраться до той части, где мы вычисляем компоненты PCA. Сейчас это занимает около 45 минут, что слишком долго. После проверки веб-сайта Accord.NET на 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. кто-нибудь знает, как решить эту проблему?
bool is64 = Environment.Is64BitProcess
) - person xanatos   schedule 08.05.2015