精华内容
下载资源
问答
  • 目录0引言1、函数名2、示例2.1正态分布随机数2.2偏正态分布2.3对数正态分布写在最后的话 0引言 最近在看偏正态分布相关的东西,偏正态分布的定义形式还是挺多样的,在偏态分布及其数字特征(R语言可视化)中我介绍的...

    0引言

    最近在看偏正态分布相关的东西,偏正态分布的定义形式还是挺多样的,在偏态分布及其数字特征(R语言可视化)中我介绍的最初的一种定义。在平时做模型做随机模拟的时候的需要产生随机数来检验自己模型估计的有效性,我们可以通过各种分层表示用已知的分布去近似,也可以通过筛法使用均匀分布去生成、也可以用MCMC去采样。但是最为一个专业的统计软件——R语言肯定是有内置函数或者内置包去做的。大家感兴趣原理的也可以自行打开R函数查看。
    本文的主要目的是介绍R语言内部的产生下面分布的随机数的函数。
    – 一元正态分布随机数
    – 一元偏正态分布随机数
    – 一元对数正态随机数
    – 多元正态分布随机数
    – 多元偏正态分布随机数
    – 多元对数正态随机数

    1、函数名

    对于熟悉R语言的人只有函数名字和包名即可,下面列出具体名字。

    维度分布函数
    一维度正态分布rnormstats
    一维度偏正态分布rsnsn
    一维度对数正态rlnormstats
    多维度正态分布mvrnormMASS
    多维度偏正态分布rmsnsn
    多维度对数正态mvlognormalMethylCapSig

    但是对于很多R小白的科研大佬来说只有一个名字是比较浪费时间的,下面给出具体案例。

    2、示例

    先把该安装的包岸上并且载入,后面有备注大家按需安装载入。

    install.packages("MethylCapSig")  # 多元对数正态包
    install.packages("MASS")  # 多元正态分布包
    install.packages("sn")  # 偏态数据包
    library(MASS)
    library(sn)
    library(MethylCapSig)
    

    2.1正态分布随机数

    这块介绍如何生成一元和多元的正态分布随机数。生成正态分布的随机数的函数是rnorm,多元正态随机数用mvrnorm

    #生成n个均值0标准差1的正态随机数
    > n = 10
    > rnorm(n, mean = 0, sd = 1)
     [1]  0.6035027 -0.9081701  1.5303255  0.3761588 -1.6406858 -1.5728766
     [7] -1.6586157  0.8287051  1.7688131  1.1472097
    
    mvrnorm(n = 1, mu, Sigma, tol = 1e-6, empirical = FALSE, EISPACK = FALSE)
    # 生成均值为mu,协方差矩阵为Sigma的10次观测的多元正态随机数
    > mu <- rep(0, 2)
    > mu
    [1] 0 0
    > Sigma <- matrix(c(5,1,1,2),2,2)
    > Sigma
         [,1] [,2]
    [1,]    5    1
    [2,]    1    2
    > mvrnorm(n, mu, Sigma)
                [,1]       [,2]
     [1,]  0.3458454  0.3552218
     [2,] -4.9145503 -2.2932391
     [3,]  2.3285543  1.7957570
     [4,]  2.6422543  1.4493042
     [5,] -2.0447422 -0.5195390
     [6,] -0.5682730 -0.1557601
     [7,] -0.0560933  0.6941458
     [8,]  3.5873361  2.1324344
     [9,] -0.3522617 -1.0535145
    [10,]  1.9490186 -1.7155158
    

    2.2偏正态分布

    这块介绍如何生成一元和多元的偏正态分布随机数。生成偏正态分布的随机数的函数是rsn,多元正态用rmsn

    rsn(n=1, xi=0, omega=1, alpha=0, tau=0,  dp=NULL)
    # 生成10个位置参数为5,标准差为2,偏度为5的一元偏正态分布
    > n = 10
    > rsn(n, 5, 2, 5)
     [1] 6.366628 4.622272 4.973537 5.716082 6.438601 7.489781 5.034990 5.762948
     [9] 9.547775 8.470482
    attr(,"family")
    [1] "SN"
    attr(,"parameters")
    [1] 5 2 5 0
    
    rmsn(n=1, xi=rep(0,length(alpha)), Omega, alpha,  tau=0, dp=NULL)
    # 生成多元偏态分布,均值向量xi,协方差矩阵,偏度向量 alpha
    > xi <- c(0, 0)
    > xi
    [1] 0 0
    > Omega <- matrix(c(5,1,1,2),2,2)
    > Omega
         [,1] [,2]
    [1,]    5    1
    [2,]    1    2
    > alpha <- c(2,-2)
    > alpha
    [1]  2 -2
    > rmsn(10, xi, Omega, alpha)
                 [,1]       [,2]
     [1,] -0.65320266  0.6861521
     [2,]  1.37481687 -0.1659318
     [3,]  3.14522100  0.4529551
     [4,] -0.07057607 -0.6608571
     [5,] -2.68493331 -2.9035422
     [6,]  2.19216656  0.7597699
     [7,]  1.50244323  0.7730602
     [8,] -1.81347772 -1.4717120
     [9,] -0.56875748 -0.8176260
    [10,]  0.88476306 -0.3663496
    attr(,"family")
    [1] "SN"
    attr(,"parameters")
    attr(,"parameters")$xi
    [1] 0 0
    
    attr(,"parameters")$Omega
         [,1] [,2]
    [1,]    5    1
    [2,]    1    2
    
    attr(,"parameters")$alpha
    [1]  2 -2
    
    attr(,"parameters")$tau
    [1] 0
    

    2.3对数正态分布

    这块介绍如何生成一元和多元的对数正态分布随机数。生成对数正态分布的随机数的函数是rlnorm,多元对数正态用mvlognormal

    生成10个对数均值为0,对数标准差为1的对数随机数。
    > n = 10
    > rlnorm(n, meanlog = 0, sdlog = 1)
     [1] 1.5638173 0.7085567 0.9552697 0.7990129 0.3913724 2.3829746 2.7009141
     [8] 2.3251721 4.7090633 0.5284348
    
    mvlognormal(n, Mu, Sigma, R)
    # 生成10个 5维度的多元对数正态分布
    > n = 10
    > p = 5
    > Mu = runif(p, 0, 1)
    > mvlognormal(n, Mu, Sigma = rep(2, p), R = toeplitz(0.5^(0:(p-1))))
                [,1]       [,2]       [,3]       [,4]       [,5]
     [1,] 0.19001058 1.03046394 0.96453695 0.82259809 0.15816013
     [2,] 0.17443047 0.06155735 0.37621382 0.33498919 0.27119953
     [3,] 0.34553546 0.28509934 0.29120016 0.04141813 0.22553617
     [4,] 0.11498941 0.35994614 0.23380755 0.15672124 0.04621199
     [5,] 0.32452033 0.11553876 0.55283657 0.26637357 0.11062302
     [6,] 0.04953786 0.16264098 1.75032911 6.34862167 1.38340544
     [7,] 0.32886451 0.30378793 0.02375825 0.02375620 0.89213319
     [8,] 0.16846539 0.03653899 0.11298382 0.22751003 0.09530435
     [9,] 0.07762988 0.31748557 0.05862739 0.03529833 0.12301490
    [10,] 0.18367711 2.58261427 0.03078996 0.01153906 0.07951331
    > 
    

    写在最后的话

    希望可以帮助大家学习R语言。水平有限发现错误还望及时评论区指正,您的意见和批评是我不断前进的动力。

    展开全文
  • 目标:用python生成一组具有上下限的对数正态分布随机数。思路:利用python的scipy.stats生成截断正态分布,再将正态分布转化为对数正态分布。要求:生成的目标对数正态分布随机数要介于区间[log_lower,log_upper]内...

    目标:用python生成一组具有上下限的对数正态分布随机数。

    思路:利用python的scipy.stats生成截断正态分布,再将正态分布转化为对数正态分布。

    要求:生成的目标对数正态分布随机数要介于区间[log_lower,log_upper]内,这里设定该区间为[5, 10],并绘制正态分布与对数正态分布随机数的直方图。

    源代码:

    import numpy as np

    from pylab import *

    from scipy import stats

    import matplotlib

    import matplotlib.pyplot as plt

    # 设置matplotlib正常显示中文和负号

    matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 用黑体显示中文

    matplotlib.rcParams['axes.unicode_minus'] = False # 正常显示负号

    # region 【功能函数】生成截断对数正态分布,要求对数正态在[log_lower,log_upper]

    def get_trunc_lognorm(mu, sigma, log_lower, log_upper=np.inf, data_num=10000):

    norm_lower = np.log(log_lower)

    norm_upper = np.log(log_upper)

    X = stats.truncnorm((norm_lower - mu) / sigma, (norm_upper - mu) / sigma, loc=mu, scale=sigma)

    norm_data = X.rvs(data_num)

    log_data = np.exp(norm_data)

    return norm_data, log_data

    # endregion

    mu, sigma = 0, 1

    norm_data, log_data = get_trunc_lognorm(mu, sigma, 5, 10)

    figure(4)

    subplot(2, 1, 1)

    plt.hist(norm_data, normed=1, bins=30)

    plt.xticks(np.arange(mu - 5 * sigma, mu + 5 * sigma, 0.5))

    plt.title("中间过程的截断正态分布")

    subplot(2, 1, 2)

    plt.hist(log_data, normed=1, bins=30)

    plt.xticks(np.arange(0, 50, 5))

    # plt.xlim(0,50)

    plt.title("所求的截断对数正态分布")

    plt.show()

    执行结果:

    展开全文
  • 这是使用C++语言编写的产生随机对数正态分布变量的程序
  • 你有对数正态分布的模式和标准偏差。要使用scipy的rvs()方法,必须根据形状参数s参数化分布,这是基本正态分布的标准差sigma,而{},即{},其中{}是基础分布的平均值。在您指出,进行这种重新参数化需要求解四次...

    你有对数正态分布的模式和标准偏差。要使用scipy的rvs()方法,必须根据形状参数s参数化分布,这是基本正态分布的标准差sigma,而{},即{},其中{}是基础分布的平均值。在

    您指出,进行这种重新参数化需要求解四次多项式。为此,我们可以使用numpy.poly1d类。该类的实例有一个roots属性。在

    一个小代数表明exp(sigma**2)是多项式唯一的正实根x**4 - x**3 - (stddev/mode)**2 = 0

    其中stddev和{}是对数正态分布的给定标准差和模式,对于该解,scale(即exp(mu))是

    ^{pr2}$

    下面是一个将模式和标准偏差转换为形状和比例的函数:def lognorm_params(mode, stddev):

    """

    Given the mode and std. dev. of the log-normal distribution, this function

    returns the shape and scale parameters for scipy's parameterization of the

    distribution.

    """

    p = np.poly1d([1, -1, 0, 0, -(stddev/mode)**2])

    r = p.roots

    sol = r[(r.imag == 0) & (r.real > 0)].real

    shape = np.sqrt(np.log(sol))

    scale = mode * sol

    return shape, scale

    例如In [155]: mode = 123

    In [156]: stddev = 99

    In [157]: sigma, scale = lognorm_params(mode, stddev)

    使用计算的参数生成样本:In [158]: from scipy.stats import lognorm

    In [159]: sample = lognorm.rvs(sigma, 0, scale, size=1000000)

    这是样品的标准偏差:In [160]: np.std(sample)

    Out[160]: 99.12048952171304

    下面是一些matplotlib代码来绘制样本的柱状图,在绘制样本的分布模式下绘制一条垂直线:In [176]: tmp = plt.hist(sample, normed=True, bins=1000, alpha=0.6, color='c', ec='c')

    In [177]: plt.xlim(0, 600)

    Out[177]: (0, 600)

    In [178]: plt.axvline(mode)

    Out[178]:

    柱状图:

    5ab27f757d1418ab08572fdd4c9a58c0.png

    如果要使用numpy.random.lognormal()而不是scipy.stats.lognorm.rvs()生成样本,可以执行以下操作:In [200]: sigma, scale = lognorm_params(mode, stddev)

    In [201]: mu = np.log(scale)

    In [202]: sample = np.random.lognormal(mu, sigma, size=1000000)

    In [203]: np.std(sample)

    Out[203]: 99.078297384090902

    我还没有研究poly1d的roots算法的健壮性,所以一定要测试各种可能的输入值。或者,您可以使用scipy的解算器来求解x的上述多项式。可以使用以下方法绑定解决方案:max(sqrt(stddev/mode), 1) <= x <= sqrt(stddev/mode) + 1

    展开全文
  • 我想使用Scipy拟合对数正态分布。我之前已经使用Matlab来完成它,但由于需要将应用程序扩展到统计分析之外,我正在试图在Scipy中重现拟合值。拟合对数正态分布使用Scipy与Matlab下面是Matlab代码我用适合我的数据:%...

    我想使用Scipy拟合对数正态分布。我之前已经使用Matlab来完成它,但由于需要将应用程序扩展到统计分析之外,我正在试图在Scipy中重现拟合值。拟合对数正态分布使用Scipy与Matlab

    下面是Matlab代码我用适合我的数据:

    % Read input data (one value per line)

    x = [];

    fid = fopen(file_path, 'r'); % reading is default action for fopen

    disp('Reading network degree data...');

    if fid == -1

    disp('[ERROR] Unable to open data file.')

    else

    while ~feof(fid)

    [x] = [x fscanf(fid, '%f', [1])];

    end

    c = fclose(fid);

    if c == 0

    disp('File closed successfully.');

    else

    disp('[ERROR] There was a problem with closing the file.');

    end

    end

    [f,xx] = ecdf(x);

    y = 1-f;

    parmhat = lognfit(x); % MLE estimate

    mu = parmhat(1);

    sigma = parmhat(2);

    而这里的拟合图:

    nFA9L.png

    现在,这里是我的Python代码实现同样的目的:

    import math

    from scipy import stats

    from statsmodels.distributions.empirical_distribution import ECDF

    # The same input is read as a list in Python

    ecdf_func = ECDF(degrees)

    x = ecdf_func.x

    ccdf = 1-ecdf_func.y

    # Fit data

    shape, loc, scale = stats.lognorm.fit(degrees, floc=0)

    # Parameters

    sigma = shape # standard deviation

    mu = math.log(scale) # meanlog of the distribution

    fit_ccdf = stats.lognorm.sf(x, [sigma], floc=1, scale=scale)

    下面是使用Python代码的配合。

    mDxHE.png

    正如你看到的,代码两套能够产生良好的配合,至少在视觉上来讲的。

    问题是估计参数mu和sigma存在巨大差异。

    来自Matlab:mu = 1.62 sigma = 1.29。 Python:mu = 2.78 sigma = 1.74。

    为什么会有这样的差异?

    注意:我已经仔细检查过两套数据都是正确的,一样。分数相同,分布相同。

    非常感谢您的帮助!提前致谢。

    其他信息:

    import scipy

    import numpy

    import statsmodels

    scipy.__version__

    '0.9.0'

    numpy.__version__

    '1.6.1'

    statsmodels.__version__

    '0.5.0.dev-1bbd4ca'

    Matlab的版本是R2011b。

    版:

    正如下面的回答证明,故障在于SciPy的0.9。我能够使用Scipy 11.0从Matlab重现mu和sigma结果。

    一个简单的方法来更新您的SciPy的是:

    pip install --upgrade Scipy

    如果你不具备PIP(你应该!):

    sudo apt-get install pip

    2013-03-26

    Mike

    +1

    看看这两组数据点,它们看起来相当不同(例如,比较右下角蓝色圆圈的位置)。如果数据不相同,则没有理由认为适合。 –

    2013-03-26 06:29:18

    +0

    两组数据*完全相同。我已经彻底检查过,以确保事实并非如此。这些图显示略有不同,因为我用来在Matlab中绘制的代码是非库代码。无论如何,要点是所拟合的数据完全相同,因此它们应该产生相同的平均值和标准偏差值。 –

    2013-03-26 06:40:59

    +0

    我很抱歉,但我不买这个(除非情节是关闭的)。只是直观地比较两个图上最右边的点的横坐标,看看它们是*非常*不同。如果您肯定数据是相同的,请将它与您用于将其读入Python和MATLAB的代码一起包含它。 –

    2013-03-26 06:44:34

    展开全文
  • 1. 均匀分布 函数形式: x=rand(n,m) n - 行数 ...3. 对数正态分布 函数形式 x=lognrnd(mu,sigma,a,b) mu- 对数值的均值(mean of logarithmic values);mu = log((m^2)/sqrt(v+m^2)); (m - ..
  • 根据对数正态分布产生随机数

    万次阅读 2016-08-10 16:44:54
    根据对数正态分布产生随机数
  • 这一次我将使用简单的语言,使用实例的方式展示对数正态分布在数学建模比赛中的应用。 正态分布物理意义 我们先从正态分布的物理意义说起,虽然大家可能都知其公式,但是对其物理意义并没非常深刻的理解。简而言之...
  • dist = lognorm([1.744],loc=2.0785) dist.cdf(25) # yields=0.96374596, expected=0.7434 更新2: 工作lognorm实现,产生正确的0.7434结果。 def lognorm(self,x,mu=0,sigma=1): a = (math.log(x) - mu)/math.sqrt...
  • 使用现代优化理论中的混合同余法,用C语言产生服从标准正态分布的随机数。
  • 对数正态随机变量 创建一个用对数绘制填充的或数组。 安装 $ npm install distributions-lognormal-random 要在浏览器中使用,请使用 。 用法 var random = require ( 'distributions-lognormal-random' ) ; ...
  •  cout 输入对数正态分布的方差:";  cin >> sigma;  cout 输入随机数的种子:";  cin >> s;  cout 生成的随机数结果为:" ;  for(i = 0; i ; i++)  {  for(j = 0; j ; j++)  {  ...
  • 对数正态lognormal分布图像

    万次阅读 2015-12-15 19:16:04
    在概率论与统计学中,对数正态分布是对数为正态分布的任意随机变量的概率分布。如果 X 是服从正态分布的随机变量,则 exp(X) 服从对数正态分布;同样,如果 Y 服从对数正态分布,则 ln(Y) 服从正态分布。 如果一...
  • 最近由于项目需求,需要c#编程实现...1·确定参数的一个数据分布和决定模拟次数,在服从该分布的情况下产生N个随机数。 2·将每次产生的随机数,带入表达式中算出结果,这样可以得到N个结果。 3·用统计方法把N...
  • 大千世界随机现象众多,其分布各异。按数据变量类型划分可以分为离散型与连续性两类:离散型变量根据名称很好理解,就是数据的取值是不连续的。例如掷硬币就是一个典型的离散数据,因为抛硬币的就2种结果。你可以把...
  • Wikipedia表示对数正态分布的参数是用基本正态分布表示的,因此:lognormal_mean = np.exp(normal_mean + normal_std**2 / 2)lognormal_std = np.sqrt(np.exp(normal_std**2) - 1) * np.exp(normal_mean + normal_...
  • 利用boxmuller算法生成符合正态分布的随机数。输入方差、期望、数目后运行即可。
  • 本文提出了一种产生正态分布随机噪声的设计方案。即利用MATLAB软件的仿真功能来产生若干正态分布随机噪声,然后以数据文件的形式将其存储在EPROM中并在地址发生器作用下输出噪声,以定量检验直接序列扩频系统(DSSS)的...
  • 正态分布随机数生成算法》由会员分享,可在线阅读,更多相关《正态分布随机数生成算法(7页珍藏版)》请在人人文库网上搜索。1、概率论与数理统计课程设计题目:正态分布随机数生成算法要编程得到服从均匀分布的伪...
  • 1.产生100个随机样本 set.seed(100) lnormdata1 <- rlnorm(100, 2, 3) 2.利用不同方法计算参数的极大似然估计 Step1: Set the initial value theta0 <- c(1, 2) data0 <- log(lnormdata1) Step2: Give ...
  • Matlab正态分布随机数

    2011-10-18 12:08:52
    Matlab正态分布随机数,产生N(a,b^2)的正态分布
  • C++产生正态分布

    千次阅读 2017-09-09 17:10:12
    //对数正态分布概率密度函数 {   return   1.0/(x* sqrt (2*PI)*sigma) *  exp (-1*( log (x)-miu)*( log (x)-miu)/(2*sigma*sigma)); } 4.求正态分布随机数 ...
  • C语言 产生标准正态分布或高斯分布 随机数 产生正态分布或高斯分布的三种方法:1. 运用中心极限定理(大数定理) 1 #include 2 #include 3 4 #define NSUM 25 5 6 double gaussrand() 7 { 8 double ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,712
精华内容 3,484
关键字:

产生对数正态分布

友情链接: CefSharp-master.zip