【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.24 随机宇宙:生成现实世界数据的艺术

在这里插入图片描述

1.24 随机宇宙:生成现实世界数据的艺术

目录

随机宇宙:生成现实世界数据的艺术
引言
复杂联合分布的采样技巧
随机游走的蒙特卡洛实现
基于物理规律的生成模型
随机数在加密中的应用
总结
参考文献
  1. 引言
  2. 复杂联合分布的采样技巧
  3. 随机游走的蒙特卡洛实现
  4. 基于物理规律的生成模型
  5. 随机数在加密中的应用
  6. 总结
  7. 参考文献
随机数生成
分布采样
物理模拟
密码学应用
多元正态分布
随机过程
布朗运动
流体动力学
安全随机数
随机性检验

1.24.1 引言

在数据科学和机器学习中,生成现实世界数据是一项重要的任务。现实世界的数据往往具有复杂的分布和结构,需要使用高阶的采样技巧和生成模型来模拟。本文将详细介绍如何使用NumPy生成复杂联合分布的数据、实现随机游走、基于物理规律的生成模型以及随机数在加密中的应用。
多元分布采样技巧

协方差矩阵采样公式

x ∼ N ( μ , Σ ) \mathbf{x} \sim \mathcal{N}(\boldsymbol{\mu}, \mathbf{\Sigma}) xN(μ,Σ)
其中 Σ = L L T \mathbf{\Sigma} = \mathbf{L}\mathbf{L}^T Σ=LLT(Cholesky分解)

import numpy as np

def multivariate_normal_sampling(mean, cov, size=1000):
    """多元正态分布采样"""
    L = np.linalg.cholesky(cov)  # Cholesky分解
    z = np.random.normal(size=(len(mean), size))
    return mean + L @ z

# 定义参数
mean = [2, 3]
cov = [[1.0, 0.8],
       [0.8, 1.0]]

# 生成样本
samples = multivariate_normal_sampling(mean, cov).T

# 可视化
import matplotlib.pyplot as plt
plt.scatter(samples[:,0], samples[:,1], alpha=0.5)
plt.title("二元正态分布采样")
plt.xlabel("X")
plt.ylabel("Y")
plt.grid(True)
plt.show()

1.24.2 复杂联合分布的采样技巧

1.24.2.1 多元正态分布采样的基本原理

多元正态分布是一种常见的概率分布,用于描述多个随机变量之间的线性相关性。NumPy提供了numpy.random.multivariate_normal函数来生成多元正态分布的样本。

1.24.2.1.1 多元正态分布的定义

多元正态分布的概率密度函数(PDF)定义为:

f ( x ; μ , Σ ) = 1 ( 2 π ) k ∣ Σ ∣ exp ⁡ ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) f(\mathbf{x}; \boldsymbol{\mu}, \boldsymbol{\Sigma}) = \frac{1}{\sqrt{(2\pi)^k |\boldsymbol{\Sigma}|}} \exp\left( -\frac{1}{2} (\mathbf{x} - \boldsymbol{\mu})^T \boldsymbol{\Sigma}^{-1} (\mathbf{x} - \boldsymbol{\mu}) \right) f(x;μ,Σ)=(2π)kΣ 1exp(21(xμ)TΣ1(xμ))

其中:

  • x \mathbf{x} x k k k 维随机向量
  • μ \boldsymbol{\mu} μ k k k 维均值向量
  • Σ \boldsymbol{\Sigma} Σ k × k k \times k k×k 的协方差矩阵
1.24.2.2 代码示例
1.24.2.2.1 多元正态分布采样实例
import numpy as np
import matplotlib.pyplot as plt

# 定义均值向量和协方差矩阵
mean = np.array([0, 0])  # 均值向量
cov = np.array([[1, 0.5], [0.5, 1]])  # 协方差矩阵

# 生成样本
samples = np.random.multivariate_normal(mean, cov, 1000)  # 生成1000个样本

# 绘制样本的散点图
plt.figure(figsize=(10, 6))
plt.scatter(samples[:, 0], samples[:, 1], alpha=0.5)  # 散点图
plt.xlabel('X1')
plt.ylabel('X2')
plt.title('多元正态分布采样')
plt.show()

