机器学习:降维工具 - PCA
降维(dimensionality reduction)就是减少数据特征的维度
作用
使得数据集更易使用
降低很多算法的计算开销
去除噪声
使得结果易懂
PCA(主成分分析 Principal Component Analysis)
PCA 将数据从原来的坐标系转换到了新的坐标系
第一个新坐标轴选择的是原始数据中方差最大的方向
第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向
重复该过程,重复次数为特征的数目
我们会发现,大部分方差都包含在最前面的几个新坐标轴中
因此,我们可以忽略余下的坐标轴,即对数据进行了降维处理
因子分析(Factor Analysis)
假设在观察数据的生成中有一些观察不到的隐变量(latent variable)
假设观察数据是这些隐变量和某些噪声的线性组合
那么隐变量数据可能比观察数据的数目少,就是说通过找到隐变量就可以实现数据的降维
独立成分分析(Independent Component Analysis,ICA)
假设数据是从 N 个数据源生成的,数据为多个数据源的混合观察结果
这些数据源之间在统计上是相互独立的
如果数据源的数目少于观察数据的数目,则可以实现降维过程
下面只讲 PCA 技术
优点:降低数据的复杂性,识别最重要的多个特征
缺点:不一定需要,且可能损失有用信息

以上图为例
第一条坐标轴旋转到覆盖数据的最大方差位置 B,最大方差给出了数据最重要的信息
第二条坐标轴选择和第一条坐标轴正交,并且方差最大的方向 C
注意坐标轴的旋转并没有减少数据的维度
如果新坐标 B 比较长,而新坐标 C 比较短,则 B 比较重要而 C 可以忽略
通过这种方法将数据坐标轴旋转至数据角度上的那些最重要的方向
作用
使得数据集更易使用
降低很多算法的计算开销
去除噪声
使得结果易懂
PCA(主成分分析 Principal Component Analysis)
PCA 将数据从原来的坐标系转换到了新的坐标系
第一个新坐标轴选择的是原始数据中方差最大的方向
第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向
重复该过程,重复次数为特征的数目
我们会发现,大部分方差都包含在最前面的几个新坐标轴中
因此,我们可以忽略余下的坐标轴,即对数据进行了降维处理
因子分析(Factor Analysis)
假设在观察数据的生成中有一些观察不到的隐变量(latent variable)
假设观察数据是这些隐变量和某些噪声的线性组合
那么隐变量数据可能比观察数据的数目少,就是说通过找到隐变量就可以实现数据的降维
独立成分分析(Independent Component Analysis,ICA)
假设数据是从 N 个数据源生成的,数据为多个数据源的混合观察结果
这些数据源之间在统计上是相互独立的
如果数据源的数目少于观察数据的数目,则可以实现降维过程
下面只讲 PCA 技术
优点:降低数据的复杂性,识别最重要的多个特征
缺点:不一定需要,且可能损失有用信息

以上图为例
第一条坐标轴旋转到覆盖数据的最大方差位置 B,最大方差给出了数据最重要的信息
第二条坐标轴选择和第一条坐标轴正交,并且方差最大的方向 C
注意坐标轴的旋转并没有减少数据的维度
如果新坐标 B 比较长,而新坐标 C 比较短,则 B 比较重要而 C 可以忽略
通过这种方法将数据坐标轴旋转至数据角度上的那些最重要的方向
一旦得到了协方差矩阵的特征向量,就可以保留最大的 N 个值
这些特征向量给出了 N 个最重要特征的真实结构
可以通过将数据乘上这 N 个特征向量而将它转换到新的空间
代码
# coding=utf-8
import numpy as np
def pca(dataMat, topNfeat=9999999):
"""
dataMat - 原数据集
topNfeat - 压缩为 topNfeat 个特征
"""
# 所有数据减去平均值
meanVals = np.mean(dataMat, axis=0)
meanRemoved = dataMat - meanVals
# 计算协方差矩阵,协方差用于衡量两个变量(特征)的总体误差
# 正值表示有正相关性,负值表示有负相关性,0 表示两个变量是统计独立的
# 而方差是协方差的一种特殊情况,即当两个变量是相同的情况
covMat = np.cov(meanRemoved, rowvar=False)
# 计算协方差矩阵(n阶矩阵) covMat 的特征值向量 eigVals (维度 n*1) 和特征向量矩阵 eigVects (维度 n*n)
# eigVals 的每个值是一个特征值,eigVects 的每一列是一个特征向量,所有特征向量之间都是线性无关的
# 满足 covMat * eigVects[:,j] = eigVals[j] * eigVects[:,j]
# 注意这里的特征、特征向量是针对协方差矩阵的,不是针对数据集的
eigVals, eigVects = np.linalg.eig(np.mat(covMat))
# 对特征值向量进行从小到大的排序,eigValInd 的值是 eigVals 的下标
eigValInd = np.argsort(eigVals)
# 步长 -1 所以从最后一个 (既最大的) 开始取,取 topNfeat 个最大的值的下标
eigValInd = eigValInd[:-(topNfeat + 1):-1]
# 通过下标取特征值最大的 topNfeat 个特征向量得到 redEigVects (维度 n*topNfeat)
redEigVects = eigVects[:, eigValInd]
# 使用新的特征向量矩阵对原始数据进行降维
lowDDataMat = meanRemoved * redEigVects
# 使用新的特征向量矩阵将原始数据集矩阵转换到新的空间
reconMat = (lowDDataMat * redEigVects.T) + meanVals
# 返回降维后的原始数据,和转换到新空间的数据
return lowDDataMat, reconMat
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界