Python—创建一个正态分布列矩阵,其中每行总和为1
我正在使用熊猫处理一些选举数据。我想知道,如果甲方不存在,在650个席位中,甲方的选票将如何转移到乙方和丙方 我们假设我们知道,在全国范围内:Python—创建一个正态分布列矩阵,其中每行总和为1,python,python-3.x,pandas,math,Python,Python 3.x,Pandas,Math,我正在使用熊猫处理一些选举数据。我想知道,如果甲方不存在,在650个席位中,甲方的选票将如何转移到乙方和丙方 我们假设我们知道,在全国范围内: 给乙方:48%转让给乙方 向丙方:32%将转让给丙方 致挪威电视台:20%的人不会投票 我希望为每个座位生成0到1之间的数字正态分布,其中: 每行的总和为1 柱到_B的平均值为0.48 列到_C的平均值为0.32 柱的平均值为0.2 以完全独立的数字为例: 座位 托布 到 给(dnv) 1. 0.5 0.3 0.2 2. 0.1 0.6 0.3 3.
- 给乙方:48%转让给乙方
- 向丙方:32%将转让给丙方
- 致挪威电视台:20%的人不会投票
将numpy导入为np
#为A和B生成数据
#比例是标准偏差,可以调整以适应任务
a=np.随机.正常(loc=0.48,标度=0.05,尺寸=650)
b=np.随机.正常(loc=0.32,刻度=0.05,尺寸=650)
#现在要生成C,我们不能使用相同的方法,因为这不会一直等于1(显然)
#相反,我们将该列最多填充1
c=1-a-b
#这应该接近0.2
印刷品(np.平均值(c))
当运行它100次时,对我来说,计算出的平均值总是介于0.19450
和0.20521
之间,这对于您的用例来说可能不够好,也可能不够好
请注意,如果平均值较小和/或标准偏差较大,有时会产生负值。根据需要,此解决方案可能会帮助或启发您:)编辑
亨利·埃克(Henry Ecker)的上述答案无疑是更好的解决方案。把这个留着,以防有人发现它有用
原液
好吧,我有一些东西似乎是有效的,但可能在数学上不合理
其思想是为a和b生成两个正态分布的随机变量列表,并为c将其填充到1
将numpy导入为np
#为A和B生成数据
#比例是标准偏差,可以调整以适应任务
a=np.随机.正常(loc=0.48,标度=0.05,尺寸=650)
b=np.随机.正常(loc=0.32,刻度=0.05,尺寸=650)
#现在要生成C,我们不能使用相同的方法,因为这不会一直等于1(显然)
#相反,我们将该列最多填充1
c=1-a-b
#这应该接近0.2
印刷品(np.平均值(c))
当运行它100次时,对我来说,计算出的平均值总是介于0.19450
和0.20521
之间,这对于您的用例来说可能不够好,也可能不够好
请注意,如果平均值较小和/或标准偏差较大,有时会产生负值。根据需要,此解决方案可能会帮助或激励您:)听起来似乎可以在这里工作:
将numpy导入为np
作为pd进口熊猫
#为再现性设置种子(如果需要不同的随机数,则删除)
np.随机种子(5)
#创建狄里克莱分布
a=np.random.dirichlet((.48.32.2),大小=600)
df=pd.DataFrame(a,列=['to_B'、'to_C'、'to_dnv'])
df=df。重命名_轴(“座椅”)
框架
行和
print(df.sum(axis=1))
seat
0 1.0
1 1.0
2 1.0
3 1.0
4 1.0
...
595 1.0
596 1.0
597 1.0
598 1.0
599 1.0
Length: 600, dtype: float64
列表示
print(df.mean(axis=0))
to_B 0.473463
to_C 0.317920
to_dnv 0.208617
dtype: float64
这听起来好像可以在这里工作:
将numpy导入为np
作为pd进口熊猫
#为再现性设置种子(如果需要不同的随机数,则删除)
np.随机种子(5)
#创建狄里克莱分布
a=np.random.dirichlet((.48.32.2),大小=600)
df=pd.DataFrame(a,列=['to_B'、'to_C'、'to_dnv'])
df=df。重命名_轴(“座椅”)
框架
行和
print(df.sum(axis=1))
seat
0 1.0
1 1.0
2 1.0
3 1.0
4 1.0
...
595 1.0
596 1.0
597 1.0
598 1.0
599 1.0
Length: 600, dtype: float64
列表示
print(df.mean(axis=0))
to_B 0.473463
to_C 0.317920
to_dnv 0.208617
dtype: float64
您是否已对尝试(部分工作或其他)进行编码?如果是这样的话,很高兴与大家分享它,这样人们就可以对你的代码提出改进建议。事实上,我不知道该从哪里开始这个问题的下一部分。不幸的是,它非常数学化,有点超出了我的专业知识。但是我现在已经用我到目前为止所用的代码编辑了这篇文章,我希望它能更好地展示我正在尝试做的事情的背景。你已经有一个尝试(部分工作或其他)编码了吗?如果是这样的话,很高兴与大家分享它,这样人们就可以对你的代码提出改进建议。事实上,我不知道该从哪里开始这个问题的下一部分。不幸的是,它非常数学化,有点超出了我的专业知识。但是我现在已经用我到目前为止所用的代码编辑了这篇文章,我希望它能更好地展示我所要做的事情的背景。太棒了+1.我对
scipy.stats.truncnorm
和rvs
有一个(类似的)解决方案,但是Dirichlet分布在这里是完美的!太神了很好,非常感谢。不过,我已经看过了用这个做的分布,它似乎与正态分布相反。第一个例子的平均值约为0.3,第二个例子的平均值为0.5,这似乎是通过在极端情况下堆积来实现的:有没有其他建议来确保这是正常的?@Corrarien我仍然有兴趣看到你的解决方案,如果你有:)太好了+1.我对scipy.stats.truncnorm
和rvs
有一个(类似的)解决方案,但是Dirichlet分布在这里是完美的!太神了很好,非常感谢。不过,我已经看过了用这个做的分布,它似乎与正态分布相反。第一个例子的平均值约为0.3,第二个例子的平均值为0.5,这似乎是通过在极端情况下叠加来实现的:是否还有其他建议需要确保