如何基于OpenCV和Sklearn库开展数据降维
大家在做数据分析或者机器学习应用过程中,不可避免的需要对数据进行降维操作,好多垂直行业业务中经常出现数据量少但维度巨大的情况。数据降维的目的是为了剔除不相关或冗余特征,使得数据易用,去除无用数据,实现数据可视化,提高模型精确度,减少运行成本,减少特征个数并关注本质特征,确保数据特征属性间相互独立。
1.数据降维的主要方法
数据降维主要有线性和非线性方法,线性方法有PCA 、ICA、LDA、LFA、LPP(LE 的线性表示),非线性方法有基于核函数——KPCA 、KICA、KDA,基于特征值的流型学习——ISOMAP、LLE、LE、LPP、LTSA、MVU。
本文主要讲述PCA和ICA以及NMF,NMF是一种只关注非负值的PCA降维方法。其中,PCA是一种全新的正交特征(也被称为主成分)来表示向数据变化最大的方向投影(最大方差),或者说向重构误差最小化的方向投影,形成维度更少、正交的数据特征。
2.数据降维的应用场景
主要应用于文本处理、人脸识别、图片识别、自然语言处理、业务环节的高维数据处理等领域。
3.数据降维示例
数据降维方法的主要示例详见下方。
import numpy as np
import matplotlib.pyplot as plt
import cv2
#主成分分析PCA
mean = [20, 20] # 各维度的均值,确定数据维度,表示1行2列,长度为N的一维矩阵
cov = [[5, 0], [25, 25]] # 协方差矩阵,且协方差矩阵必须是对称矩阵和半正定矩阵(形状为(N,N)的二维数组)
np.random.seed(42) #设置随机种子点,这样每次生成数据都一样
x, y = np.random.multivariate_normal(mean, cov, 2000).T #根据均值和协方差矩阵情况生成一个多元正态分布矩阵
plt.figure(figsize=(10, 6))
plt.plot(x, y, 'o', zorder=1)
plt.axis([0, 40, 0, 40])
plt.xlabel('source feature 1')
plt.ylabel('source feature 2')
plt.show()
X = np.vstack((x, y)).T #组合成特征矩阵
mu, eig = cv2.PCACompute(X, np.array([])) #以空数组作为蒙版,获得平均值和协方差矩阵的特征向量eig
plt.figure(figsize=(10, 6))
plt.plot(x, y, 'o', zorder=1)
plt.quiver(mean, mean, eig[:, 0], eig[:, 1], zorder=3, scale=0.2, units='xy')
plt.text(mean[0] + 5 * eig[0, 0], mean[1] + 5 * eig[0, 1], 'v1', zorder=5,
fontsize=16, bbox=dict(facecolor='white', alpha=0.6))
plt.text(mean[0] + 7 * eig[1, 0], mean[1] + 4 * eig[1, 1], 'v2', zorder=5,
fontsize=16, bbox=dict(facecolor='white', alpha=0.6))
plt.axis([0, 40, 0, 40])
plt.xlabel('feature 1')
plt.ylabel('feature 2')
plt.show()
#1.opencv提供与PCA密切相关的降维技术
X2 = cv2.PCAProject(X, mu, eig) #选择数据,将xy坐标轴旋转为以v1,v2为坐标轴,v1、v2的选择来自于mu和eig
plt.figure(figsize=(10, 6))
plt.plot(X2[:, 0], X2[:, 1], '^')
plt.xlabel('first principal component')
plt.ylabel('second principal component')
plt.axis([-20, 20, -10, 10])
plt.show()
#2.sklearn提供与PCA密切相关的降维技术ICA
from sklearn import decomposition
ica = decomposition.FastICA() #与PCA类似,但分解后选择尽量相互独立的成分。
X2 = ica.fit_transform(X)
plt.figure(figsize=(10, 6))
plt.plot(X2[:, 0], X2[:, 1], '^')
plt.xlabel('first independent component')
plt.ylabel('second independent component')
plt.axis([-0.2, 0.2, -0.2, 0.2])
plt.show()
#3.sklearn提供PCA密切相关的降维技术,即非负矩阵分解,仅仅处理那些非负的数据,特征矩阵中不能有负值
from sklearn import decomposition
nmf = decomposition.NMF()
X2 = nmf.fit_transform(X)
plt.figure(figsize=(10, 6))
plt.plot(X2[:, 0], X2[:, 1], 'o')
plt.xlabel('first non-negative component')
plt.ylabel('second non-negative component')
plt.axis([0, 1.5, -0.5, 1.5])
plt.show()