gpt4 book ai didi

c# - 如何使用主成分分析应用特征约简? (C#,雅阁)

转载 作者:行者123 更新时间:2023-11-30 20:44:14 24 4
gpt4 key购买 nike

我正在尝试通过Accord框架实现PCA,以实现尺寸缩减或特征缩减。基本上,我有一个包含23000多个功能的大型矩阵。这些都是从一组文档中提取的功能。该矩阵的非常简单的概述如下所示:

      dog    cat    fish
doc1 0,024 0,011 0,008
doc2 0,011 0,014 0,007
doc3 0,005 0,024 0,003
doc4 0,008 0,028 0,008
doc5 0,002 0,03 0,006


矩阵中的数字对应于我们在程序中计算出的术语频率-反向文档频率。基本上,这向我们显示了该术语在特定文档中出现了多少次。这对我们来说是有用的信息,因为我们将需要它来确定矩阵中的哪个术语可以稍后用作分类的功能。

由于我们有大约23000个可能的功能(并且#将来只会增加),因此我们需要将其减少为20个功能(稍后需要分类)。为了使我们意识到这一点,我们需要使用减少特征/尺寸数量的东西。因此,我们进行了一些搜索,并遇到了Accord框架,内核PCA,ALGLIB等。它们对我们来说都是很模糊的,因为我们在PCA中没有任何背景并且与数学家相距甚远。

因此,我们选择使用Accord框架,因为它看起来易于实现,通过使用以下代码进行测试:

double[,] sourceMatrix = 
{
{ 2.5, 2.4 },
{ 0.5, 0.7 },
{ 2.2, 2.9 },
{ 1.9, 2.2 },
{ 3.1, 3.0 },
{ 2.3, 2.7 },
{ 2.0, 1.6 },
{ 1.0, 1.1 },
{ 1.5, 1.6 },
{ 1.1, 0.9 }
};

// Creates the Principal Component Analysis of the given source
var pca = new PrincipalComponentAnalysis(sourceMatrix, AnalysisMethod.Center);

// Compute the Principal Component Analysis
pca.Compute();

// Creates a projection
double[,] components = pca.Transform(sourceMatrix);

for (int i = 0; i < components.GetLength(0); i++)
{
for (int j = 0; j < components.GetLength(1); j++)
{
Console.WriteLine(components[i, j]);
}
}

Console.ReadLine();


此代码将打印由控制台中的Transform方法产生的矩阵。由于我们并不真正理解所有数字的含义以及它们如何帮助简化功能,因此我们决定通过在与上一个代码示例完全相同的矩阵上使用此代码,来查看datagridview中的Components矩阵:

    // Creates the Principal Component Analysis of the given source
var pca = new PrincipalComponentAnalysis(sourceMatrix, AnalysisMethod.Center);

// Compute the Principal Component Analysis
pca.Compute();

// Display
dgvPCA.DataSource = pca.Components;
dgvPCA.Columns["Analysis"].Visible = false;


这将返回比例,累积比例,奇异值和特征值。同样,没有任何线索。

那么,我们如何应用该原理将+23000个项的矩阵减小到+-20?

最佳答案

免责声明:我将提出一个无法解决您问题中所有要点的答案。 TL; DR:在底部提供建议

主成分(PC)只是多个要素的投影(线性组合),其中要素是沿某个维度的值(通常是观测值或测量值)的向量。

对于您的问题,功能似乎是术语的“术语频率-反向文档频率”,每个文档都有一个“度量”。所有文档的所有功能均形成一个矩阵。

主成分分析(PCA)的作用是通过找到这些主成分(您可以将其视为抽象特征,有时也称为“隐藏特征”)来转换(或分解)此矩阵。如前所述,它们只是原始项向量的线性组合,如下所示:

PC1 = 0.1 * Cat + 0.001 * Dog - 0.8 * Fish ... `
PC2 = 0.0001 * Cat - 0.102 * Dog + 0.1 * Fish ...`
...
PCN = 0.00000001 * Cat - 0.0000000001 * Dog + 0.00000000000001 * Fish ....


其中N与要素的原始数量相同,并且这些值(0.1、0.001,-0.8,...)表示给定PC上每个要素的负载,表示原始术语与PC的关系。高正或负值表示该术语与PC的高正或负相关性。

找到的主要成分的重要属性是它们是 orthogonal,即不相关,这在视觉上很好地说明了 here

您可能会想像一下自己,通过想象自己正在看带有数据点云(x和y的单个观测值)的2d xy散点图(x和y是两个特征),然后尝试旋转和平移轴,而数据点保持静止。



首先,您尝试旋转x轴,使其与点云的中心相交,就像线性回归线一样。接下来,将Y轴移动(平移)到点云的中心。 X和Y轴的旋转和平移位置是您的主要组件。



您可能已经注意到,主要组件按其等级编号。等级最低的组件解释了原始数据集中最大的方差。对于上面的示例图像,您可以清楚地看到,“ PCA轴1”比“ PCA轴2”解释了更多的差异。

通常,可以解释数据集中所有方​​差的大部分的PC数量将比N个输入要素小得多。这样,您可以通过选择解释足够数量差异的第一批 X PC来减少特征尺寸的数量。

您可以做的另一件事是查看PC上的所谓得分。这是在PC上查看每个文档的分数,即它对给定PC的贡献。

可以找到更详尽的介绍性文本 here以及其中一些概念的示例 herehere

回到您的问题,我对您的建议:

将主成分分析应用于一个复杂的问题(例如从减少的术语集中对文档进行分类)绝非易事,并且需要对PCA和您要解决的分类问题有透彻的了解。

我建议您尝试寻找/雇用该领域的专家,他可以为您提供指导,并通过向您提出重要问题来帮助您沿着正确的道路前进。

进行更多研究以更好地了解特征缩减和分类方法也将是明智的,这些方法已在其他地方用于解决与您要解决的问题类似的问题。

此外,建议使用专门针对此类数据分析的工具(例如SAS,Matlab,R等)来开发和验证特征选择和分类方法。验证方法之后,如果您需要在c#软件中实施这些方法,请寻找最合适的工具(可以是Accord)。

关于c# - 如何使用主成分分析应用特征约简? (C#,雅阁),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29649533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com