You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

numpy生成聚类合成数据:多元正态分布N(Am_k,I)实现问题咨询

错误原因

np.random.normal是逐元素生成单变量正态分布的接口,不支持直接传入协方差矩阵:

  • 你传入的scale参数是(20,20)的单位矩阵,和形状为(20,)的均值A@m1广播后,单步生成的是(20,20)的数组,50次循环后vstack得到1000行数据,和预期的50行不符。

两种写法的差异

你把scale改为1后生成的数据,刚好符合x_i ~ N(Am_k, I)的要求,和你传入单位矩阵想实现的效果是一致的:

  • 当scale=1时,numpy会将1广播为和均值相同的(20,)形状,每个维度的标准差都是1,生成的20维向量各维度独立,完全匹配单位协方差矩阵的多维正态分布定义。
  • 不过这种写法语义不明确,容易混淆,更推荐用专门的多维正态分布接口实现。

正确实现代码

推荐用np.random.multivariate_normal直接批量生成,不需要循环单条添加,效率更高逻辑更清晰:

import numpy as np

# 固定参数
n_features = 20
center_dim = 5
samples_per_cluster = 50
n_clusters = 4

# 生成线性变换矩阵A
A = np.random.normal(0, 1, (n_features, center_dim))
# 生成4个5维聚类中心
centers = np.random.normal(0, 1, (n_clusters, center_dim))
# 初始化数据和标签
X = np.zeros((n_clusters * samples_per_cluster, n_features))
y = np.zeros(n_clusters * samples_per_cluster, dtype=int)
# 20维单位协方差矩阵
cov_matrix = np.identity(n_features)

for cluster_id in range(n_clusters):
    # 计算当前类在20维空间的均值
    mu = A @ centers[cluster_id]
    # 批量生成50个样本
    X[cluster_id*samples_per_cluster : (cluster_id+1)*samples_per_cluster] = np.random.multivariate_normal(mu, cov_matrix, size=samples_per_cluster)
    # 分配标签1~4
    y[cluster_id*samples_per_cluster : (cluster_id+1)*samples_per_cluster] = cluster_id + 1

如果追求更简洁的写法,也可以用np.random.normal批量生成,结果完全等价:

X[cluster_id*samples_per_cluster : (cluster_id+1)*samples_per_cluster] = np.random.normal(loc=mu, scale=1, size=(samples_per_cluster, n_features))

内容的提问来源于stack exchange,提问作者jones21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 07:42:03