需按列或整体向量化处理矩阵数据:一、按列计算均值与方差并拟合正态曲线;二、展平后统一拟合与检验;三、用Seaborn一键绘图;四、MATLAB中用normfit与histogram实现。

如果您拥有一个矩阵数据集,并希望对其执行统计分析,包括计算每列(或每行)的均值与方差,并进一步拟合正态分布曲线进行可视化,则需分别处理矩阵结构特性与单变量分布假设。以下是实现该目标的多种可行方法:
一、按列计算均值与方差并拟合单变量正态曲线
该方法将矩阵视为多个独立变量的集合,对每一列单独计算描述性统计量,并为每列数据拟合一条正态分布密度曲线。适用于各列代表不同观测变量(如多维特征)且假设其各自近似服从正态分布的情形。
1、使用NumPy加载矩阵数据,例如 data = np.array([[...]]) 或从CSV读取:data = np.loadtxt('matrix.csv', delimiter=',')。
2、沿轴0(即按列)计算均值:means = np.mean(data, axis=0)。
3、沿轴0计算样本标准差(贝塞尔校正):stds = np.std(data, axis=0, ddof=1)。
4、对第i列数据提取:col_i = data[:, i],调用 scipy.stats.norm.fit(col_i) 获取最大似然估计的 μ 和 σ。
5、生成横坐标网格:x_grid = np.linspace(col_i.min(), col_i.max(), 100),计算对应PDF值:pdf_vals = norm.pdf(x_grid, mu_fit, sigma_fit)。
6、使用 plt.hist(col_i, bins=30, density=True, alpha=0.6) 绘制归一化直方图,再用 plt.plot(x_grid, pdf_vals, 'r-', lw=2) 叠加拟合曲线。
二、对矩阵整体向量化后统一计算与拟合
该方法将整个矩阵展平为一维数组,忽略行列结构,仅关注全部元素的联合分布形态。适用于检验矩阵元素是否整体服从某一正态分布,例如噪声建模或残差分析场景。
1、执行向量化操作:flat_data = data.ravel() 或 flat_data = data.flatten()。
2、计算全局均值与标准差:mu_global = np.mean(flat_data),sigma_global = np.std(flat_data, ddof=1)。
3、使用 scipy.stats.shapiro(flat_data) 或 scipy.stats.kstest(flat_data, 'norm', args=(mu_global, sigma_global)) 进行正态性检验。
4、绘制直方图并叠加理论正态密度曲线:plt.hist(flat_data, bins=50, density=True, alpha=0.7),随后绘制 norm.pdf(x_range, mu_global, sigma_global) 曲线。
5、添加图例与标签:plt.xlabel('Matrix Element Values'),plt.ylabel('Density'),plt.title('Normal Fit to Flattened Matrix')。
三、使用Seaborn distplot(或displot)一键完成拟合与绘图
该方法利用Seaborn高级封装简化流程,自动完成核密度估计与正态分布拟合叠加,支持快速探索性分析,适合交互式环境或报告生成。
1、确保已安装并导入:import seaborn as sns,import matplotlib.pyplot as plt。
2、对某列数据调用:sns.displot(data[:, 0], kind='hist', kde=False, stat='density', bins=30) 绘制密度直方图。
3、在同图中叠加正态拟合线:x_seq = np.linspace(data[:, 0].min(), data[:, 0].max(), 100),计算PDF并 plt.plot(x_seq, norm.pdf(x_seq, *norm.fit(data[:, 0])))。
4、设置图形样式:sns.set_style("whitegrid"),启用网格提升可读性。
5、若需批量处理所有列,可用循环遍历 range(data.shape[1]) 并为每列创建子图。
四、MATLAB环境下使用normfit与histogram联合实现
该方法适用于已有MATLAB工作流的用户,利用内置函数高效完成参数估计与可视化,避免手动推导PDF表达式。
1、加载矩阵:load('matrix_data.mat'); 或 data = readmatrix('matrix.csv');。
2、对第一列执行拟合:[mu_hat, sigma_hat] = normfit(data(:, 1));。
3、绘制直方图并归一化:histogram(data(:, 1), 'Normalization', 'pdf', 'BinWidth', 0.1);。
4、生成横坐标并叠加曲线:x_pdf = linspace(min(data(:, 1)), max(data(:, 1)), 100);,y_pdf = normpdf(x_pdf, mu_hat, sigma_hat);,hold on; plot(x_pdf, y_pdf, 'r-', 'LineWidth', 2);。
5、添加标注:xlabel('Column 1 Values'); ylabel('Probability Density'); title(['Normal Fit: \mu = ', num2str(mu_hat, '%.4f'), ', \sigma = ', num2str(sigma_hat, '%.4f')]);。











