如何用不同分布对矩阵随机抽样?验证代码及适配大矩阵
1. 现有代码的问题分析
关于“Uniform分布”的代码
这段代码 random1_df = input_df.sample(frac=1, axis=0).sample(frac=1, axis=1) 逻辑上能运行,但和Uniform分布无关——它只是把原DataFrame的行、列各自随机打乱顺序,相当于生成原数据的“排列随机版”,并没有生成服从均匀分布的新数值。而且除了random_state(用来固定随机种子),没有其他可调的随机性参数,没法调整随机程度。
关于“Normal分布”的代码
这段代码完全错误,np.random.choice不支持直接传入二维数组M,运行会抛出ValueError: a must be 1-dimensional的错误。而且这段逻辑和正态分布(Normal)没有任何关系,只是尝试从数组里抽样元素,但写法不符合numpy的要求。
2. 适配50x10 DataFrame的随机化方案
根据你的需求(生成随机版本+可调随机性参数),分三种常见场景处理:
场景1:打乱原数据的行列(保留原数值,仅随机排列)
如果要保留原DataFrame的所有数值,只是随机打乱行和列的顺序,优化原代码即可,还可以通过random_state固定随机种子(可调参数):
# 打乱行+打乱列,random_state用来控制随机性,不同值对应不同打乱结果 random_df = input_df.sample(frac=1, axis=0, random_state=42).sample(frac=1, axis=1, random_state=42)
如果要调整“随机程度”(比如只打乱部分行/列),可以修改frac参数,比如frac=0.8就是随机抽取80%的行/列再打乱:
# 随机抽取80%的行和90%的列并打乱 random_df = input_df.sample(frac=0.8, axis=0, random_state=123).sample(frac=0.9, axis=1, random_state=123)
场景2:生成服从指定分布的新随机矩阵(替换原数值)
如果需要生成全新的、服从Uniform/Normal分布的随机DataFrame,同时调整分布参数,用numpy直接生成后转成DataFrame即可:
均匀分布(Uniform)
import numpy as np import pandas as pd # 生成50行10列的均匀分布随机数,low和high控制取值范围 uniform_data = np.random.uniform(low=0, high=100, size=(50, 10)) uniform_df = pd.DataFrame(uniform_data, columns=input_df.columns, index=input_df.index)
这里low(最小值)和high(最大值)是可调的随机性参数,控制均匀分布的取值范围。
正态分布(Normal)
# 生成50行10列的正态分布随机数,mu为均值,sigma为标准差 mu = 50 # 均值 sigma = 10 # 标准差 normal_data = np.random.normal(loc=mu, scale=sigma, size=(50, 10)) normal_df = pd.DataFrame(normal_data, columns=input_df.columns, index=input_df.index)
这里loc(均值)和scale(标准差)是可调的随机性参数,用来控制正态分布的形态。
场景3:从原数据的元素中随机抽样生成新矩阵
如果需要基于原DataFrame的现有元素,随机抽样填充成新的50x10矩阵,可以这样写:
# 把原数据转成一维数组,抽样50*10个元素(replace=True允许重复抽样) flat_data = input_df.values.flatten() sampled_data = np.random.choice(flat_data, size=(50, 10), replace=True) sampled_df = pd.DataFrame(sampled_data, columns=input_df.columns, index=input_df.index)
这里replace参数可调(True允许重复抽样,False不允许),也可以通过p参数指定元素的抽样概率,实现更灵活的随机性控制。
内容的提问来源于stack exchange,提问作者star_it8293

