根据标准差(sigma)改变正态分布的方差。

huangapple go评论109阅读模式
英文:

Changing variance based on sigma for a normal distribution

问题

  1. 我正在创建一个不同运行的随机正态分布数组并将其写入```csv```文件我正在打印每次运行的```均值方差```以下是当前和预期的输出
  2. 当前输出是
  3. ```plaintext
  4. Mean = 49.99999999999999
  5. var = 1.0
  6. Mean = 49.99999999999999
  7. var = 1.0
  8. Mean = 49.99999999999999
  9. var = 0.9999999999999996
  10. Mean = 49.99999999999999
  11. var = 1.0000000000000004
  12. Mean = 49.99999999999999
  13. var = 1.0

预期输出是

  1. Mean = 49.99999999999999
  2. var = 10.0
  3. Mean = 49.99999999999999
  4. var = 10.0
  5. Mean = 49.99999999999999
  6. var = 0.9999999999999996
  7. Mean = 49.99999999999999
  8. var = 10.0000000000000004
  9. Mean = 49.99999999999999
  10. var = 10.0
  1. <details>
  2. <summary>英文:</summary>
  3. I am creating an array of random normal distribution for different runs and writing to a ```csv``` file. I am printing the ```mean,var``` for each run. I present the current and expected output.

from scipy.stats import truncnorm
import numpy as np
import os
import csv
import pandas as pd
import random
import matplotlib.pyplot as plt

Runs=5

for i in range(0,Runs):

  1. mu, sigma = 50.0, 10.0 # mean and standard deviation
  2. Nodes=220
  3. r = (1e-6)*np.random.normal(mu, sigma, Nodes)
  4. sort_r = np.sort(r)
  5. r1=sort_r[::-1]
  6. r1=r1.reshape(1,Nodes)
  7. r2 = r.copy()
  8. np.random.shuffle(r2.ravel()[1:])
  9. r2=r2.reshape(1,Nodes)
  10. maximum = r2.max()
  11. indice1 = np.where(r2 == maximum)
  12. r2[indice1] = r2[0][0]
  13. r2[0][0] = maximum
  14. r2[0][Nodes-1] = maximum
  15. a = (1e-6) * (50 + (r - r.mean()) / r.std())
  16. mean=a.mean()*1e6
  17. var=a.std()*1e6
  18. print(&quot;Mean =&quot;, mean)
  19. print(&quot;var =&quot;, var)
  20. with open(rf&quot;Radius info_{Nodes}ND.txt&quot;, &#39;w+&#39;) as f:
  21. f.write(f&quot;mean = {str(mean)}\n&quot;)
  22. f.write(f&quot;var = {str(var)}\n&quot;)
  23. #f.write(f&quot;std = {str(std*1e6)}\n&quot;)
  24. r=pd.Series(r*1e6)
  25. #print(&quot;r =&quot;,r)
  26. r.hist()
  27. plt.xlabel(&quot;Pore throat size [\u03BCm]&quot;,size=15)
  28. plt.ylabel(&quot;Count&quot;,size=15)
  29. plt.title(rf&quot;var={round(var,1)}&quot;,size=25)
  30. plt.savefig(rf&quot;C:\Users\USER\OneDrive - Technion\Research_Technion\Python_PNM\Surfactant A-D0 nodes_2\Histogram.png&quot;)

def function(run):
parent_folder = str(run + 1)
os.mkdir(parent_folder)

  1. with open(os.path.join(parent_folder, rf&quot;Inv_Radius_{Nodes}_{round(mean,1)}_{round(var,1)}ND.csv&quot;), &#39;w+&#39;) as f:
  2. np.random.shuffle(r2[0][1:-1])
  3. #print(f&#39;{run}:{r2}&#39;)
  4. inv_r=1/r2
  5. #print(&quot;inv_r =&quot;,[inv_r])
  6. writer = csv.writer(f)
  7. writer.writerows(inv_r)

for x in range(Runs):
function(x)

  1. The current output is

Mean = 49.99999999999999
var = 1.0
Mean = 49.99999999999999
var = 1.0
Mean = 49.99999999999999
var = 0.9999999999999996
Mean = 49.99999999999999
var = 1.0000000000000004
Mean = 49.99999999999999
var = 1.0

  1. The expected output is

Mean = 49.99999999999999
var = 10.0
Mean = 49.99999999999999
var = 10.0
Mean = 49.99999999999999
var = 0.9999999999999996
Mean = 49.99999999999999
var = 10.0000000000000004
Mean = 49.99999999999999
var = 10.0

  1. </details>
  2. # 答案1
  3. **得分**: 1

你需要将 r.std() 除以 sigma(目标标准差):

将:

  1. a = (1e-6) * (50 + (r - r.mean()) / r.std())

替换为:

  1. a = (1e-6) * (mu + (r - r.mean()) / (r.std() / sigma))

输出:

  1. 均值 = 49.99999999999999
  2. 方差 = 9.999999999999998
  3. 均值 = 49.99999999999999
  4. 方差 = 10.0
  5. 均值 = 49.99999999999999
  6. 方差 = 10.0
  7. 均值 = 49.99999999999999
  8. 方差 = 10.0
  9. 均值 = 49.999999999999986
  10. 方差 = 10.0
英文:

You have to divide r.std() by sigma (the target std):

Replace:

  1. a = (1e-6) * (50 + (r - r.mean()) / r.std())

with:

  1. a = (1e-6) * (mu + (r - r.mean()) / (r.std() / sigma))

Output:

  1. Mean = 49.99999999999999
  2. var = 9.999999999999998
  3. Mean = 49.99999999999999
  4. var = 10.0
  5. Mean = 49.99999999999999
  6. var = 10.0
  7. Mean = 49.99999999999999
  8. var = 10.0
  9. Mean = 49.999999999999986
  10. var = 10.0

huangapple
  • 本文由 发表于 2023年6月5日 21:52:34
  • 转载请务必保留本文链接:https://go.coder-hub.com/76407131.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定