1.24.3 随机游走的蒙特卡洛实现

1.24.3.1 随机游走的基本原理

随机游走(Random Walk)是一种数学模型,用于描述路径上的随机变化。在金融、物理等多个领域都有广泛的应用。蒙特卡洛方法是一种通过随机抽样来解决问题的数值计算方法。

1.24.3.1.1 代码示例
1.24.3.1.1.1 布朗运动模拟完整代码
import numpy as np
import matplotlib.pyplot as plt

# 定义步长和步数
step_size = 1
num_steps = 1000

# 生成随机游走路径
steps = np.random.normal(0, step_size, (num_steps, 2))  # 生成二维随机步长
path = np.cumsum(steps, axis=0)  # 累积步长得到路径

# 绘制随机游走路径
plt.figure(figsize=(10, 6))
plt.plot(path[:, 0], path[:, 1], label='随机游走路径', color='b', linestyle='-', marker='o')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('布朗运动模拟')
plt.legend()
plt.show()
二维布朗运动实现
def brownian_motion(steps=1000, delta=0.1):
    """生成二维布朗运动路径"""
    dx = np.random.normal(scale=delta, size=steps)
    dy = np.random.normal(scale=delta, size=steps)
    x = np.cumsum(dx)
    y = np.cumsum(dy)
    return x, y

# 生成10条路径
plt.figure(figsize=(10,6))
for _ in range(10):
    x, y = brownian_motion()
    plt.plot(x, y, alpha=0.5)
plt.title("二维布朗运动模拟")
plt.xlabel("X方向")
plt.ylabel("Y方向")
plt.grid(True)
plt.show()

1.24.4 基于物理规律的生成模型

1.24.4.1 流体动力学粒子生成的原理

流体动力学(Fluid Dynamics)描述流体的运动和行为。通过模拟流体中的粒子运动,可以生成具有物理意义的数据。

1.24.4.1.1 代码示例
1.24.4.1.1.1 流体动力学粒子生成
import numpy as np
import matplotlib.pyplot as plt

# 定义参数
num_particles = 100
steps = 1000
dt = 0.01
diffusion_coeff = 0.1

# 生成初始位置
positions = np.random.rand(num_particles, 2)  # 生成100个粒子的初始位置

# 生成随机扰动
perturbations = np.random.normal(0, np.sqrt(2 * diffusion_coeff * dt), (steps, num_particles, 2))

# 更新粒子位置
for step in range(1, steps):
    positions += perturbations[step]

# 绘制粒子轨迹
plt.figure(figsize=(10, 6))
for i in range(num_particles):
    plt.plot(positions[:, i, 0], positions[:, i, 1], alpha=0.5, label=f'Particle {i + 1}')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('流体动力学粒子生成')
plt.legend()
plt.show()
流体动力学粒子生成 SPH方法简化实现
def fluid_particles(num=1000, box_size=10, viscosity=0.1):
    """流体粒子动力学模拟"""
    # 初始化粒子
    pos = np.random.rand(num, 3) * box_size
    vel = np.zeros((num, 3))
    
    # 模拟时间步
    for _ in range(100):
        # 计算密度(简化)
        dist = np.sqrt(((pos[:,None] - pos)**2).sum(axis=2))
        density = np.exp(-dist**2 / 2).sum(axis=1)
        
        # 计算压力梯度
        pressure = 0.1 * (density - 1.0)
        acceleration = -np.gradient(pressure.reshape(num,1), axis=0) / density[:,None]
        
        # 更新速度和位置
        vel += viscosity * acceleration
        pos += vel * 0.01
        
        # 边界碰撞
        pos = np.clip(pos, 0, box_size)
        vel *= (pos == 0) | (pos == box_size) * -1
    
    return pos

# 生成流体粒子
particles = fluid_particles()

# 三维可视化
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(particles[:,0], particles[:,1], particles[:,2], s=2)
ax.set_title("流体粒子分布")
plt.show()

1.24.5 随机数在加密中的应用

1.24.5.1 密码学安全随机数生成的原理

