楼主: harlon1976
1962 11

[问答] 平稳自举的程序的疑惑 [推广有奖]

  • 2关注
  • 27粉丝

版主

院士

49%

还不是VIP/贵宾

-

威望
1
论坛币
37257 个
通用积分
100.0959
学术水平
25 点
热心指数
39 点
信用等级
17 点
经验
58976 点
帖子
1898
精华
0
在线时间
4214 小时
注册时间
2005-8-27
最后登录
2024-5-14

500论坛币
各位坛友,以下是我找到的关于平稳自举的程序:
% Define the probability of a new block
p=1/w;
% Set up the bsdata and indices
indices=zeros(t,B);
% Initial positions
indices(1,:)=ceil(t*rand(1,B));
% Set up the random numbers
select=rand(t,B)<p;
indices(select)=ceil(rand(1,sum(sum(select)))*t);
for i=2:t
    % Determine whether we stay (rand>p) or move to a new starting value
    % (rand<p)
    indices(i,~select(i,:))=indices(i-1,~select(i,:))+1;
end
indices(indices>t) = indices(indices>t)-t;
% The indices make finding the bsdata simple
bsdata=data(indices);

其中红色的那句我不知道是什么意思,不知道有没有把这个程序逐句解释一下,谢谢了!

最佳答案

andrew3335 查看完整内容

表明一下我的小私心吧,我还惦记着悬赏的500个论坛币呢。论坛上有很多我想要的学习资料,苦于没有论坛币下载。 如果还有什么难题的话尽管问,如果我的回答满意的话也希望你能履行你的承诺。
关键词:Probability positions Starting bability position 程序 starting whether

本帖被以下文库推荐

沙发
andrew3335 发表于 2012-9-24 17:55:06 |只看作者 |坛友微信交流群
harlon1976 发表于 2012-9-26 11:32
说的也有道理,但后面的那个循环体中的含义我还是没有弄懂,还需要仔细想想!
表明一下我的小私心吧,我还惦记着悬赏的500个论坛币呢。论坛上有很多我想要的学习资料,苦于没有论坛币下载。
如果还有什么难题的话尽管问,如果我的回答满意的话也希望你能履行你的承诺。

使用道具

藤椅
harlon1976 发表于 2012-9-24 19:50:40 |只看作者 |坛友微信交流群
请高手指点一下

使用道具

板凳
andrew3335 发表于 2012-9-25 16:14:49 |只看作者 |坛友微信交流群
% Define the probability of a new block
p=1/w;    只是个数值
% Set up the bsdata and indices
indices=zeros(t,B);   生成一个t*B全是0的矩阵
% Initial positions
indices(1,:)=ceil(t*rand(1,B));    把生成的随机数列向量的值向上取整,赋予indices矩阵的第一列的值
% Set up the random numbers
select=rand(t,B)<p;        select是一个值为0或者1的t*B的矩阵。select(a,b)的值为1说明rand(a,b)的值小于p
indices(select)=ceil(rand(1,sum(sum(select)))*t);  indices(select)是一个列向量,维度为select里面1个个数。说通俗点就是把select里面是1的位置在indices里找到同样位置的数据,再按他们在indices里列的顺序把他们排成一列。如果看不明白的话试试这个例子就明白了,a=rand(3,4); b=a<0.6;a(b)。然后给这一列赋值。
等号右边的两个sum函数可以求得select里1的个数。生成的随机数列*t再向上取整,赋予上面的indices(select)。
for i=2:t
    % Determine whether we stay (rand>p) or move to a new starting value
    % (rand<p)
    indices(i,~select(i,:))=indices(i-1,~select(i,:))+1;
end
indices(indices>t) = indices(indices>t)-t;
% The indices make finding the bsdata simple
bsdata=data(indices);

后面的我还不懂,如果你想知道的话,我再帮你研究研究。如果OK的话,我也省点事了

使用道具

