将 PCA 应用于一维数组
Applying PCA to one-dimensional array
我的大学项目要求我分析、讨论和改进现有的图像人脸识别实现。
作为输入数据,我得到了 n*m 矩阵,其中:
- 'n'是图片的数量,在我这里是1500张。
- 'm' 是一个扁平化(矢量化)像素矩阵,因此只是一个一维数组。它从一个 77*78 矩阵转换为一个 5236 元素长列表的灰度值 (0-255)。
看起来像:
[[254. 254. 236. ... 15. 20. 21.]
[ 49. 55. 61. ... 57. 69. 60.]
[129. 137. 159. ... 15. 15. 15.]
...
[ 44. 49. 60. ... 7. 8. 8.]
[229. 221. 201. ... 16. 16. 16.]
[120. 116. 112. ... 7. 7. 7.]]
在给定示例的某个时刻,在训练模型之前,将此数据应用于 PCA(主成分分析)以计算其主成分并降低维度。
pca = PCA(n_components=200, whiten=True).fit(X_train)
X_train_pca = pca.transform(X_train)
PCA 将矩阵的形状从 1500*5236 更改为 1500*200。在后面的部分,我们使用 MLPClassifier 来测试准确性,从上面的代码接收到的数据使模型非常准确。
然而,在互联网上,我只看到了将 n*m 矩阵维数减少到(例如)n*1[=32 的例子=].我不知道将此算法应用于一维数组是否是一个好方法,我还没有找到任何例子。
我是否应该将每个图像重塑回矩阵,然后在其上应用 PCA?
或者只是保持原样?
这是一个好方法吗?
在我的情况下,也许有一些 PCA 的替代品?
However, on the internet, I've seen only examples with decreasing nm matrixes dimension to (for example) n1. I don't know if applying this algorithm to just a one-dimensional array is a good approach, I haven't found any example of that.
您没有将 PCA 应用于一维数组。您将其应用于 1500 x 5236 的二维矩阵并将其缩小为 1500 x 200;这正是您在网上看到的 -> 二维矩阵缩减为更小的特征 space。在线教程通常会以极端的方式(例如 1500 x 2)这样做,因为 PCA 的主要用途之一是数据 可视化 并且绘制任何超过 2dims 的东西都是......很难;)
Should I instead reshape each image back into the matrix, and then apply PCA on it?
不,似乎对矩阵是什么感到困惑。你的 整个 数据是矩阵,如果你有图片,你最终会得到 3d 张量,而不是矩阵。按照传统定义,PCA 只能应用于二维矩阵。
Or just left it as it is? Is it a good approach at all? Maybe there are some alternatives for PCA in my case?
PCA 只是一个 heuristic regularisation technique。您正在从数据中删除信息,以避免过度拟合。绝对不能保证它会起作用或有所帮助。还有许多其他的正则化技术可以尝试:
- 正则化损失,例如重量衰减
- 网络本身的规则,例如辍学
- 数据本身的正则化,例如“数据增强”(在不影响最终标签的情况下对图片进行轻微的训练,例如旋转等)
- 以指定损失的方式进行正则化,例如通过软标签或混合。
我的大学项目要求我分析、讨论和改进现有的图像人脸识别实现。
作为输入数据,我得到了 n*m 矩阵,其中:
- 'n'是图片的数量,在我这里是1500张。
- 'm' 是一个扁平化(矢量化)像素矩阵,因此只是一个一维数组。它从一个 77*78 矩阵转换为一个 5236 元素长列表的灰度值 (0-255)。
看起来像:
[[254. 254. 236. ... 15. 20. 21.]
[ 49. 55. 61. ... 57. 69. 60.]
[129. 137. 159. ... 15. 15. 15.]
...
[ 44. 49. 60. ... 7. 8. 8.]
[229. 221. 201. ... 16. 16. 16.]
[120. 116. 112. ... 7. 7. 7.]]
在给定示例的某个时刻,在训练模型之前,将此数据应用于 PCA(主成分分析)以计算其主成分并降低维度。
pca = PCA(n_components=200, whiten=True).fit(X_train)
X_train_pca = pca.transform(X_train)
PCA 将矩阵的形状从 1500*5236 更改为 1500*200。在后面的部分,我们使用 MLPClassifier 来测试准确性,从上面的代码接收到的数据使模型非常准确。
然而,在互联网上,我只看到了将 n*m 矩阵维数减少到(例如)n*1[=32 的例子=].我不知道将此算法应用于一维数组是否是一个好方法,我还没有找到任何例子。
我是否应该将每个图像重塑回矩阵,然后在其上应用 PCA? 或者只是保持原样? 这是一个好方法吗? 在我的情况下,也许有一些 PCA 的替代品?
However, on the internet, I've seen only examples with decreasing nm matrixes dimension to (for example) n1. I don't know if applying this algorithm to just a one-dimensional array is a good approach, I haven't found any example of that.
您没有将 PCA 应用于一维数组。您将其应用于 1500 x 5236 的二维矩阵并将其缩小为 1500 x 200;这正是您在网上看到的 -> 二维矩阵缩减为更小的特征 space。在线教程通常会以极端的方式(例如 1500 x 2)这样做,因为 PCA 的主要用途之一是数据 可视化 并且绘制任何超过 2dims 的东西都是......很难;)
Should I instead reshape each image back into the matrix, and then apply PCA on it?
不,似乎对矩阵是什么感到困惑。你的 整个 数据是矩阵,如果你有图片,你最终会得到 3d 张量,而不是矩阵。按照传统定义,PCA 只能应用于二维矩阵。
Or just left it as it is? Is it a good approach at all? Maybe there are some alternatives for PCA in my case?
PCA 只是一个 heuristic regularisation technique。您正在从数据中删除信息,以避免过度拟合。绝对不能保证它会起作用或有所帮助。还有许多其他的正则化技术可以尝试:
- 正则化损失,例如重量衰减
- 网络本身的规则,例如辍学
- 数据本身的正则化,例如“数据增强”(在不影响最终标签的情况下对图片进行轻微的训练,例如旋转等)
- 以指定损失的方式进行正则化,例如通过软标签或混合。