Python—创建一个正态分布列矩阵,其中每行总和为1

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.

我正在使用熊猫处理一些选举数据。我想知道,如果甲方不存在,在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. 0.3 0.3 0.4 ... ... ... ... 650 等 等 等 编辑 亨利·埃克(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
    之间,这对于您的用例来说可能不够好,也可能不够好

    请注意,如果平均值较小和/或标准偏差较大,有时会产生负值。根据需要,此解决方案可能会帮助或启发您:)

    编辑 亨利·埃克(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,这似乎是通过在极端情况下叠加来实现的:是否还有其他建议需要确保