当前位置: 首页 > news >正文

CTGAN 合成数据生成与验证脚本学习笔记

CTGAN 合成数据生成与验证脚本学习笔记

本笔记详细讲解如何使用 CTGAN 对混凝土材料数据进行合成、物理约束筛选,并进行统计与分布验证。适合数据科学、材料科学相关领域学习者参考。

1. 导入依赖与数据读取

首先导入所需库,并读取原始数据:

import pandas as pd
import numpy as np
from ctgan import CTGAN
from sklearn.preprocessing import QuantileTransformer
import warningswarnings.filterwarnings('ignore')
# 读取数据
....

2. 数据预处理

将所有数据列转换为 float,并用 QuantileTransformer 统一分布(有助于后续建模):

# 数据预处理
for column in real_data.columns:real_data.loc[:, column] = real_data[column].astype(float)# QuantileTransformer进行分布转换
transformer = QuantileTransformer(output_distribution='normal')
transformed_data = pd.DataFrame(transformer.fit_transform(real_data),columns=real_data.columns
)

3. CTGAN 模型构建与训练

设置 CTGAN 参数并训练生成模型:

# 定义离散列
discrete_columns = []# 优化CTGAN模型参数
ctgan = CTGAN(epochs=2000,  # 训练轮数batch_size=100,  # 批次大小pac=5,  # pac参数generator_dim=(512, 1024, 2048, 1024, 512),  # 网络结构discriminator_dim=(512, 1024, 2048, 1024, 512),generator_lr=1e-5,  #学习率discriminator_lr=1e-5,discriminator_steps=3,  # 判别器训练步数verbose=True
)# 训练模型
print("开始训练模型...")
ctgan.fit(transformed_data, discrete_columns)

4. 生成与反向转换数据

生成十倍于原始数据量的合成数据,并反向转换回原始分布:

# 生成数据后筛选
n_synthetic = len(real_data) * 10  # 生成数据
synthetic_transformed = ctgan.sample(n_synthetic)# 反向转换数据
synthetic_data = pd.DataFrame(transformer.inverse_transform(synthetic_transformed),columns=real_data.columns
)

5. 物理约束函数

apply_physical_constraints

为合成数据添加物理约束,确保各成分比例合理,且分布接近原始数据。

def apply_physical_constraints(data, real_data):# 确保所有值非负for col in data.columns:data.loc[:, col] = np.maximum(data[col], 0)#归一化binder_sum = data[binder_columns].sum(axis=1)for col in binder_columns:data.loc[:, col] = data[col] / binder_sum#物理约束constraints = {#范围约束}# 硬约束for col, (min_val, max_val) in constraints.items():data.loc[:, col] = data[col].clip(min_val, max_val)

6. 分布相似性筛选函数

select_best_samples_with_distribution

用 Wasserstein 距离筛选与原始分布最接近的合成样本。

def select_best_samples_with_distribution(synthetic_data, real_data, n_select):from scipy.stats import wasserstein_distance# Wasserstein距离distances = []for i in range(len(synthetic_data)):sample = synthetic_data.iloc[i:i + 1]# 特征Wasserstein距离总和dist_sum = 0for col in real_data.columns:# 权重weight = 2.0 if col in ['Cement', 'FA', 'GGBFS', 'F-D', 'F-L'] else 1.0dist = wasserstein_distance(sample[col], real_data[col]) * weightdist_sum += distdistances.append(dist_sum)# 选择距离最小n_selectbest_indices = np.argsort(distances)[:n_select]return synthetic_data.iloc[best_indices]

7. 约束与筛选后的数据保存与验证

应用物理约束与分布筛选后,保存合成数据并进行多项统计验证:

synthetic_data = apply_physical_constraints(synthetic_data, real_data)
synthetic_data = select_best_samples_with_distribution(synthetic_data, real_data, len(real_data))

8.结果(部分)

在这里插入图片描述

##本文档仅供学习参考,实际使用时请结合具体数据和业务需求调整参数与约束条件。

http://www.xdnf.cn/news/51751.html

相关文章:

  • StringEscapeUtils:给你的字符串穿上“防弹衣“——转义工具类深度解析
  • Spring Boot 实现定时任务的案例
  • Linux 学习 6 文件相关命令包含查询
  • String +memset字符串类题型【C++】
  • 从零创建 Docker 镜像(基于 OCI 格式)
  • 【kubernetes】pod资源配额
  • 016-C语言内存函数
  • 每日一题算法——链表相交
  • git学习日志
  • Java EE(20)——线程安全——ThreadLocal
  • 第36讲:作物生长预测中的时间序列建模(LSTM等)
  • buildroot构建根文件系统报错(已解决大部分问题)
  • Linux学习——Linux进程间通信(IPC)聊天程序实践
  • Android开发中广播(Broadcast)技术详解
  • 线程基础题
  • FOC控制中的正弦PWM和空间矢量PWM对比与理解
  • 【计量地理学】实验五 试验变异函数计算
  • 软件设计师/系统架构师---计算机网络
  • Python爬虫实战:获取fenbi网最新备考资讯
  • 机器学习专栏(4):从数据饥荒到模型失控,破解AI训练的七大生死劫
  • SpringBoot Actuator健康检查:自定义HealthIndicator
  • Java 8 date/time type `java.time.LocalDateTime`
  • FreeRTOS中断管理
  • LangChain4j对话内存管理:ChatMemory原理与实战应用
  • 【深度学习与大模型基础】第12章-损失函数与梯度下降
  • 高等数学同步测试卷 同济7版 试卷部分 上 做题记录 上册期中同步测试卷 B卷
  • 相对路径和绝对路径解析
  • windows下配置Ninja
  • 算法笔记—动态规划
  • Multisim使用教程详尽版--(2025最新版)