使用PCA对handwritten digits进行分类。列车阶段使用200位数字,测试使用20位数字。
我不知道PCA如何作为分类方法。我已经学会用它作为降维方法,我们从它的平均值中减去原始数据,然后我们计算协方差矩阵,特征值和特征向量。从那里,我们可以选择主要组件而忽略其余组件。我应该如何对一堆手写数字进行分类?如何区分不同类别的数据?
答案 0 :(得分:3)
如果您绘制从PCA获得的分数,您将看到某些类将产生一个群集。
简单R脚本:
data <- readMat(file.path("testzip.mat"))$testzip
pca <- princomp(t(data))
plot(pca$scores)
会屈服于这样的情节:
我无法对其进行着色,因为mat文件不包含数字类向量的结果。但是,您至少看到一个集群可以帮助您将该单个类别与其他类别进行分类(其他东西看起来像噪音?)。
Olivier Grisel(scikit-learn的贡献者)也回答了关于metaoptimize的问题:
How to use PCA for classification?
他说这实际上是一种无监督的降维方法,但是可以用一些奇特的方法进行分类:
实际上我已经找到了另一种方法来进行“PCA分类” StéphaneMallat讲的这个讲话:每个班级都用仿射来近似 歧管,第一个分量为方向,质心为 偏移量和新样本通过测量距离来分类 具有正交投影的最近流形。
谈话:https://www.youtube.com/watch?v=lFJ7KdSdy0k(非常有趣 对于简历人来说)
但我认为这对你来说太过分了。如果您有类标签,则可以使用任何分类器在PCA输出上解决此问题。如果没有,请选择基于密度的聚类,如DBSCAN,看看它是否找到了您在那里看到的聚类,并使用它来对新图像进行分类(例如,通过与聚类平均值的距离)。
答案 1 :(得分:1)
是的,正如Thomas Point所说,基本上PCA和相关技术是减少维数的工具。我们的想法是通过仅获取最重要的信息并将其映射到低维子空间来对抗"curse of dimensionality"。在这个子空间中,您可以使用更简单的技术对数据进行实际分类或聚类。
您可以从简单的K nearest neighbors到Support Vector Machines进行分类。为此,您还需要数据的标签。
让我们尝试使用kNN最简单的方法(不一定是最好的方法):
现在,为了执行分类,您需要另一个带有实际标签的矢量。假设您有100张16x16像素的图像。在这100个中,你有10个数字“0”,10个数字“2”,依此类推。
拍摄图像并将其设为1x1600的矢量。还可以使用“标签”创建100x1向量。在matlab中就像是:
labels = kron([0:1:9],ones(1,10))
现在将PCA应用于您的数据(假设每个图像都是矩阵sampleimgs
的列 - 所以256x100矩阵),您也可以这样做
用svd:
[coeff,scores]= pca(sampleimgs');
要将它们发送到你想要的低维空间(比如R ^ 2) - 所以只选择两个第一主成分:
scatter(scores(:,1),scores(:,2))
现在,您可以对这些应用K-NN,并在将新的传入图像newimg
发送到同一个PC子空间后对其进行分类:
mdl = ClassificationKNN.fit(scores(1:100,[1 2]),labels);
%get the new image:
newimgmap = coef(:,1:2)'*newimg
result = predict(mdl,newimgmap)
希望它有所帮助。
答案 2 :(得分:0)
Ding and He (2004)表明通过PCA降低维数和通过k均值聚类是密切相关的。聚类a.k.a.无监督学习仍然不是a.k.a.监督学习的分类,但正如其他人所指出的那样,聚类可能有助于识别属于不同数字的数据点组。