使用 PCA 对手写数字进行分类。训练阶段使用 200 位,测试阶段使用 20 位。
我不知道 PCA 是如何作为一种分类方法工作的。我学会了用它作为一种降维方法,我们从平均值中减去原始数据,然后计算协方差矩阵、特征值和特征向量。从那里,我们可以选择主成分并忽略其余部分。我应该如何对一堆手写数字进行分类?如何区分不同类别的数据?
使用 PCA 对手写数字进行分类。训练阶段使用 200 位,测试阶段使用 20 位。
我不知道 PCA 是如何作为一种分类方法工作的。我学会了用它作为一种降维方法,我们从平均值中减去原始数据,然后计算协方差矩阵、特征值和特征向量。从那里,我们可以选择主成分并忽略其余部分。我应该如何对一堆手写数字进行分类?如何区分不同类别的数据?
如果您绘制从 PCA 获得的分数,您会看到某些类将屈服于一个集群。
简单的 R 脚本:
data <- readMat(file.path("testzip.mat"))$testzip
pca <- princomp(t(data))
plot(pca$scores)
会产生这样的情节:
我无法为它着色,因为 mat 文件不包含向量到数字类的结果。但是,您至少会看到一个集群,它可以帮助您将该单个类与其他类进行分类(其他东西看起来像噪音?)。
Olivier Grisel(scikit-learn 的贡献者)也回答了您关于元优化的问题:
他说这实际上是一种无监督的降维方法,但是可以用一些花哨的方法进行分类:
实际上,我在 Stéphane Mallat 的演讲中找到了另一种“使用 PCA 分类”的方法:每个类都由仿射流形近似,第一个分量作为方向,质心作为偏移量,新样本通过测量到最近的距离进行分类具有正交投影的流形。
谈话:https ://www.youtube.com/watch?v=lFJ7KdSdy0k (对简历人来说很有趣)
但我认为这对你来说太过分了。如果你有类标签,你可以使用任何分类器来适应 PCA 输出上的这个问题。如果没有,请选择一个基于密度的聚类,例如 DBSCAN,看看它是否找到了您在那里看到的聚类,并使用它对新图像进行分类(例如,通过与聚类平均值的距离)。
是的,正如 Thomas 指出的那样,基本上 PCA 和相关技术是进行降维的工具。这个想法是通过只获取最重要的信息并将其映射到低维子空间来对抗“维度诅咒” 。在这个子空间中,您可以使用更简单的技术对数据进行实际分类或聚类。
您可以从简单的K 最近邻到支持向量机进行分类。为此,您还需要数据的标签。
让我们尝试使用 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)
希望能帮助到你。
Ding 和 He (2004)表明,通过 PCA 进行降维和通过 k-means 进行聚类是密切相关的。聚类又名无监督学习仍然不是分类又名监督学习,但正如其他人指出的那样,聚类可能有助于识别属于不同数字的数据点组。