我正在开发一个 C# 项目,该项目使用主成分分析在 [,] 矩阵上应用特征缩减/降维。矩阵列是从一组电子邮件中提取的特征(单词和二元组)。一开始,我们收到了大约 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;
}
我们收到的组件随后使用 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。有谁知道如何解决这个问题吗?
最佳答案
关于c# - 如何解决使用主成分分析引发的 OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30122738/