-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[概率论] 和分布的分位数问题 #5
Comments
X Y 是两个相互独立的随机变量,之前忘了交代。 |
Median(X)=log2(e) (see wiki_frechet ) 根据WolframAlpha计算结果: |
挺有意思的例子,尤其是 Frechet 分布,只有小于 a 阶的矩。 |
@Joe-C-Ding 我其实是wiki上扒了一个非对称的分布下来,选择Frechet主要因为它的PDF比较好写 :X |
的确f(0.5)=0一般不成立的。(见该笔记) 代了几个Gamma分布看起来根的数量也不太好确定(诡异的是f(1)=0看起来并不总是成立,应该跟数值计算有关?) |
@shouldsee 由于 0 1 是平凡根,所以要看 (0,1) 之间有几个根。看你举的那几个例子都是一个根的情况。 |
@Joe-C-Ding UPDATE: scipy好像慢在scipy.stats.weibull_min.cdf这里,可以考虑用julia替代(开源且overhead小)notebook |
@shouldsee matlab 因为没有名空间类似的技术,所以加载包和确定函数重载这块好像特别慢。导致一个函数第一次运行要比第二次运行慢很多。你跑 python 能比我这快小一半,matlab 反而比我慢一倍多除了有系统启动的时间以外可能还有这个原因。 我是在 python 和 matlab 里面跑的,python 计时也只计了 main 里那部分。不过优化的问题就复杂了,因为很多研究初期要计算的东西都不是那么确定的。原生就快还是有优势。 |
@shouldsee |
@shouldsee 你的程序要不要再检查下?看你后来的一个例子改 loc 会影响 G(p)。我觉得是不会吧,因为 loc 只是平移操作。X < xp 的概率和 X+5 < xp+5 的概率是一样的。所以也不改变 X+Y < xp+yp 的概率。 |
本来大早上准备睡个懒觉结果被无数封邮件拉了起来。。。 @Joe-C-Ding benchmark那个笔记里面测了内侧和外侧时间, matlab的速度还是fair的。 改loc为啥会影响G(p)我也是到现在没搞懂。 UPDATE:python里直接call了gammacdf的解析形式居然快了40倍。然而就目前的需求来说,主要问题还是搞出ppf的形式,不过估计也只能数值逼近了。 |
matlab 同样脚本第一次跑和第二次跑速度能提高至少一两倍。因为改动脚本再执行通常也不会改变执行速度了,所以我觉得不是解释器缓存了语法分析的原因。可能就是第一次加载函数慢的事。 用 matlab 算了同一个算例,你对对哪不一样。
用这个公式算的 Z 的 cdf。看你后来的几个算例,Z 的 cdf 都不趋于1,肯定不对吧…… start_tic = tic;
clf;
% p1 =spstat.gamma(loc=-2, a= 7)
% p2 =spstat.gamma(loc=0, a= 20)
func = @(z, t)gampdf(t,20,1) * gamcdf(z+2-t,7,1);
Fz = @(z)integral(@(t)func(z, t), -inf, inf, 'arrayvalued', 1);
disp([0:10:50; Fz(0:10:50)].');
% >>> z Fz
% 0 1.7961e-21
% 10 0.00013335
% 20 0.16758
% 30 0.83443
% 40 0.99445
% 50 0.99995
p = linspace(0, 1, 101).';
xp = gaminv(p,7,1)-2;
yp = gaminv(p,20,1);
Gp = Fz(xp+yp) - p;
plot(p, Gp);
i = ismembertol(p, 0:0.2:1, 1e-8);
disp([p(i), xp(i), yp(i), Gp(i)]);
% >>> p xp yp Gp
% 0 -2 0 0
% 0.2 2.7337 16.172 -0.086729
% 0.4 4.0392 18.567 -0.059228
% 0.6 5.3426 20.811 0.011386
% 0.8 7.0754 23.634 0.062772
% 1 Inf Inf -1.8874e-15
fprintf('%s elapsed: %f s\n', mfilename, toc(start_tic)); |
p1 =spstat.gamma(loc=-2, a= 7)
p2 =spstat.gamma(loc=0, a= 20)
main(p1,p2,cutoff=1E-8,num=200)
scdf = make_scdf(p1,p2,cutoff=1E-8)
Gp = lambda p: scdf(p1.ppf(p)+p2.ppf(p))-p
ps = np.arange(0,1.1,0.2)
arr = [ps,p1.ppf(ps),p2.ppf(ps),Gp(ps)]
arr = np.transpose(arr)
from pymisc.util import mat2str
print mat2str(arr,4)
'''
0.0 -2.0 0.0 0.0
0.2 2.7337 16.1725 -0.0869
0.4 4.0392 18.567 -0.0591
0.6 5.3426 20.8111 0.0111
0.8 7.0754 23.6343 0.0625
1.0 inf inf -0.0
''' 另外我手动关掉了pdf的error check大概快了5-10倍吧 |
clear all;
need_import = true;
if need_import
import_time = tic;
a = linspace(0,1);
b = gampdf(1,1,1);
c = gamcdf(2,2,2);
d = integral(@(x) x.^(1:10), 0, 1, 'arrayvalued', 1);
e = gaminv(0.5,3,3);
fprintf('import time: %f s\n', toc(import_time));
end
start_tic = tic;
% p1 =spstat.gamma(loc=-2, a= 7)
% p2 =spstat.gamma(loc=0, a= 20)
func = @(z, t)gampdf(t,20,1) * gamcdf(z+2-t,7,1);
Fz = @(z)integral(@(t)func(z, t), -inf, inf, 'arrayvalued', 1);
p = linspace(0, 1, 101).';
xp = gaminv(p,7,1)-2;
yp = gaminv(p,20,1);
Gp = Fz(xp+yp) - p;
% plot(p, Gp);
fprintf('%s elapsed: %f s\n', mfilename, toc(start_tic)); 结果
不管 if ... end 之间的语句执不执行花的总时间都差不多。但是如果把最开始的 clear all 去掉,再次执行还能更快。看来 matlab 除了缓存了函数以外,还有其它加速执行的方法。 你这手动关的技术高级了,我都不知道。scipy 我也不是太熟悉,就是哪些包基本能干什么了解个大概。 |
这叫为了生存激发的潜能xD。主要我实在实在不想重新用matlab...所以为了继续用python,总不能这么一直龟速下去...幸好python不负我 |
侧面也看出来python开源的好处就是碰上这种overhead还有调节的可能性,而matlab碰上一些封装的c就基本上完了个蛋 |
也不是,matlab 只有很小一部分代码是封装在 c 里的。一般会用到的都是 m 文件,有需要能自己改。 |
具体实现在notebook里写了,至于探索流程参见https://zhuanlan.zhihu.com/p/34800439 |
Matlab吧...查个源码翻个doc的速度,简直就是灾难大片。然后也没法架jupyter这种网页端,对我这种笔记本轻巧的来说根本无所适从…我们也就处理图像的课程会用matlab,其它大部分时间还是R/Python。综合来讲有三点:
不过幸好你对比了一下两者的性能,不然到时候一直在龟速跑都不知道囧。 |
嗯。matlab 作为通用编程语言还是有些烂,只用来做些数学方面一些数值验证还可以。 感觉有些条件是不是还是得查呀,比如 x 如果不在定义域里 pdf 得返回 0 吧。 |
你可以考虑一下如何进行快速的error-check。目前因为积分定义域是从ppf里生成的所以不会在定义域外部。 |
我用的那个公式就得看了:
只是简单的从 -inf 到 inf 积的。要用到如果出定义域自动变 0 的功能。 python 的 quad 好像不支持两端都是 inf 的情况,还是像你那样 cutoff 好一些。matlab 不能在脚本里定义函数确实是相当蛋疼的一个缺陷。用函数句柄的话,只能是一个语句。 |
python有np.inf,你可以用正态函数试试速度,之前是因为慢才用的cutoff。 理论上你可以somehow把积分域改成随机变量的值域的。 |
A somewhat related application of characteristic function and illustration of CLT can be found here |
CLT 不好用的原因是,当 n 不太大的时候(之前的研究相当于 n=2),CLT 做近似的误差太大。n 稍大时误差通常会很快减小。但像我研究的安全性领域,通常关心拖尾处的概率(比如 p > 0.95 或 p > 0.99),负方向的小误差有时也不能接受。 |
@Joe-C-Ding Cool... I was just fascinated by the fact that Cauchy distribution does not converge to Gaussian under CLT. Given the popularity of CLT and its connection to CF Anyway, it seems CF is a more natural choice since we are summing up random variable. If one can transform a CF back into CDF, it might be even possible to derive an analytical form of G(p). I think you meant G(p)>0 (p>=0.5 in general)? It makes sense to talk about the sample size N, I think the fact that CLT does not work at N=2 is reminiscent of the general finite-size phenomena... The discrete domain is very different from the continuous one, and indeed we need some different tools here. (Apologies for the English post for I am on my desktop and don't have Chinese input) |
CLT 背后的极限理论比较复杂(从17xx 年到 19xx 年研究了200多年),我研究极值分布的时候见有文献提过一些但我没再专门研究过。最经典的 CLT 一般要求独立同分布的,但其实不同分布甚至不太独立的随机变量加起来也可能收敛到正态上。CLT 成立的充要条件现在人们好像也有一些结论了,好像和每个变量的方差有比较大的关系,我没具体了解过。 理论上讲 CF 到 CDF 的反向变换积分一般不收敛,通常要用柯西主值(Cauchy principal value)。我可能分析学得也不深吧,一般的教材上对这种积分提的比较少(可能是因为更容易?)。所以能不能用来研究 G(P) 的其它性质我也没仔细想过。 你说样本数 N,不知道指什么。明确一下符号吧,记 CLT 是研究当 k->infinity 时和分布的极限,和 N 没关系的。离散分布和连续分布的区别的确是比较大,我也没有深入的研究。 |
我对CF到CDF的变换和柯西主值完全没有了解啊,能否举个例子看看? 我感觉平时用的CLT多是考虑N趋近无穷的,当然k和N的区别仅在于对称性,也即若变量在permutation下对称则k退化成N。但是即便要考虑k的话总要对变量的对称性作出稍弱的假设吧。 我还是想强调一下不是所有的CLT都收敛到高斯分布,个人感觉这是一个可能的切入点。 |
柯西主值是这样: 反向变换是这个(希望没写错哈): 我没太理解你说的 k 和 N 的关系。因为如果 cdf 知道了的话,就没 N 啥事了。只用研究 k 个分布和的问题。当然应用中,要样本 N 大一些才能表现出统计特征。但表现不出来的时候也不能说理论分布是不对的。 CLT 收敛到的分布类好像统称稳定分布 stable distribution。我知道有不止一个,只是没仔细研究过之间有什么关系,收敛到不同的类上的条件之类的。我看 wiki 上有些介绍,蛮复杂的样子。你要感兴趣可以看看,没准得再补充些其它资料才能看懂。 |
题面
概率论的题目,想了一天也没想出来
这是真命题么?我本来觉得伪的,不过没找到反例呢,现在觉得是真命题的可能性也不小。
背景
背景不太容易说清,但大概可以这么看。p > 0.5 这个条件就是说前面两个事件可以算的上是“大概率”事件。但一般意义上
这样的代数不等式相加,要两个条件同时成立才成立。所以只有
也就说,即使原来两个条件是“大概率”事件,结果小于的概率也要打不少折扣。而这个命题在表明其实这样的折扣是不存在的。
现有研究结论
X Y 如果都正态分布命题为真,且结论那里取不到等号。如果是均匀分布,正好取等号。
正态分布的
分位数的意思就是 Z < zp 的概率正好是 p。因为 zp < xp+yp,所以 Z < xp+yp 的概率要更大些。
均匀分布
均匀分布就是简单线性叠加,所以分位数不变,概率也还是 p,不细说了。
因为均匀分布的分散性其实最大,所以它取等号。如果是其它分布,我试的一些具体都取不到那个等号。命题里没有 X Y 的具体分布,也不要求同分布。感觉如果是真命题应该从方差那方面着手考虑证明。有人有证明的思路也可以说说看。
The text was updated successfully, but these errors were encountered: