我正在尝试通过Accord框架实现PCA,以实现降维(即功能减少)。基本上,我有一个包含超过23000个功能的大矩阵。这些都是从一组文档中提取的所有功能。一个非常简单的是矩阵的概述如下所示:如何使用主成分分析来应用特征缩减? (C#,Accord)
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个特征(以后需要进行分类)。为了让我们认识到这一点,我们需要使用减少特征/维度数量的东西。所以我们做了一些搜索,并且遇到了协议框架,内核PCA,ALGLIB等等。他们对我们都非常含糊,因为我们没有PCA背景,而且我们也远离数学家。
所以我们选择,因为它看起来很容易实现,通过使用用于测试目的下面的代码使用协议框架:
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();
此代码将打印起因于变换方法在控制台矩阵。由于我们并不真正了解所有数字的含义以及它们如何帮助减少这些特征,因此我们决定在datagridview中查看组件矩阵,通过在与前面的代码示例完全相同的矩阵上使用此代码:
// 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?
如果您需要从23000到20功能减少数据进一步说明,经过20作为pca.Transform的第二个参数,即:var features = pca.Transform(sourceMatrix,20); – Cesar
有一个非常简单的PCA PCA介绍,名为“主要组件分析教程”,Lindsay Smith,可在此处获得:http://www.cs.otago.ac.nz/cosc453/student_tutorials/principal_components.pdf 我还创建了一个配套材料,解释如何在Accord.NET中关注Lindsay的教程:http://arxiv.org/abs/1210.7463 – Cesar
感谢您的分享,我在研究过程中已经遇到了您的一些工作,证明有帮助。 – Redesign1991