python 多维高斯分布数据生成


import numpy as np
import matplotlib.pyplot as plt


def gen_clusters():
    mean1 = [0,0]
    cov1 = [[1,0],[0,10]]
    data = np.random.multivariate_normal(mean1,cov1,100)
    
    mean2 = [10,10]
    cov2 = [[10,0],[0,1]]
    data = np.append(data,
                     np.random.multivariate_normal(mean2,cov2,100),
                     0)
    
    mean3 = [10,0]
    cov3 = [[3,0],[0,4]]
    data = np.append(data,
                     np.random.multivariate_normal(mean3,cov3,100),
                     0)
    
    return np.round(data,4)

def save_data(data,filename):
    with open(filename,'w') as file:
        for i in range(data.shape[0]):
            file.write(str(data[i,0])+','+str(data[i,1])+'\n')
            
def load_data(filename):
    data = []
    with open(filename,'r') as file:
        for line in file.readlines():
            data.append([ float(i) for i in line.split(',')])
    return np.array(data)

def show_scatter(data):
    x,y = data.T
    plt.scatter(x,y)
    plt.axis()
    plt.title("scatter")
    plt.xlabel("x")
    plt.ylabel("y")
    
data = gen_clusters()
save_data(data,'3clusters.txt')
d = load_data('3clusters.txt')
show_scatter(d)

在这里插入图片描述

### 多维高斯分布及其在机器学习中的应用 #### 定义与基本性质 多维高斯分布是一种概率分布,用于描述多个随机变量之间的联合分布情况。其核心特点是能够捕捉这些随机变量间的线性相关关系[^1]。假设有一个 \(d\)-维随机向量 \(\mathbf{x} = (x_1, x_2, ..., x_d)\),它的多维高斯分布可以表示为: \[ p(\mathbf{x}) = \frac{1}{(2\pi)^{\frac{d}{2}} |\Sigma|^{\frac{1}{2}}} e^{-\frac{1}{2} (\mathbf{x}-\mu)^T\Sigma^{-1}(\mathbf{x}-\mu)} \] 其中: - \(\mu\) 是均值向量, - \(\Sigma\) 是协方差矩阵。 这种形式使得多维高斯分布非常适合用来建模具有复杂依赖结构的数据集。 #### Python 实现方法 为了生成服从特定参数设置下的多维高斯分布样本,Python 提供了 `numpy` 库作为工具支持。下面展示了一个简单的例子来说明如何利用 NumPy 来完成这一任务[^2]: ```python import numpy as np def sample_multivariate_gaussian(mean_vector, covariance_matrix, num_samples=100): """ 从指定的多维正态分布中抽取样本 参数: mean_vector: 均值向量 covariance_matrix: 协方差矩阵 num_samples: 抽取的样本数量 返回: samples: 随机抽样的结果数组 """ dimensions = len(mean_vector) if not np.all(np.linalg.eigvals(covariance_matrix) > 0): raise ValueError("Covariance matrix must be positive definite.") # 使用 multivariate_normal 函数进行采样 samples = np.random.multivariate_normal(mean_vector, covariance_matrix, size=num_samples) return samples # 示例调用 mean = [0, 0] cov = [[1, 0.5], [0.5, 1]] samples = sample_multivariate_gaussian(mean, cov, num_samples=500) print(samples[:5]) # 打印前五个样本 ``` 上述代码片段展示了如何通过给定的均值向量和协方差矩阵生成一组符合该分布特性的数据点集合。 #### KL 散度计算 当比较两个不同的多维高斯分布时,常用的方法之一就是计算它们之间基于 Kullback-Leibler(KL) 的距离或者称为相对熵。对于任意两组独立同分布的多元标准正态随机变量而言,如果分别记作 P 和 Q,则两者间 KL 散度可由下述公式给出[^3]: \[ D_{KL}(P || Q) = \frac{1}{2}\left[\text{tr}(\Sigma_Q^{-1}\Sigma_P)+(\mu_Q-\mu_P)^T\Sigma_Q^{-1}(\mu_Q-\mu_P)-k+\ln\left(\frac{|\Sigma_Q|}{|\Sigma_P|}\right)\right]\] 这里 k 表示维度数;其余符号意义保持不变。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颹蕭蕭

白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值