norm.cdf(-0.50000001) 不等于 (1-norm.cdf(0.50000001)
时间: 2024-03-02 16:53:46 浏览: 35
事实上, norm.cdf(-0.50000001) 略微不同于 (1 - norm.cdf(0.50000001))。这是由于 norm.cdf 函数的实现方式以及计算机舍入误差等因素的影响。
在Python中,使用scipy库的norm.cdf函数计算 norm.cdf(-0.50000001) 和 (1 - norm.cdf(0.50000001)) 的结果分别为:
```
>>> from scipy.stats import norm
>>> norm.cdf(-0.50000001)
0.3085375387259867
>>> 1 - norm.cdf(0.50000001)
0.3085375387259867
```
可以看到,这两个值非常接近,但是不完全相等。这是由于计算机在处理浮点数时可能会出现舍入误差,导致最终结果略微不同。在某些情况下,这种差异可能会对计算结果产生一定的影响,因此在进行精度要求较高的计算时,需要进行合适的数值分析和误差分析。
相关问题
如何将下面的代码写成一个class:def oprobit(theta): beta=theta[0] BX = x*beta mu1=theta[1] mu2=theta[2] mu3=theta[3] mu4=theta[4] output=np.copy(y) part0=(np.log(stats.norm.cdf(mu1-BX[y==0])-stats.norm.cdf(-np.inf-BX[y==0]))) part1=(np.log(stats.norm.cdf(mu2-BX[y==1])-stats.norm.cdf(mu1-BX[y==1]))) part2=(np.log(stats.norm.cdf(mu3-BX[y==2])-stats.norm.cdf(mu2-BX[y==2]))) part3=(np.log(stats.norm.cdf(mu4-BX[y==3])-stats.norm.cdf(mu3-BX[y==3]))) part4=(np.log(stats.norm.cdf(np.inf-BX[y==4])-stats.norm.cdf(mu4-BX[y==4]))) return -(part0.sum()+part1.sum()+part2.sum()+part3.sum()+part4.sum()) minimize(oprobit, x0=np.array([0.8,4,5,6,7]))
可以将代码写成如下的class:
```python
import numpy as np
from scipy import stats
from scipy.optimize import minimize
class Oprobit:
def __init__(self, x, y):
self.x = x
self.y = y
def __call__(self, theta):
beta = theta[0]
BX = self.x * beta
mu1 = theta[1]
mu2 = theta[2]
mu3 = theta[3]
mu4 = theta[4]
output = np.copy(self.y)
part0 = (np.log(stats.norm.cdf(mu1 - BX[self.y == 0]) - stats.norm.cdf(-np.inf - BX[self.y == 0])))
part1 = (np.log(stats.norm.cdf(mu2 - BX[self.y == 1]) - stats.norm.cdf(mu1 - BX[self.y == 1])))
part2 = (np.log(stats.norm.cdf(mu3 - BX[self.y == 2]) - stats.norm.cdf(mu2 - BX[self.y == 2])))
part3 = (np.log(stats.norm.cdf(mu4 - BX[self.y == 3]) - stats.norm.cdf(mu3 - BX[self.y == 3])))
part4 = (np.log(stats.norm.cdf(np.inf - BX[self.y == 4]) - stats.norm.cdf(mu4 - BX[self.y == 4])))
return -(part0.sum() + part1.sum() + part2.sum() + part3.sum() + part4.sum())
```
然后可以通过如下方式调用:
```python
model = Oprobit(x, y)
result = minimize(model, x0=np.array([0.8, 4, 5, 6, 7]))
```
优化这段代码:def oprobit(theta): beta=theta[0] BX = x*beta mu1=theta[1] mu2=theta[2] mu3=theta[3] mu4=theta[4] output=np.copy(y) part0=(np.log(stats.norm.cdf(mu1-BX[y==0])-stats.norm.cdf(-np.inf-BX[y==0]))) part1=(np.log(stats.norm.cdf(mu2-BX[y==1])-stats.norm.cdf(mu1-BX[y==1]))) part2=(np.log(stats.norm.cdf(mu3-BX[y==2])-stats.norm.cdf(mu2-BX[y==2]))) part3=(np.log(stats.norm.cdf(mu4-BX[y==3])-stats.norm.cdf(mu3-BX[y==3]))) part4=(np.log(stats.norm.cdf(np.inf-BX[y==4])-stats.norm.cdf(mu4-BX[y==4]))) return -(part0.sum()+part1.sum()+part2.sum()+part3.sum()+part4.sum())
可以尝试使用向量化计算,减少循环和重复计算。具体地,可以将 `part0`, `part1`, `part2`, `part3`, `part4` 的计算用向量表示,如下所示:
```
cdfs = stats.norm.cdf(np.array([mu1, mu2, mu3, mu4, np.inf]) - BX)
part0 = np.log(cdfs[0, y == 0] - stats.norm.cdf(-np.inf - BX[y == 0]))
part1 = np.log(cdfs[1, y == 1] - cdfs[0, y == 1])
part2 = np.log(cdfs[2, y == 2] - cdfs[1, y == 2])
part3 = np.log(cdfs[3, y == 3] - cdfs[2, y == 3])
part4 = np.log(stats.norm.cdf(np.inf - BX[y == 4]) - cdfs[3, y == 4])
```
其中,`cdfs` 是一个 $5 \times n$ 的数组,第 $i$ 行表示 $N(\mu_i, 1)$ 的累积分布函数值,$n$ 是样本数量。这样,代码的运行速度将得到显著提升。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)