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
相关产品推荐
相关产品推荐

