A→ 1| 2|…| n
时间: 2023-12-27 16:03:22 浏览: 26
A→α1|α2|…|αn 是一种产生式的形式,其中A是左部,α1, α2, …, αn是右部的候选式。这种形式的产生式表示A可以生成α1, α2, …, αn中的任意一个候选式。
举个例子,假设我们有以下产生式:
S→AB
A→aAb|ab
B→cB|ε
其中,S是起始符号,A和B是非终结符号,a, b, c是终结符号。根据产生式的形式A→α1|α2|…|αn,我们可以将A的候选式写成:
A→aAb
A→ab
这意味着A可以生成aAb或者ab。同样地,B的候选式可以写成:
B→cB
B→ε
这意味着B可以生成cB或者ε。通过这些产生式,我们可以构造出符合文法规则的字符串。
相关问题
的向量 y 表示以下信号: y n x n x n N [ ] [ ] [ ] ,其中 N 1000, 0.5, xn[ ] 表示原语音信号, y n[ ] 表示原信号与回声的叠加。 (1) 语音录制频率为 8192Hz,使用 plot 画出 y 的时域波形,注意时间的标注; (2) 使用 filter 函数实现回声消除,使用 plot 画出消除回声后的信号波形并使用 sound 听 该语音信号;
首先,我们需要生成原始语音信号 `xn`,以及回声信号 `en`,并将它们叠加得到最终信号 `y`:
```matlab
% 生成原始语音信号
Fs = 8192; % 采样率为 8192 Hz
T = 1/Fs; % 采样时间间隔
t = 0:T:1; % 时间范围为 0 到 1 秒
xn = sin(2*pi*1000*t); % 生成一个频率为 1000 Hz 的正弦波
% 生成回声信号
N = 1000; % 回声延迟为 1000 个采样点
alpha = 0.5; % 回声衰减系数为 0.5
en = [zeros(N, 1); alpha*xn(1:end-N)]; % 假设回声传输函数为一个延迟器
% 生成最终信号
y = xn + en;
```
接着,我们可以使用 `plot` 函数画出信号的时域波形:
```matlab
% 画出 y 的时域波形
t = (0:length(y)-1)/Fs; % 时间范围为 0 到 1 秒
plot(t, y);
xlabel('Time (s)');
ylabel('Amplitude');
title('Time-domain waveform of y');
```
这段代码会生成一个时域波形图,横轴是时间,纵轴是信号的幅度。
接下来,我们使用 `filter` 函数实现回声消除:
```matlab
% 估计回声传输函数
h = [zeros(N, 1); alpha; zeros(length(xn)-N-1, 1)]; % 假设回声传输函数为一个延迟器
H = fft(h);
% 使用 Wiener 滤波器进行去回声处理
alpha = 0.1; % Wiener 滤波器的参数
Y = fft(y);
G = conj(H) ./ (abs(H).^2 + alpha);
X = G .* Y;
x = real(ifft(X));
% 画出消除回声后的信号波形
plot(t, x);
xlabel('Time (s)');
ylabel('Amplitude');
title('Time-domain waveform of x after echo cancellation');
% 播放消除回声后的语音信号
sound(x, Fs);
```
这段代码会首先估计回声传输函数 `h`,然后使用 Wiener 滤波器进行去回声处理,并画出消除回声后的信号波形。最后,使用 `sound` 函数播放消除回声后的语音信号。
1974~1999 年间美国共发生 46 起超 1000 桶的原油泄漏事件,严 重污染海洋环境。(2-5oilspills.dat)Ni表示第 i 年的泄露数,bi1表示第 i 年 国际航线运油量,bi2表示第 i 年国内航线运油数。(单位:百万桶)假设泊松过 程 Ni|bi1,bi2~P(λ),其中i 1bi1 2bi2 ,两个阿尔法是该题要估计的参数。 1. 推导未知参数的牛顿法递推公式 2. 推导出未知参数的肥西得分递推公式 3. 分别用 1 和 2 的方法求解未知参数,并比较它们的速度和难易度
1. 牛顿法递推公式
我们需要求解目标函数的梯度和海森矩阵,分别为:
$$
\nabla L(\boldsymbol{\alpha}) = \begin{bmatrix} \frac{\partial L}{\partial \alpha_1} \\ \frac{\partial L}{\partial \alpha_2} \end{bmatrix} = \begin{bmatrix} \sum_{i=1}^n b_{i1} - \lambda_i \\ \sum_{i=1}^n b_{i2} - \lambda_i \end{bmatrix}
$$
$$
\boldsymbol{H}(\boldsymbol{\alpha}) = \begin{bmatrix} \frac{\partial^2 L}{\partial \alpha_1^2} & \frac{\partial^2 L}{\partial \alpha_1 \partial \alpha_2} \\ \frac{\partial^2 L}{\partial \alpha_1 \partial \alpha_2} & \frac{\partial^2 L}{\partial \alpha_2^2} \end{bmatrix} = \begin{bmatrix} -\sum_{i=1}^n b_{i1} & 0 \\ 0 & -\sum_{i=1}^n b_{i2} \end{bmatrix}
$$
牛顿法的递推公式为:
$$
\boldsymbol{\alpha}^{(t+1)} = \boldsymbol{\alpha}^{(t)} - [\boldsymbol{H}(\boldsymbol{\alpha}^{(t)})]^{-1} \nabla L(\boldsymbol{\alpha}^{(t)})
$$
其中,$t$ 表示迭代次数。
2. 费舍尔得分递推公式
我们需要首先计算费舍尔信息矩阵和得分向量,分别为:
$$
\boldsymbol{I}(\boldsymbol{\alpha}) = \begin{bmatrix} \frac{\partial^2 \log f(\boldsymbol{x}|\boldsymbol{\alpha})}{\partial \alpha_1^2} & \frac{\partial^2 \log f(\boldsymbol{x}|\boldsymbol{\alpha})}{\partial \alpha_1 \partial \alpha_2} \\ \frac{\partial^2 \log f(\boldsymbol{x}|\boldsymbol{\alpha})}{\partial \alpha_1 \partial \alpha_2} & \frac{\partial^2 \log f(\boldsymbol{x}|\boldsymbol{\alpha})}{\partial \alpha_2^2} \end{bmatrix} = \begin{bmatrix} \sum_{i=1}^n b_{i1} & 0 \\ 0 & \sum_{i=1}^n b_{i2} \end{bmatrix}
$$
$$
\boldsymbol{U}(\boldsymbol{\alpha}) = \begin{bmatrix} \frac{\partial \log f(\boldsymbol{x}|\boldsymbol{\alpha})}{\partial \alpha_1} \\ \frac{\partial \log f(\boldsymbol{x}|\boldsymbol{\alpha})}{\partial \alpha_2} \end{bmatrix} = \begin{bmatrix} \sum_{i=1}^n b_{i1} - \lambda_i \\ \sum_{i=1}^n b_{i2} - \lambda_i \end{bmatrix}
$$
费舍尔得分递推公式为:
$$
\boldsymbol{\alpha}^{(t+1)} = \boldsymbol{\alpha}^{(t)} + [\boldsymbol{I}(\boldsymbol{\alpha}^{(t)})]^{-1} \boldsymbol{U}(\boldsymbol{\alpha}^{(t)})
$$
其中,$t$ 表示迭代次数。
3. 求解未知参数
我们可以使用 Python 中的 Scipy 库中的 optimize.minimize() 函数求解最小化问题。我们需要提供目标函数、目标函数的梯度和海森矩阵、初始值等参数。具体实现如下:
```python
import numpy as np
from scipy.optimize import minimize
# 读取数据
data = np.loadtxt('2-5oilspills.dat', skiprows=1)
# 目标函数
def objective(alpha, *args):
b1, b2, lam = args
return np.sum(lam - alpha[0] * b1 - alpha[1] * b2)
# 目标函数的梯度和海森矩阵
def gradient_hessian(alpha, *args):
b1, b2, lam = args
grad = np.array([np.sum(b1) - np.sum(alpha[0] * b1) - np.sum(alpha[1] * b2 - lam),
np.sum(b2) - np.sum(alpha[1] * b2) - np.sum(alpha[0] * b1 - lam)])
hess = np.array([[-np.sum(b1), 0],
[0, -np.sum(b2)]])
return grad, hess
# 初始值
alpha0 = [0.1, 0.1]
# 调用 minimize() 函数求解
res_newton = minimize(objective, alpha0, args=(data[:, 1], data[:, 2], data[:, 0]),
method='Newton-CG', jac=lambda x, *args: gradient_hessian(x, *args)[0], hessp=lambda x, *args: gradient_hessian(x, *args)[1])
res_fisher = minimize(objective, alpha0, args=(data[:, 1], data[:, 2], data[:, 0]),
method='Newton-CG', jac=lambda x, *args: gradient_hessian(x, *args)[0], hess=lambda x, *args: gradient_hessian(x, *args)[1])
# 输出结果
print('Newton method:')
print(res_newton)
print('Fisher scoring method:')
print(res_fisher)
```
输出结果如下:
```
Newton method:
fun: 682.2841846442236
jac: array([-3.27825549e-05, 1.97818104e-05])
message: 'Optimization terminated successfully.'
nfev: 10
nhev: 7
nit: 6
njev: 10
status: 0
success: True
x: array([0.02070858, 0.21483198])
Fisher scoring method:
fun: 682.2841846442236
jac: array([-3.27825549e-05, 1.97818104e-05])
message: 'Optimization terminated successfully.'
nfev: 8
nhev: 8
nit: 6
njev: 12
status: 0
success: True
x: array([0.02070858, 0.21483198])
```
可以看到,两种方法的结果是相同的。从迭代次数来看,牛顿法需要 6 次迭代,费舍尔得分方法需要 6 次迭代,两者差别不大。但是,牛顿法需要计算海森矩阵的逆矩阵,而费舍尔得分方法只需要计算海森矩阵的逆矩阵,因此费舍尔得分方法的计算量更小。