在密码学中,随机数生成是一项关键任务,需要确保生成的随机数具有高度的不可预测性和安全性。NumPy的随机数生成器可以用于生成伪随机数,但为了安全起见,通常使用专门的密码学随机数生成库。

1.24.5.1.1 代码示例
1.24.5.1.1.1 密码学安全随机数生成
import numpy as np
import os
import secrets

# 生成密码学安全随机数
def secure_random_number():
    return secrets.randbits(32)  # 生成32位随机数

# 生成随机数
random_numbers = [secure_random_number() for _ in range(1000)]  # 生成1000个随机数

# 打印前10个随机数
print(f"生成的前10个随机数: {random_numbers[:10]}")
安全随机数生成对比
import secrets

# 不安全随机数
normal_random = np.random.randint(0, 256, size=32)

# 安全随机数生成
secure_random = np.frombuffer(secrets.token_bytes(32), dtype=np.uint8)

# 随机性对比测试
print("普通随机数:", normal_random[:4], "...")
print("安全随机数:", secure_random[:4], "...")

# 密钥生成示例
def generate_aes_key():
    return secrets.token_bytes(32)  # AES-256密钥

print("AES密钥示例:", generate_aes_key().hex()[:16]+"...")

1.24.6 随机性检验的NIST测试

1.24.6.1 NIST测试的基本原理

NIST(美国国家标准与技术研究院)的随机性测试是一组用于评估随机数生成器的统计测试。这些测试可以帮助确保生成的随机数具有良好的随机性和统计特性。

1.24.6.1.1 代码示例
1.24.6.1.1.1 随机性检验的NIST测试
import numpy as np
import os
import secrets
import niststats  # 假设已经安装了niststats库

# 生成密码学安全随机数
random_numbers = np.array([secrets.randbits(32) for _ in range(1000000)])  # 生成100万个随机数

# 将随机数转换为二进制
binary_data = ''.join(format(x, '032b') for x in random_numbers)

# 进行NIST测试
results = niststats.run_all_tests(binary_data, 1000000 * 32)

# 打印测试结果
for test, result in results.items():
    print(f"测试: {test}")
    print(f"结果: {result}")
随机性质量检验 NIST测试套件实现
from collections import Counter

def monobit_test(bits):
    """NIST单比特测试"""
    ones = sum(bits)
    s = abs(ones - len(bits)/2) / np.sqrt(len(bits)/4)
    p_value = np.math.erfc(s / np.sqrt(2))
    return p_value > 0.01

def runs_test(bits):
    """NIST游程测试"""
    runs, n1 = 1, sum(bits)
    for i in range(1, len(bits)):
        if bits[i] != bits[i-1]:
            runs += 1
    expected = (2*n1*(len(bits)-n1))/len(bits) + 1
    std_dev = np.sqrt((expected-1)*(expected-2)/(len(bits)-1))
    z = (runs - expected) / std_dev
    return abs(z) < 1.96

# 测试随机序列
bits = np.random.randint(0, 2, 1000)
print("单比特测试通过:", monobit_test(bits))
print("游程测试通过:", runs_test(bits))

1.24.7 总结

本文详细介绍了如何使用NumPy生成现实世界数据的艺术,包括复杂联合分布的采样技巧、随机游走的蒙特卡洛实现、基于物理规律的生成模型以及随机数在加密中的应用。通过这些内容,希望读者能够更好地理解和应用NumPy的随机数据生成功能,从而在实际项目中提高数据处理和分析的效率。

1.24.8 参考文献

参考资料名链接
NumPy官方文档https://numpy.org/doc/stable/
Matplotlib官方文档https://matplotlib.org/
secrets模块官方文档https://docs.python.org/3/library/secrets.html
NIST随机性测试文档https://csrc.nist.gov/projects/random-bit-generation"testing-random-number-generators"
多元正态分布https://en.wikipedia.org/wiki/Multivariate_normal_distribution
蒙特卡洛方法https://en.wikipedia.org/wiki/Monte_Carlo_method
布朗运动https://en.wikipedia.org/wiki/Brownian_motion
流体动力学https://en.wikipedia.org/wiki/Fluid_dynamics
随机数生成器https://en.wikipedia.org/wiki/Random_number_generation
密码学安全随机数生成https://www.keycdn.com/support/what-are-crypto-safe-random-numbers
Python数据科学手册https://jakevdp.github.io/PythonDataScienceHandbook/
数据可视化https://seaborn.pydata.org/
CUDA编程入门https://developer.nvidia.com/blog/getting-started-cuda-python/
大规模数据处理https://spark.apache.org/docs/latest/api/python/
随机性测试库https://github.com/axcheron/niststats

