如何基于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()
相关推荐
黎燃2 小时前
短视频平台内容推荐算法优化:从协同过滤到多模态深度学习
人工智能
TF男孩3 小时前
ARQ:一款低成本的消息队列,实现每秒万级吞吐
后端·python·消息队列
飞哥数智坊3 小时前
多次尝试用 CodeBuddy 做小程序,最终我放弃了
人工智能·ai编程
后端小肥肠4 小时前
别再眼馋 10w + 治愈漫画!Coze 工作流 3 分钟出成品,小白可学
人工智能·aigc·coze
唐某人丶7 小时前
教你如何用 JS 实现 Agent 系统(2)—— 开发 ReAct 版本的“深度搜索”
前端·人工智能·aigc
FIT2CLOUD飞致云7 小时前
九月月报丨MaxKB在不同规模医疗机构的应用进展汇报
人工智能·开源
阿里云大数据AI技术7 小时前
【新模型速递】PAI-Model Gallery云上一键部署Qwen3-Next系列模型
人工智能
袁庭新7 小时前
全球首位AI机器人部长,背负反腐重任
人工智能·aigc
机器之心8 小时前
谁说Scaling Law到头了?新研究:每一步的微小提升会带来指数级增长
人工智能·openai
该用户已不存在8 小时前
Mojo vs Python vs Rust: 2025年搞AI,该学哪个?
后端·python·rust