tf 如何进行svd_c#-如何在Accord.net中正确使用SVD

SVD代表奇异值分解,据说是在文本分类中进行特征缩减的流行技术.我知道原理是this link.

我一直在使用C#,并使用Accord.Net库,并且已经通过计算TF-IDF获得了锯齿状数组double [] [].

我已经知道我的文档中有4个主题.我想用k = 4的簇数测试Kmean方法.在使用Kmean之前,我想使用SVD进行特征约简.结果显示时,将近90%的文档分为1组,其他文档则分为3个其他类.这是非常糟糕的结果.我尝试重新运行了很多次,但结果并没有太大变化.如果我使用PCA而不是SDV,那么一切都按预期完成.

所以,我错了.任何知道这一点的人都可以为我提供示例代码.非常感谢.

注意:我的原始TF-IDF有代表文档的行,代表术语的列

这是我的代码:

//to matrix because the function SVD requiring input of matrix, not jagged array

//transpose because the TF-IDF used for SVD has rows representing terms, columns representing documents;

var svd = new SingularValueDecomposition(tfidf.ToMatrix().Transpose());

double[,] U = svd.LeftSingularVectors;

double[,] S = svd.DiagonalMatrix;

double[,] V = svd.RightSingularVectors;

//find the optimal cutoff y so that we retain enough singular values to make up 90% of the energy in S

//http://infolab.stanford.edu/~ullman/mmds/ch11.pdf, page 18-20

double energy = 0;

for (int i = 0; i < S.GetLength(0); i++)

{

energy += Math.Pow(S[i, i], 2);

}

double percent;

int y = S.GetLength(0);

do

{

y--;

double test = 0;

for (int i = 0; i < y; i++)

{

test += Math.Pow(S[i, i], 2);

}

percent = test / energy;

} while (percent >= 0.9);

y = y + 1;

//Uk gets all rows, y first columns of U; Sk get y first rows, y first columns of S; Vk get y first rows, all columns of V

double[,] Uk = U.Submatrix(0, U.GetLength(0) - 1, 0, y - 1);

double[,] Sk = S.Submatrix(0, y - 1, 0, y - 1);

double[,] Vk = V.Submatrix(0, y - 1, 0, V.GetLength(1) - 1);

//reduce dimension according to http://stats.stackexchange.com/questions/107533/how-to-use-svd-for-dimensionality-reduction-to-reduce-the-number-of-columns-fea

//we tranpose again to have the rows being document, columns being term as original TF-IDF

//ToArray because the Kmean below acquiring input of jagged array

tfidf = Uk.Multiply(Sk).Transpose().ToArray();

// if tfidf = Uk.Multiply(Sk).Multiply(Vk).Transpose().ToArray()

// result still bad

// Create a K-Means algorithm using given k and a square Euclidean distance as distance metric.

var kmeans = new KMeans(4, Distance.SquareEuclidean) { Tolerance = 0.05 };

int[] labels = kmeans.Compute(tfidf);

之后,根据标签,我们将采取一些步骤来了解哪些文档属于哪些组.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值