这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/962581.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek-R1 论文解读 —— 强化学习大语言模型新时代来临?

近年来&#xff0c;人工智能&#xff08;AI&#xff09;领域发展迅猛&#xff0c;大语言模型&#xff08;LLMs&#xff09;为通用人工智能&#xff08;AGI&#xff09;的发展开辟了道路。OpenAI 的 o1 模型表现非凡&#xff0c;它引入的创新性推理时缩放技术显著提升了推理能力…

进阶数据结构——高精度运算

目录 前言一、高精度运算的定义与背景二、高精度运算的实现方式三、高精度运算的算法实现四、高精度运算的应用场景五、代码模版&#xff08;c&#xff09;六、经典例题1.[高精度加法](https://www.lanqiao.cn/problems/1516/learning/?page1&first_category_id1&name…

MYSQL--一条SQL执行的流程,分析MYSQL的架构

文章目录 第一步建立连接第二部解析 SQL第三步执行 sql预处理优化阶段执行阶段索引下推 执行一条select 语句中间会发生什么&#xff1f; 这个是对 mysql 架构的深入理解。 select * from product where id 1;对于mysql的架构分层: mysql 架构分成了 Server 层和存储引擎层&a…

【4Day创客实践入门教程】Day2 探秘微控制器——单片机与MicroPython初步

Day2 探秘微控制器——单片机与MicroPython初步 目录 Day2 探秘微控制器——单片机与MicroPython初步MicroPython语言基础开始基础语法注释与输出变量模块与函数 单片机基础后记 Day0 创想启程——课程与项目预览Day1 工具箱构建——开发环境的构建Day2 探秘微控制器——单片机…

动态规划每日一练(四)

一、day1——最长数对链 题目链接&#xff1a; 646. 最长数对链 - 力扣&#xff08;LeetCode&#xff09;646. 最长数对链 - 给你一个由 n 个数对组成的数对数组 pairs &#xff0c;其中 pairs[i] [lefti, righti] 且 lefti < righti 。现在&#xff0c;我们定义一种 跟随…

事务02之锁机制

锁机制 文章目录 锁机制一&#xff1a;MySQL锁的由来与分类1&#xff1a;锁机制的分类 二&#xff1a;共享锁与排他锁1&#xff1a;共享锁(S锁)2&#xff1a;排他锁(X锁)3&#xff1a;锁的释放 二&#xff1a;表级别锁1&#xff1a;元数据锁(了解)2&#xff1a;意向锁3&#xf…

网络工程师 (8)存储管理

一、页式存储基本原理 &#xff08;一&#xff09;内存划分 页式存储首先将内存物理空间划分成大小相等的存储块&#xff0c;这些块通常被称为“页帧”或“物理页”。每个页帧的大小是固定的&#xff0c;例如常见的页帧大小有4KB、8KB等&#xff0c;这个大小由操作系统决定。同…

[EAI-026] DeepSeek-VL2 技术报告解读

Paper Card 论文标题&#xff1a;DeepSeek-VL2: Mixture-of-Experts Vision-Language Models for Advanced Multimodal Understanding 论文作者&#xff1a;Zhiyu Wu, Xiaokang Chen, Zizheng Pan, Xingchao Liu, Wen Liu, Damai Dai, Huazuo Gao, Yiyang Ma, Chengyue Wu, Bin…

(动态规划路径基础 最小路径和)leetcode 64

视频教程 1.初始化dp数组&#xff0c;初始化边界 2、从[1行到n-1行][1列到m-1列]依次赋值 #include<vector> #include<algorithm> #include <iostream>using namespace std; int main() {vector<vector<int>> grid { {1,3,1},{1,5,1},{4,2,1}…

