c# - 如何解决使用主成分分析引发的 OutOfMemoryException

标签 c# machine-learning classification pca accord.net

我正在开发一个 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。有谁知道如何解决这个问题吗?

最佳答案

我认为并行化你的求解器是最好的选择。

也许像 FEAST 这样的东西会有所帮助。

http://www.ecs.umass.edu/~polizzi/feast/

Parallel linear algebra for multicore system

关于c# - 如何解决使用主成分分析引发的 OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30122738/

相关文章:

c# - 在 C# (.NET) 中是否有任何函数可以相应地比较字符串的长度?

python-3.x - 类型错误 : 'Tensor' object is not iterable

java - 文本分类分类器

f# - 使用人工智能 (AI) 预测股票价格

c# - 查找以前关注的应用程序 - WinAPI

c# - COM 类可见性 : C# to VB6

c# - 如何使匿名类型的属性名称动态化?

python - 使用 RNN 的神经机器翻译背景下的投影层是什么?

machine-learning - 迁移学习和线性分类器

python - 神经网络的准确性非常差