用Python做高光谱数据降维,这个系列的第三篇终于聊到核心了。前两篇如果已经搞定数据读取和预处理,那这一步就是把几百个波段“压缩”成几十个甚至十几个,同时尽量不丢信息。这篇文章我会用真实处理过的光谱数据做例子,从为什么需要降维讲起,把主成分分析(PCA)的原理、代码实现、参数选择,以及几种替代方案一次说透,最后附上我实际工作中踩过的坑和排查思路。
1. 降维到底在解决什么问题
1.1 高光谱数据为什么“麻烦”
高光谱影像和普通RGB图像最大的区别,是波段数量完全不在一个量级。一张RGB图像只有3个波段,而一台常见的高光谱相机动不动就是几百个波段,覆盖可见光到近红外甚至短波红外。波段多意味着信息丰富,但同时也带来三个非常现实的问题。
第一个问题是数据冗余严重。相邻波段之间的相关性极高,尤其是光谱分辨率高的传感器,可能隔着几个波段的响应曲线几乎一样。这意味着你拿到的几百个波段里,有相当一部分是“重复”信息,直接把所有波段喂给模型,不仅计算量成倍增加,还容易让模型学到噪声。
第二个问题是维度灾难。样本数量不变的情况下,特征维度越高,模型需要的数据量就越呈指数级增长。做分类任务时经常会遇到这种现象:波段加到几百个,分类精度反而不升反降。这是因为高维空间里样本变得稀疏,距离度量失去意义,模型开始过拟合。
第三个问题是可视化几乎不可能。人眼只能看到三维空间,几百个波段的数据没法直接展示。做探索性分析的时候,你得先把维度降到3个以内才能在图上观察样本分布。
所以降维这件事,在高光谱处理流程里不是“可选项”,而是“必选项”。不管后面是做分类、聚类、异常检测,还是做混合像元分解,降维基本都跑不掉。
1.2 降维的两种思路:特征选择与特征提取
降维方法大体上分两类。
一类叫特征选择(Feature Selection),思路是从原始波段里挑出最有代表性的几个,剩下全扔掉。这个方法的好处是结果可解释性强——你保留下来的波段是物理上真实存在的光谱通道,可以明确说出“我用的是550nm附近的波段”。常用的方法有基于方差阈值、基于相关系数、基于互信息等。但特征选择的缺点是它假设有用信息集中在少数原始波段里,而高光谱数据里很多有效信息是分散在多个波段的组合中的,单纯挑选会丢失这些组合信息。
另一类叫特征提取(Feature Extraction),思路是把原始波段通过数学变换组合成新的特征,新特征不是原始波段的简单挑选,而是它们的线性或非线性组合。最典型的就是主成分分析(PCA)、独立成分分析(ICA)、最小噪声分离(MNF)等。特征提取的优点是信息保留能力更强,缺点是解释性差——变换后的“主成分”没有明确的物理含义,你很难说清楚第一主成分到底对应光谱的哪个部分。
在处理高光谱数据时,绝大多数场景下特征提取的效果优于特征选择,原因是高光谱波段间的强相关性让线性组合能非常高效地压缩信息。所以本文重点讲特征提取这条路,尤其是最经典的PCA方法,再把MNF和t-SNE作为补充方案介绍一下。
2. 主成分分析的原理与选择理由
2.1 PCA的数学直觉:旋转坐标系,找最大方差方向
简单说一下PCA在做什么。假设你有一批样本,每个样本有几百个波段的反射率值。如果把每个样本看作高维空间里的一个点,那全部样本就组成了一团“点云”。PCA要做的,就是找到一组新的坐标系,让这团点云在新坐标系下的方差尽可能大。
第一主成分是原始数据方差最大的方向,第二主成分是与第一主成分正交且在剩余方向上方差最大的方向,以此类推。用线性代数的语言说,就是对协方差矩阵做特征值分解,特征值大小对应每个主成分保留的方差大小,特征向量就是主成分方向。
实际计算过程一般是先对数据做标准化(每个波段减去均值除以标准差),然后计算协方差矩阵,再对协方差矩阵做特征值分解。得到特征值后按从大到小排序,取前K个特征值对应的特征向量作为投影矩阵,把原始数据映射到新的K维空间。
这里有个很容易忽略的点:为什么高光谱数据特别适合PCA?因为高光谱波段之间相关性极强,协方差矩阵里对角线之外的元素很大,这种数据结构意味着方差高度集中在几个最大的特征值上。实际处理中经常出现的情况是,前10个主成分就解释了99%以上的方差,这正是PCA在高光谱领域如此好用的根本原因。
2.2 为什么不直接用原始波段建模
很多人第一次接触高光谱数据时会问:既然分类模型能做特征重要性筛选,能不能直接扔给随机森林或者深度学习模型,让模型自己决定用哪些波段?
理论上可以,但实际上有坑。一是计算效率问题,几百个波段作为输入会让模型训练时间大幅增加,尤其是卷积类的深度模型,对高光谱立方体直接处理的计算开销非常大。二是过拟合风险,样本量有限的情况下,特征越多,模型越容易记住噪声而不是学到规律。三是模型的可解释性和稳定性问题,直接建模时你无法确定模型到底用了哪些波段,换了数据后结果波动可能很大。
这就像你给一个学生一本几百页的教科书去准备考试,但考试只考几个核心知识点。聪明的做法是先梳理重点、整理笔记(降维),而不是从头到尾死记硬背。PCA做的就是“整理笔记”这一步,把真正有效的信息提炼出来,丢掉冗余和噪声。
2.3 主成分数量的选择方法
选择保留多少个主成分,是PCA应用中最关键的一步。保留太少,信息丢失严重,后续分析精度下降;保留太多,降维的意义就打折扣。
最常用的方法是看累计方差贡献率。把特征值从大到小排序,逐个累加除以总特征值之和,看累加到多少时达到阈值。常见的选择是累计解释90%或95%的方差。以我处理过的AVIRIS数据为例,224个原始波段经过PCA降维后,前15个主成分就能解释99.2%的方差。这种情况下选择15个主成分是非常稳妥的。
另外还有两个辅助方法。一个是碎石图(Scree Plot),画出特征值随主成分编号的变化曲线,找曲线趋于平缓的“肘部”位置。另一个是Kaiser准则,只保留特征值大于1的主成分,但这个准则在高光谱数据上通常建议的主成分数量偏少,因为波段相关性太高会导致大量特征值略大于1。
实际操作中我的经验是:先跑一次完整的PCA,画出累计方差贡献率曲线,结合后续任务的实际效果来定。分类任务里可以用交叉验证比较不同主成分数量下的精度,聚类任务里可以看轮廓系数,没有一个放之四海皆准的固定值。
3. 核心实操:用Python一步一步实现高光谱数据降维
3.1 环境准备与工具选型
做高光谱数据处理的Python环境,核心库是numpy、scikit-learn和spectral。spectral库是专门处理遥感高光谱数据的,能直接读取常见的ENVI格式文件,自带一些可视化工具。scikit-learn提供了完整且高效的PCA实现,直接调用就行,没必要自己手写特征值分解。
安装依赖很简单,如果你用的是Anaconda环境,在终端执行下面的命令就行。
pip install numpy scikit-learn spectral matplotlib这里注意一下spectral库的导入名是spectral,但导入时写的是import spectral,不是import spectral as sp。另外spectral库在Python 3.8以上版本偶尔有兼容性问题,如果安装报错可以试试pip install spectral --upgrade或者用conda安装。
数据格式上,如果手头是高光谱影像(一个立方体,长宽是空间维度,第三维是波段),一般需要先展平成二维矩阵再做PCA。如果是野外测量的光谱曲线数据(每行一个样本,每列一个波段),那直接处理就行。本文以最常见的高光谱影像数据为例,完整代码适用于绝大多数场景。
3.2 数据读取与预处理:标准化的必要性
先用spectral库读取ENVI格式的高光谱影像。
import numpy as np import spectral.io.envi as envi # 读取ENVI格式数据 img = envi.open('hsi_data.hdr', 'hsi_data.dat')这个img对象可以直接获取数据立方体,shape是(rows, cols, bands)。比如一个典型的数据集是(512, 512, 224),表示512x512的空间大小,224个波段。
读取后首先要做的是数据整形。PCA要求输入是二维矩阵,形状为(样本数,特征数),所以要把三维立方体展平。
# 获取数据立方体,shape: (rows, cols, bands) data_cube = img.load() rows, cols, bands = data_cube.shape # 展平成二维矩阵,每行是一个像素的光谱曲线 data_2d = data_cube.reshape(rows * cols, bands) print(f"展平后的数据形状: {data_2d.shape}") # 输出示例: (262144, 224)这里有个非常关键的步骤:数据标准化。PCA对特征的尺度敏感,如果不同波段的量纲差异很大(比如有的波段反射率范围是0到0.5,有的波段因为传感器特性不同范围是0到5000),直接算协方差矩阵时,量纲大的波段会主导方差,导致降维结果被少数波段控制。所以标准做法是先做Z-score标准化,让每个波段均值为0、标准差为1。
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() data_scaled = scaler.fit_transform(data_2d)做完标准化后,数据每列的均值约等于0,标准差约等于1,这样后续PCA才不会被量纲干扰。这一步非常重要,很多初学者会跳过,结果发现第一主成分总是被某个波段主导,怎么解释都不合理。
3.3 核心代码:PCA降维完整流程
环境准备好后,核心代码其实非常简洁。sklearn的PCA接口封装得很好,几行就能搞定,但有几个参数值得展开说。
from sklearn.decomposition import PCA # 先不指定n_components,让PCA输出全部主成分,方便后续分析 pca = PCA() pca.fit(data_scaled) # 查看特征值和累计方差贡献率 explained_variance_ratio = pca.explained_variance_ratio_ cumulative_ratio = np.cumsum(explained_variance_ratio) # 找到累计方差贡献率达到95%的主成分数量 n_components_95 = np.argmax(cumulative_ratio >= 0.95) + 1 print(f"累计方差贡献率达到95%需要的主成分数: {n_components_95}") # 根据选定的数量重新做PCA pca_final = PCA(n_components=n_components_95) data_reduced = pca_final.fit_transform(data_scaled) print(f"降维后的数据形状: {data_reduced.shape}")这段代码里第一个PCA()不指定成分数,它会保留所有主成分,目的是先看看方差分布情况。实际使用时我建议每次动手前都先跑这一步,把累计方差贡献率曲线打印出来看一眼,形成“先观察、再决策”的习惯,而不是拍脑袋定一个数字。
输出效果通常是这样:原始224维的数据降到15~30维,就能保留95%以上的信息。比如我处理过的数据,前10个主成分通常累计贡献率已经超过90%,前20个能到98%,之后每增加一个主成分贡献率增加不到0.1%,说明噪声已经开始主导了。
3.4 把降维结果还原成影像格式
处理完后,数据是二维的(像素数,主成分数),但如果要做图像分析或可视化,需要把它还原回影像的形状。
# 把降维结果还原成三维影像,shape: (rows, cols, n_components) data_reduced_img = data_reduced.reshape(rows, cols, n_components_95) print(f"降维后的影像形状: {data_reduced_img.shape}") # 保存前3个主成分的可视化结果(分别对应RGB三个通道) from matplotlib import pyplot as plt # 为了显示效果,对每个主成分做线性拉伸到0-255范围 def linear_stretch(band): band_min = np.percentile(band, 2) band_max = np.percentile(band, 98) stretched = np.clip((band - band_min) / (band_max - band_min) * 255, 0, 255) return stretched.astype(np.uint8) rgb_image = np.stack([ linear_stretch(data_reduced_img[:, :, 0]), linear_stretch(data_reduced_img[:, :, 1]), linear_stretch(data_reduced_img[:, :, 2]) ], axis=-1) plt.imshow(rgb_image) plt.title('First 3 Principal Components as RGB') plt.axis('off') plt.savefig('pca_rgb.png', dpi=150, bbox_inches='tight')注意这里不能直接把主成分值当RGB显示,因为PCA的结果有正有负,而且可能存在极端离群值。我用的是2%到98%的百分位拉伸,丢掉两端的极值,这样视觉效果会比min-max归一化好很多。这个技巧在处理异常值较多的数据时特别好用。
也可以把每个主成分单独保存成单波段影像文件,用spectral库写ENVI格式,方便导入ENVI、ArcGIS等专业软件。
from spectral.io import envi as envi_writer # 保存为ENVI格式 envi_writer.save_image('pca_result.hdr', data_reduced_img, dtype=np.float32)4. 进阶:高光谱数据还有哪些值得尝试的降维方法
4.1 MNF:在信噪比维度上的降维
PCA的一个问题是它完全基于方差,而方差最大的方向不一定信噪比最高。当数据里噪声很强时,PCA会把一些噪声方差当成重要信息保留下来。这也正是MNF(Minimum Noise Fraction,最小噪声分离)在高光谱领域流行的原因。
MNF的核心思想是先在数据里估计噪声的协方差矩阵,然后找到一个变换,让变换后的数据信噪比最大化,而不是单纯方差最大化。本质上它做了两次PCA:第一次对噪声协方差矩阵做白化处理,第二次在白化后的数据上再做PCA。
sklearn里没有直接提供MNF类,但可以用几行代码实现一个简化版本。核心是先用高频差分法估计噪声,再做白化,再PCA。
from scipy.linalg import eigh def mnf_transform(data, n_components): # data: (n_samples, n_features) # 1. 用相邻像素差分估计噪声协方差矩阵 diff = np.diff(data, axis=0) noise_cov = np.cov(diff.T) # 2. 对噪声协方差做白化 eigvals_noise, eigvecs_noise = np.linalg.eigh(noise_cov) # 防止除零 eigvals_noise[eigvals_noise < 1e-12] = 1e-12 whitening_matrix = eigvecs_noise @ np.diag(1.0 / np.sqrt(eigvals_noise)) # 3. 白化数据 data_white = data @ whitening_matrix.T # 4. 在白化数据上做PCA cov_white = np.cov(data_white.T) eigvals, eigvecs = np.linalg.eigh(cov_white) idx = np.argsort(eigvals)[::-1] eigvecs = eigvecs[:, idx] # 投影矩阵 transform_matrix = whitening_matrix.T @ eigvecs[:, :n_components] data_mnf = data @ transform_matrix return data_mnf, transform_matrix这段代码是简化版MNF,足够应对大部分场景。MNF在高噪声数据(比如含有明显条带噪声的影像)上效果往往比PCA更好。但它的代价是计算量更大,而且需要数据是按空间排列的影像格式,因为你得用相邻像素的差异来估计噪声。
4.2 流形学习:t-SNE与UMAP用于探索性分析
PCA和MNF都是线性降维方法,它们假设数据的高维结构可以用线性子空间近似。但高光谱数据里有时存在非线性结构,比如不同植被类型在光谱特征上可能存在非线性的过渡关系,这时候线性方法就力不从心了。
t-SNE和UMAP这类流形学习方法通过保持样本之间的局部邻近关系来做非线性降维,能把高维空间的“流形结构”在二维平面里展示得很清楚。做聚类分析之前的探索性可视化非常有用。
from sklearn.manifold import TSNE # 先PCA降到30维,再用t-SNE降到2维 # 这是处理高光谱数据时的推荐做法:先粗降维去噪,再精细降维可视 pca_30 = PCA(n_components=30) data_pca_30 = pca_30.fit_transform(data_scaled) tsne = TSNE(n_components=2, perplexity=30, random_state=42) data_tsne = tsne.fit_transform(data_pca_30) plt.figure(figsize=(8, 8)) plt.scatter(data_tsne[:, 0], data_tsne[:, 1], s=1, c='steelblue', alpha=0.5) plt.title('t-SNE visualization (perplexity=30)') plt.savefig('tsne_visualization.png', dpi=150)注意两个重点。第一,t-SNE计算量大,265144个像素直接跑t-SNE会非常慢,所以先PCA降噪到30维再跑是标准操作。第二,perplexity参数对结果影响很大,可以多试几个值(比如20、30、50)对比效果。
UMAP是比t-SNE更新的方法,计算速度通常比t-SNE快很多,而且能更好地保留全局结构。如果安装了umap-learn库,用法和t-SNE很类似,但要注意n_neighbors和min_dist两个参数的调整。
4.3 波段选择:连续投影算法SPA
前面我提到特征选择的思路,这里补充一个高光谱领域特别常用的波段选择算法——连续投影算法(Successive Projections Algorithm,SPA)。
SPA的核心思想是迭代地选择波段,每一步选出的新波段与已选波段的共线性最小。它得到的波段子集能有效降低波段间的信息冗余,适合用于设计多光谱传感器(比如从高光谱数据里选出几个关键波段,造一台便宜的多光谱相机)。
我用过一段时间的SPA,说实话它实现的细节比PCA要绕一些,核心步骤大致是:初始化时随机选一个波段作为起点,然后每一步在所有未选波段中找到与已选波段张成的子空间投影模长最大的那个加入集合,迭代直到达到目标波段数。
def spa_selection(data, k): # data: (n_samples, n_features) n_samples, n_features = data.shape selected = [] # 随机选一个起始波段 current = np.random.randint(n_features) selected.append(current) for _ in range(1, k): # 计算所有已选波段的投影矩阵 selected_data = data[:, selected] # 对每个候选波段,计算其在已选波段正交补空间上的投影长度 proj_lengths = np.zeros(n_features) for f in range(n_features): if f in selected: continue x = data[:, f] # 正交投影 x_hat = selected_data @ np.linalg.lstsq(selected_data, x, rcond=None)[0] residual = x - x_hat proj_lengths[f] = np.linalg.norm(residual) # 选投影最大的 best = np.argmax(proj_lengths) selected.append(best) return selected这段代码只是帮助理解原理,真正用的时候可以直接用scikit-learn生态下的mlpy库中的SPA实现。波段选择的好处是保留下来的波段具有真实物理意义,后续硬件实现更容易。缺点是它假设单波段的有效性,面对复杂地物时表现不如PCA这类组合方法稳定。
5. 常见问题与排查技巧实录
5.1 数据形状搞混:维度顺序不对
高光谱数据的维度顺序在不同库、不同数据格式之间其实没有统一标准,有些是(rows, cols, bands),有些是(bands, rows, cols),还有的是(rows, bands, cols)。做PCA之前一定要确认数据形状。拿到数据后第一件事就是打印shape,再用类似于plt.imshow的方法抽查几个波段确保空间维度在前。
我曾经在处理一批来自不同传感器的数据时吃过亏:两个数据集都叫“高光谱影像”,但一个是BIP存储,一个是BSQ存储,读出来后维度顺序完全不一样。后来我养成了一个习惯,任何数据进来都先画个RGB假彩色图看看——如果图像看起来正常,说明空间维度没错;如果图像全是条纹或者颜色怪异,多半是维度搞错了。
5.2 内存爆炸:样本量太大怎么办
高光谱影像一景可能上千万像素,展平成二维矩阵后是(上千万, 几百维),直接算协方差矩阵或跑sklearn的PCA,内存很容易爆炸。
我的经验是先用采样方式估算投影矩阵,再在全部数据上做映射。具体做法是随机抽样几万到几十万个像素,在采样数据上fit PCA,算出的投影矩阵,然后在全部数据上只用transform做映射。
from sklearn.decomposition import PCA # 随机采样10万个像素做fit sample_indices = np.random.choice(data_scaled.shape[0], 100000, replace=False) pca = PCA(n_components=20) pca.fit(data_scaled[sample_indices, :]) # 全量数据做transform data_reduced = pca.transform(data_scaled)sklearn的PCA底层用的是随机化SVD,对大数据还算是友好,但样本量非常大时依然建议用这种方法。另外一个技巧是用pca.fit_transform()会额外占用内存,如果数据太大,分开fit和transform更稳定。
5.3 标准化后特征值全部接近1,哪里出了问题
有次用户拿数据来问我,说PCA跑出来特征值全部在1附近,没有任何主成分能解释超过5%的方差。后来检查发现,他在做标准化之前先做了一步“异常值截断”,把所有超过3个标准差的数值都强制截断成3个标准差。这样一来数据分布被强行拉成了类似均匀分布的低相关结构,PCA自然找不到方差集中的方向。
高光谱数据里的异常像素(比如饱和像元、水汽吸收波段)确实会影响PCA,但正确的做法是用mask把异常像元剔除掉再跑PCA,或者在波段维度上直接丢弃受大气吸收影响的波段(比如1350~1450nm和1800~2000nm),而不是粗暴截断数值。
5.4 降维后结果怎么评估
降维做得好不好,不只是看累计方差贡献率。我一般从三个维度验证降维效果。
第一是重构误差。将降维后的数据通过PCA的inverse_transform方法映射回原始空间,与原始数据比对计算误差。重构误差小说明降维过程保留信息良好。
第二是下游任务的表现。如果降维是为了分类,那就比较原始全波段分类精度和降维后分类精度的差距。好的降维应该保持精度基本不变,而计算时间大幅缩短。
第三是可视化效果。用前三个主成分做RGB合成,观察地物之间的可分性。如果原本肉眼可见的地物类型在合成图上混在一起,说明主成分选择可能有问题,或者需要试试MNF等其他算法。
另外我建议每次都把主成分对应的特征向量(载荷)打印出来看一下。主成分载荷反映了原始波段与主成分的关系,比如第一主成分载荷高值集中在可见光波段,说明可见光波段的方差贡献最大,这对理解数据非常有帮助。
6. 降维结果如何与后续分析衔接
降维本身不是终点,通常是为了下一步的分类或者回归任务服务的。常见的做法有两种。
一种是直接拿降维后的主成分作为分类特征,送入随机森林、SVM、神经网络等模型。这种做法的好处是特征数量少、相关性低,模型的训练速度快,泛化性能也更好。我之前用高光谱数据做植被分类,原始224维直接跑SVM,训练时间几十秒,而且精度不稳定;降维到20维后训练时间不到一秒,精度反而提升了1~2个百分点。
另一种是把降维后的结果跟原始波段一起用。有些任务里,原始波段的细粒度信息对某些地物有区分度,而主成分擅长表达整体方差结构,两者结合可能更全面。这其实是一种特征融合的思路,但要注意最终输入维度不能太多,否则又回到了维度灾难的老路上。
用sklearn的Pipeline把降维和分类串起来,是工程上比较规范的做法。
from sklearn.pipeline import Pipeline from sklearn.ensemble import RandomForestClassifier pipe = Pipeline([ ('scaler', StandardScaler()), ('pca', PCA(n_components=0.95)), ('clf', RandomForestClassifier(n_estimators=200, random_state=42)) ]) # 训练与评估 pipe.fit(X_train, y_train) accuracy = pipe.score(X_test, y_test) print(f"Pipeline测试集精度: {accuracy:.4f}")注意到这里PCA参数直接用0.95,sklearn允许用保留方差比例的方式指定主成分数,比硬编码一个数字更灵活。实际使用中这是一个很省心的技巧。
对于深度学习场景,现在也有一些新的思路。比如用自编码器对高光谱数据做非线性降维,效果在某些任务上比PCA更好,但需要的数据量和调参难度更大。常规的业务场景下,PCA依然是稳定可靠的首选,自编码器可以作为探索性研究的补充。
7. 个人实操总结与避坑心得
做了几年的高光谱数据处理,降维这一环我可以说反复踩过不少坑,这里挑几条最值得说的。
第一,先看数据再动手。拿到数据别急着跑PCA,先把数据的维度、数值范围、缺失情况看清楚。尤其是ENVI格式的数据,头文件里的interleave类型和数据形状一定要确认,否则代码跑出奇怪结果都不知道去哪排查。
第二,标准化这一步不能跳。我在之前的项目里试过不标准化的PCA,降维结果第一主成分几乎完全被某个强度特别高的波段控制,后续分类效果非常差。标准化花不了多少时间,但对结果的影响是决定性的。
第三,主成分数量要有依据。不要猜一个数字就定了,先把累计方差贡献率曲线画出来,看着图做决策。如果曲线没有明显拐点,就以上下游任务的交叉验证结果为准。我曾经有过一次项目,用15个主成分和25个主成分分类精度几乎一样,但计算量差了快一倍,最后选了15个,省下来的算力都用在了模型调参上。
第四,保存降维结果时保留必要的元数据。我习惯在输出矩阵旁边同时保存一份savetxt的说明文件,记录原始数据的形状、使用的标准化参数、PCA的方差贡献率。这样换台电脑重新打开结果,不至于一脸懵。遇到过不止一次,过了几个月回来看之前处理的数据,想不起来当时用的是PCA还是MNF,哪个版本参数是多少,只能重新跑一遍。
第五,别迷信单一方法。PCA虽然好用,但不是所有场景的最优解。高噪声数据试试MNF,非线性数据结构明显时考虑t-SNE、UMAP做可视化分析,需要物理可解释性时用SPA做波段选择。工具箱里的方法越丰富,遇到新问题就越不慌。
高光谱数据降维这块,理解了PCA的原理,掌握了代码实现,再辅以几种备选方案,基本上就能应对绝大多数实际场景了。这个系列后面我打算写一写降维之后的数据可视化技巧和分类模型应用,到时候再继续聊。
最后再分享一个小技巧:如果数据量特别大,建议在尝试新方法时先裁一小块子区域来跑通流程,确认没问题后再全量处理。这样既节约时间,又能在小区域上快速对比不同降维方法的效果。很多处理上的坑,在小数据上几分钟就能暴露出来,省得全量跑完才发现方向不对。