一 . 降维
1. 为什么要降维
一个分类器,没有以分布在整个特征空间中的数据点进行训练,那么这个分类器在面对一个离前面遇到过的数据点位置很远的数据点时,将不知道如何去分类。但是,随着空间维度数的增加,需要填充空间的数据点会呈现指数级增长。当数据点增长超过一个最大值时,分类器的性能就会下降("性能"只是一个抽象描述,可具体化为很多方面)。所以需要寻找一个最优的维度数(特征数量)。这就是所谓的降维。
2. 实现降维的方法
2.1 PCA(主成分分析法,Principal Component Analysis)
2.2 ICA(独立成分分析法, Independent Component Analysis)
2.3 NMF(非负矩阵分解法,Non-negative Matrix Factorization)
二. PCA
2.1 PCA原理
PCA的原理是将N维特征映射到K维特征上(N>K)。这不是从N维特征中去除(N-K)维特征,而是在原来的N维特征中重新构造出来K维特征。
2.2 PCA的OpenCV实现
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl
import cv2
# 设置中文字体
mpl.rcParams['font.sans-serif'] = ['SimHei']
plt.style.use('ggplot')
mean = [20, 20] # 均值
cov = [[5, 0], [25, 25]] # 协方差矩阵
x, y = np.random.multivariate_normal(mean, cov, 1000).T
# 将特征向量组合成一个新的特征矩阵X
X = np.vstack((x, y)).T
# mu: 投影前减去的的平均值mean, eig: 协方差矩阵的特征向量
mu, eig = cv2.PCACompute(X, np.array([]))
# 使用cv2.PCAProject旋转数据
X2 = cv2.PCAProject(X, mu, eig)
三. ICA
3.1 ICA原理
ICA同PCA进行一样的数学操作,但它选择哪些分解后相互之间尽可能独立的成分。
3.2 ICA的scikit-learn实现
在scikit-learn中,ICA由decomposition.FastICA()函数实现。
# -*- coding:utf-8 -*-
import numpy as np
from sklearn import decomposition
mean = [20, 20]
cov = [[5, 0], [25, 25]]
x, y = np.random.multivariate_normal(mean, cov, 1000).T
X = np.vstack((x, y)).T
ica = decomposition.FastICA()
X2 = ica.fit_transform(ica)
四. NMF
4.1 NMF原理
和PCA与ICA进行同样的数学操作,只是多了一个限制条件——操作的数据是非负的。
4.2 NMF的scikit-learn实现
在scikit-learn中,NMF由decomposition.NMF()函数实现。
# -*- codign:utf-8 -*-
import numpy as np
from sklearn import decomposition
mean = [20, 20]
cov = [[5, 0], [25, 25]]
x, y = np.random.multivariate_normal(mean, cov, 1000).T
X = np.vstack((x, y)).T
ica = decomposition.NMF()
X2 = ica.fit_transform(ica)
五. 参考资料
[1]Michael Beyeler《Machine Learning for OpenCV》,https://github.com/mbeyeler/opencv-machine-learning