如何基于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()
相关推荐
微学AI16 分钟前
内网穿透的应用-服务器日志出现异常怎么办?Python监控、钉钉告警与远程处理教程
服务器·python·钉钉
chaojihaomai3 小时前
AI电商商品图生成中的材质保真问题——扩散模型重建优先级分析与锁定式方案
人工智能·材质
大模型探索者5 小时前
2026 企业智能体平台选型指南:从通用到行业深耕,怎么选?
大数据·人工智能
深圳行云创新5 小时前
北极星知识图谱平台|太空越来越“拥挤”,知识图谱如何预测空间碎片碰撞风险?
人工智能·知识图谱
Am-Chestnuts5 小时前
国产AI多轮对话归档与多格式导出实践
人工智能·word
workflower6 小时前
装备企业的 AI 路线图
人工智能·深度学习·机器学习·设计模式·机器人
AKAMAI7 小时前
Linode接口及默认防火墙现已全面开放使用
人工智能·云计算
前端开发江鸟7 小时前
RAG 回答错了,问题到底出在召回、重排,还是生成?
人工智能
美狐美颜SDK开放平台7 小时前
直播app开发如何实现主播级美颜效果?美颜sdk开发方案详解
人工智能·音视频·美颜sdk·视频美颜sdk·美颜api
东方小月8 小时前
从零开发一个 Coding Agent(四):使用状态机校验大模型事件流
前端·人工智能·后端