cf1000(div.2)

Minimal Coprime最小公倍数 输入&#xff1a; 6 1 2 1 10 49 49 69 420 1 1 9982 44353 输出&#xff1a; 1 9 0 351 1 34371 代码

【单细胞第二节:单细胞示例数据分析-GSE218208】

GSE218208 1.创建Seurat对象 #untar(“GSE218208_RAW.tar”) rm(list ls()) a data.table::fread("GSM6736629_10x-PBMC-1_ds0.1974_CountMatrix.tsv.gz",data.table F) a[1:4,1:4] library(tidyverse) a$alias:gene str_split(a$alias:gene,":",si…

事务04之死锁,锁底层和隔离机制原理

死锁和事务底层原理 文章目录 死锁和事务底层原理一&#xff1a;MySQL中的死锁现象1&#xff1a;何为死锁1.1&#xff1a;死锁的概念1.2&#xff1a;死锁产生的四个必要条件&#xff1a; 2&#xff1a;MySQL的死锁2.1&#xff1a;死锁的触发2.2&#xff1a;MySQL的死锁如何解决…

Maven的单元测试

1. 单元测试的基本概念 单元测试&#xff08;Unit Testing&#xff09; 是一种软件测试方法&#xff0c;专注于测试程序中的最小可测试单元——通常是单个类或方法。通过单元测试&#xff0c;可以确保每个模块按预期工作&#xff0c;从而提高代码的质量和可靠性。 2.安装和配…

VirtualBox:跨磁盘导入已存的vdi磁盘文件顺便测试冷迁移

目录 1.背景 2.目的 3.步骤 3.1 安装在移动硬盘上 3.2.接管现有主机磁盘上的虚拟机 3.3接管迁移到移动硬盘的虚拟机 4. 结论 1.背景 电脑重新做了系统&#xff0c;然后找不到virtualbox的启动程序了&#xff0c;另外电脑磁盘由于存储了其他文件已经爆红&#xff0c;无法…

二级C语言:二维数组每行最大值与首元素交换、删除结构体的重复项、取出单词首字母

目录 一、程序填空 --- 二维数组每行最大值与首元素交换 题目 分析 知识点 --- 交换语句 二、程序修改 --- 删除结构体的重复项 题目 分析 三、程序设计 --- 取出单词首字母 题目 分析 前言 本章讲解&#xff1a;二维数组每行最大值与首元素交换、删除结构体的重复项…

优盘恢复原始容量工具

买到一个优盘&#xff0c;显示32mb&#xff0c;我见过扩容盘&#xff0c;但是这次见到的是缩容盘&#xff0c;把2g的容量缩成32MB了&#xff0c;首次见到。。用芯片查询工具显示如下 ChipsBank(芯邦) CBM2199E 使用以下工具&#xff0c;恢复原始容量。。 其他CMB工具可能不行…

面对企业文件交换难题,镭速跨网文件交换系统是如何解决的?

在当今这个数字化快速发展的时代&#xff0c;企业越来越依赖于数据交换来维持其业务运作。无论是内部网络之间的沟通还是与外部合作伙伴的数据共享&#xff0c;高效且安全的跨网文件交换都显得尤为重要。然而&#xff0c;在实际操作中&#xff0c;许多企业面临着各种各样的挑战…

黑马点评 - 商铺类型缓存练习题(Redis List实现)

首先明确返回值是一个 List<ShopType> 类型那么我们修改此函数并在 TypeService 中声明 queryTypeList 方法&#xff0c;并在其实现类中实现此方法 GetMapping("list")public Result queryTypeList() {return typeService.queryTypeList();}实现此方法首先需要…

计算机毕业设计Python+CNN卷积神经网络高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

知识库管理如何推动企业数字化转型与创新发展的深层次探索

内容概要 在当今数字化转型的大背景下&#xff0c;知识库管理日益显现出其作为企业创新发展的核心驱动力的潜力。这种管理方式不仅仅是对信息的存储与检索&#xff0c;更是一种赋能&#xff0c;以提升决策效率和员工创造力。企业能够通过系统地整合和管理各类知识资源&#xf…