生成3组各1000点2D正态分布后如何验证均值近似构成等边三角形
问题排查
你之前的两次实现都不符合要求,核心问题如下:
- 第一次实现:生成的
dist1/dist2/dist3均为1维数组,和题目要求的2D正态分布不符;仅通过直方图和垂直均值线只能展示1维数据的分布情况,无法在平面上呈现三角形。 - 第二次实现:重新生成的D1/D2/D3仍为1维正态分布,将三个1维均值强行拼接为平面点坐标的逻辑没有实际意义,得到的三角形和2D分布的均值无关联。
正确实现思路
1. 生成符合要求的2D正态分布
2D正态分布的均值是长度为2的向量(对应平面x/y轴坐标),协方差矩阵为2×2结构(控制分布的离散程度和维度相关性)。你可以先预设三个刚好构成等边三角形的均值点,再基于这三个均值生成带噪声的样本,每组1000个点。
2. 计算三组样本的实测均值
分别对三组2D样本的x、y维度求平均,得到三个实测均值点,这三个点就是三角形的三个顶点。
3. 可视化与数值验证
首先绘制三组样本的散点图确认分布重叠情况,再标记三个实测均值点,两两连线闭合得到三角形;最后计算三个点的两两距离,验证三个距离近似相等即可确认是近似等边三角形,注意要把坐标轴设为等比例,避免视觉变形导致判断误差。
参考实现代码
import numpy as np import matplotlib.pyplot as plt # 预设三个构成等边三角形的理论均值,两两距离为2 mean1 = np.array([0, 0]) mean2 = np.array([2, 0]) mean3 = np.array([1, np.sqrt(3)]) # 设置三组的协方差矩阵,调整分布重叠程度 cov1 = np.array([[0.3, 0], [0, 0.3]]) cov2 = np.array([[0.4, 0], [0, 0.4]]) cov3 = np.array([[0.3, 0], [0, 0.3]]) # 各生成1000个2D正态分布样本 dist1 = np.random.multivariate_normal(mean1, cov1, 1000) dist2 = np.random.multivariate_normal(mean2, cov2, 1000) dist3 = np.random.multivariate_normal(mean3, cov3, 1000) # 计算三组样本的实测均值 calc_mean1 = dist1.mean(axis=0) calc_mean2 = dist2.mean(axis=0) calc_mean3 = dist3.mean(axis=0) # 可视化 plt.scatter(dist1[:,0], dist1[:,1], alpha=0.3, label='第1组样本') plt.scatter(dist2[:,0], dist2[:,1], alpha=0.3, label='第2组样本') plt.scatter(dist3[:,0], dist3[:,1], alpha=0.3, label='第3组样本') # 拼接均值点,闭合三角形 mean_points = np.array([calc_mean1, calc_mean2, calc_mean3, calc_mean1]) plt.scatter(mean_points[:-1, 0], mean_points[:-1, 1], c='red', s=100, marker='*', label='实测均值') plt.plot(mean_points[:, 0], mean_points[:, 1], c='black', linewidth=2, linestyle='--') # 数值验证等边 d12 = np.linalg.norm(calc_mean1 - calc_mean2) d23 = np.linalg.norm(calc_mean2 - calc_mean3) d31 = np.linalg.norm(calc_mean3 - calc_mean1) print(f"三个均值两两距离:{d12:.2f}, {d23:.2f}, {d31:.2f}") print(f"距离最大相对误差:{(max(d12,d23,d31)-min(d12,d23,d31))/min(d12,d23,d31)*100:.1f}%,误差<5%即可认为是近似等边三角形") plt.legend() plt.axis('equal') # 等比例坐标轴,避免视觉变形 plt.show()
内容的提问来源于stack exchange,提问作者Theodora Martha
相关产品推荐
相关产品推荐