报纸
harlon1976 发表于 2012-9-25 16:50:34 |只看作者 |坛友微信交流群
andrew3335 发表于 2012-9-25 16:14
% Define the probability of a new block
p=1/w;    只是个数值
% Set up the bsdata and indices
感谢你啊,这么久就你一个人给予解释,你前面的那些内容我也看懂了,红色的那块我要好好看看你的解释,后面循环体中 的内容,如果你有空的话再帮我看看,不知道你对SAS是否熟悉,如果熟悉的话,能在SAS中实现这个要求就好了,再次叩谢!

使用道具

地板
andrew3335 发表于 2012-9-25 17:08:39 |只看作者 |坛友微信交流群
红字部分自己试几个数据就明白了。

现在下班了,明天可以其余的答复行吗?

sas从来没用过

使用道具

7
harlon1976 发表于 2012-9-25 17:20:19 |只看作者 |坛友微信交流群
andrew3335 发表于 2012-9-25 17:08
红字部分自己试几个数据就明白了。

现在下班了,明天可以其余的答复行吗?
可以的,我有的明白了,谢谢啊,请多赐教!

使用道具

8
andrew3335 发表于 2012-9-26 09:38:11 |只看作者 |坛友微信交流群
不好意思,昨天我有些地方弄错了。自己也是新手,多多见谅。当我昨天的话没说,一切以下面的说明为准。

indices(1,:)=ceil(t*rand(1,B));      是给indices的第一行赋值
% Set up the random numbers
select=rand(t,B)<p;                   select是一个值为0或者1的t*B的矩阵。select(a,b)的值为1说明rand(a,b)的值小于p。
indices(select)=ceil(rand(1,sum(sum(select)))*t);    试试看我能不能把这句话说清楚。本质上这句话的作用是给indices矩阵(开始时除了第一行,其他的都是0)里某些位置的数据附上一个随机值。赋值数据的数量等同于select矩阵里1的个数,位置是select矩阵里1的位置。

接下来的循环给indices里其余的赋值
for i=2:t
    % Determine whether we stay (rand>p) or move to a new starting value
    % (rand<p)
    indices(i,~select(i,:))=indices(i-1,~select(i,:))+1;       ~select(i,:)的作用是把 i 行里的0,和1的位置对换。比如说对换以后,i 行左起第3,4,6和7的值是1。那么这句语句的作用就是把indices矩阵 i 行上3,4,6和7上的数据的值变成i-1行上3,4,6和7的值+1,其余位置的数据不变。
end
indices(indices>t) = indices(indices>t)-t;   当indices所有的行都赋值好了以后,把里面所有大于t的数值减去t
% The indices make finding the bsdata simple
bsdata=data(indices);       矩阵运算还不是很熟悉,这句话看不懂。

使用道具

9
harlon1976 发表于 2012-9-26 10:50:07 |只看作者 |坛友微信交流群
andrew3335 发表于 2012-9-26 09:38
不好意思,昨天我有些地方弄错了。自己也是新手,多多见谅。当我昨天的话没说,一切以下面的说明为准。

...
indices(select)=ceil(rand(1,sum(sum(select)))*t);    试试看我能不能把这句话说清楚。本质上这句话的作用是给indices矩阵(开始时除了第一行,其他的都是0)里某些位置的数据附上一个随机值。赋值数据的数量等同于select矩阵里1的个数,位置是select矩阵里1的位置。

这个操作也有可能把indices的第一行的值也会替换掉,但第一行的值已经i由ndices(1,:)=ceil(t*rand(1,B));     指定了,应该是不允许这个替换掉的,如果这样就不能满足平稳抽取的要求了。

使用道具

10
andrew3335 发表于 2012-9-26 11:25:41 |只看作者 |坛友微信交流群
就按照程序来看,第一行的某些数据确实会被替换掉。但它原来的值就是随机值,新的值是相同范围的随机值。在我看来,和没换没什么区别

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-15 05:42