import numpy as np
np.random.seed(73)
A=np.random.randn(7,3)
|
### 基本用法
`np.random.lognormal` 用于生成**对数正态分布**的随机样本:若 `X` 服从对数正态分布,则 `ln(X)` 服从正态分布。
```python
import numpy as np
np.random.seed(73)
# 生成 1 个样本(默认 mean=0.0, sigma=1.0)
x = np.random.lognormal()
print(x)
# 生成 1000 个样本,底层正态分布均值为 0,标准差为 0.5
samples = np.random.lognormal(mean=0.0, sigma=0.5, size=1000)
print(samples[:5])
# 生成 3 行 4 列的二维数组
arr = np.random.lognormal(mean=1.0, sigma=0.3, size=(3, 4))
print(arr.shape)
```
对数正态分布的取值**恒大于 0**,且具有右偏(长尾)特性。
|
|
### 绘制分布图
结合 matplotlib 可以直观查看对数正态分布的形状:
```python
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(73)
samples = np.random.lognormal(mean=0.0, sigma=0.5, size=10000)
plt.hist(samples, bins=100, density=True, alpha=0.7)
plt.title("Lognormal Distribution")
plt.xlabel("x")
plt.ylabel("density")
plt.show()
```
也可以验证 `ln(X)` 服从正态分布:
```python
log_samples = np.log(samples)
plt.hist(log_samples, bins=100, density=True, alpha=0.7)
plt.title("ln(X) - Normal Distribution")
plt.show()
```
|
|
### 典型应用场景
对数正态分布常用于建模"取值非负、右偏长尾"的数据:
- **金融**:股票价格、收益率的建模
- **收入分布**:大部分人的收入集中在中低区间,少数人收入很高
- **生物/医学**:细胞大小、药物浓度等
- **文件大小/网络流量**:大部分文件较小,少数文件很大
```python
import numpy as np
np.random.seed(73)
# 模拟 10000 个人的年收入(万元)
income = np.random.lognormal(mean=2.5, sigma=0.4, size=10000)
print("均值:", income.mean())
print("中位数:", np.median(income))
```
|
|
### 参数说明
函数签名:
```python
np.random.lognormal(mean=0.0, sigma=1.0, size=None)
```
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `mean` | float 或 array_like | 0.0 | 底层正态分布(即 `ln(X)`)的均值 μ |
| `sigma` | float 或 array_like | 1.0 | 底层正态分布的标准差 σ,**必须大于 0** |
| `size` | int 或 tuple | None | 输出形状。`None` 时返回单个值;`(m, n)` 返回 m 行 n 列数组 |
返回值:`ndarray` 或标量,所有取值**恒大于 0**。
注意:`mean` 和 `sigma` 是 `ln(X)` 的均值和标准差,**不是** X 本身的均值和标准差。
|
|
### 参数对分布的影响
- `mean`(μ)控制分布的**位置**:μ 越大,样本整体越大
- `sigma`(σ)控制分布的**偏度/长尾程度**:σ 越大,右尾越长,分布越偏
X 本身的统计量与参数的关系:
| 统计量 | 公式 |
|--------|------|
| 中位数 | `exp(μ)` |
| 均值 | `exp(μ + σ²/2)` |
| 方差 | `(exp(σ²) - 1) * exp(2μ + σ²)` |
```python
import numpy as np
np.random.seed(73)
# sigma 越大,均值与中位数的差距越大(长尾越明显)
for sigma in [0.2, 0.5, 1.0]:
s = np.random.lognormal(mean=0.0, sigma=sigma, size=100000)
print("sigma =", sigma,
" 均值 =", round(s.mean(), 3),
" 中位数 =", round(np.median(s), 3))
```
|
|
### rand / randn / randint
```python
import numpy as np
np.random.seed(73)
# rand: [0, 1) 均匀分布,参数直接传维度
a = np.random.rand(2, 3)
# randn: 标准正态分布(均值0,标准差1),参数直接传维度
b = np.random.randn(2, 3)
# randint: [low, high) 之间的随机整数
c = np.random.randint(low=0, high=10, size=(2, 3))
```
| 函数 | 参数 | 说明 |
|------|------|------|
| `rand(d0, d1, ...)` | 各维度大小 | `[0, 1)` 均匀分布 |
| `randn(d0, d1, ...)` | 各维度大小 | 标准正态分布 |
| `randint(low, high=None, size=None)` | low 含、high 不含 | 随机整数;high 缺省时取 `[0, low)` |
注意:`rand` / `randn` 的维度是**多个独立参数**,不是元组;`randint` 的 `size` 才是元组。
|
|
### choice / shuffle / permutation
```python
import numpy as np
np.random.seed(73)
# choice: 从给定数组中随机抽样
a = np.random.choice([10, 20, 30, 40, 50], size=3, replace=False)
# replace=False 表示不放回抽样;可用 p 指定每个元素的概率
b = np.random.choice([0, 1], size=10, p=[0.7, 0.3])
# shuffle: 原地打乱数组(无返回值)
arr = np.arange(10)
np.random.shuffle(arr)
# permutation: 返回打乱后的副本,原数组不变
perm = np.random.permutation(10)
```
| 函数 | 关键参数 | 说明 |
|------|----------|------|
| `choice(a, size, replace, p)` | `a` 候选集;`replace` 是否放回;`p` 抽样概率 | 随机抽样 |
| `shuffle(x)` | 被打乱的数组 | **原地**打乱,返回 None |
| `permutation(x)` | 整数或数组 | 返回打乱的**副本** |
|
|
### 常见分布函数
```python
import numpy as np
np.random.seed(73)
# uniform: [low, high) 均匀分布
u = np.random.uniform(low=0.0, high=1.0, size=5)
# normal: 正态分布,loc 均值,scale 标准差
n = np.random.normal(loc=0.0, scale=1.0, size=5)
# binomial: 二项分布,n 次试验,p 为成功概率
b = np.random.binomial(n=10, p=0.5, size=5)
# poisson: 泊松分布,lam 为单位时间平均发生次数
p = np.random.poisson(lam=3.0, size=5)
# exponential: 指数分布,scale = 1/λ
e = np.random.exponential(scale=1.0, size=5)
# beta / gamma / chisquare 等
be = np.random.beta(a=2.0, b=5.0, size=5)
g = np.random.gamma(shape=2.0, scale=1.0, size=5)
```
| 函数 | 主要参数 | 分布 |
|------|----------|------|
| `uniform(low, high, size)` | 区间下界/上界 | 均匀分布 |
| `normal(loc, scale, size)` | 均值/标准差 | 正态分布 |
| `binomial(n, p, size)` | 试验次数/成功概率 | 二项分布 |
| `poisson(lam, size)` | 平均发生次数 λ | 泊松分布 |
| `exponential(scale, size)` | scale = 1/λ | 指数分布 |
| `lognormal(mean, sigma, size)` | 底层正态的 μ/σ | 对数正态分布 |
|