如何正确重塑sklearn NMF输出W矩阵以绘制分量图像
问题原因
图像异常平铺是数组轴顺序匹配错误导致的:
- 原始图像栈维度为
(z, y, x) = (46, 974, 1414),NMF输入要求每一行对应同一个空间像素点(固定y,x)的全部z层值,形状为(y*x, z),且行顺序要和(y,x)空间网格的遍历顺序一一对应。 - 直接对(z,y,x)顺序的数组执行
data.reshape(-1, z)时,numpy按行优先规则展平,得到的每行是跨z、跨y的零散像素拼接,根本不是单空间点的z序列,后续把W直接reshape成(y,x,n_components)自然会出现像素错位、重复平铺的问题。
修正步骤
按正确的轴顺序做预处理和结果重塑即可,NMF拟合逻辑不需要改动:
- 先调整原始数组轴顺序,把z轴移到最后,让空间维度y、x排在前面:
import numpy as np from sklearn import decomposition import matplotlib.pyplot as plt # 原始data形状(z,y,x) -> 调整为(y,x,z) data_axisfix = np.moveaxis(data, source=0, destination=-1) # 调整后形状为(974, 1414, 46)
- 展平为NMF要求的输入格式:
z, y, x = data.shape data_r = data_axisfix.reshape(-1, z) # 展平后形状为(974*1414=1377236, 46),每一行严格对应一个(y,x)位置的全z层值
- 执行原有NMF拟合代码:
estimator = decomposition.NMF(n_components = n_components, init = 'random') W = estimator.fit_transform(data_r) H = estimator.components_
- 把W矩阵重塑回空间网格,绘制分量图:
# W形状为(总像素数, n_components),直接按(y,x,n_components)重塑即可 component_maps = W.reshape(y, x, n_components) # 绘制第0个分量,若图像上下颠倒可加origin='lower'参数 plt.imshow(component_maps[:, :, 0]) plt.axis('off') plt.show()
注意事项
不要图省事跳过轴调整步骤、直接在reshape W时改参数,这种方式很容易留下维度匹配隐患,后续绘制其他分量、或者做H矩阵的组分光谱分析时还会出问题。
内容的提问来源于stack exchange,提问作者operandos
相关产品推荐
相关产品推荐

