从混合高斯分布生成二维样本数据集的代码问题求助
你当前代码的问题是分别独立生成X、Y两个一维混合正态分布,X和Y的分量选择没有关联,所以无法形成聚类的簇效果。你需要生成的是二维高斯混合分布,每个样本的X、Y同属一个分量,才能得到预期的散点聚类效果。
调整后的代码如下,参数完全沿用你原来设置的X、Y分量均值、方差和占比,交叉后得到4个二维分量,和示例图效果匹配:
import numpy as np import matplotlib.pyplot as plt %matplotlib inline # 定义二维高斯混合的4个分量参数:(均值[mu_x, mu_y], 协方差矩阵, 分量占比) components = [ ([1, 3], [[4, 0], [0, 1]], 0.18), # 对应X分量1+Y分量1,占比0.3*0.6=0.18 ([1, 6], [[4, 0], [0, 4]], 0.12), # 对应X分量1+Y分量2,占比0.3*0.4=0.12 ([4, 3], [[1, 0], [0, 1]], 0.42), # 对应X分量2+Y分量1,占比0.7*0.6=0.42 ([4, 6], [[1, 0], [0, 4]], 0.28), # 对应X分量2+Y分量2,占比0.7*0.4=0.28 ] n = 1000 p_list = [item[2] for item in components] points = [] for _ in range(n): # 按占比选择当前样本所属的分量 z_i = np.argmax(np.random.multinomial(1, p_list)) mu, cov, _ = components[z_i] # 从该二维高斯分量采样得到(x,y)点 x_i, y_i = np.random.multivariate_normal(mu, cov) points.append((x_i, y_i)) # 拆分x、y向量绘图 x, y = zip(*points) plt.scatter(x, y, s=8, alpha=0.7) plt.show()
如果需要调整簇的形状、倾斜角度,可以修改协方差矩阵的非对角元素实现X、Y维度的相关性;调整簇的位置直接修改对应分量的均值即可。
内容的提问来源于stack exchange,提问作者Sik Sik
相关产品推荐
相关产品推荐

