一点奇怪的想法1

关于一个全面调查与抽样调查的问题

前言

起因是我突然想到了一个很久以前我看到的一个小故事(就是因为不想看论文了),故事如下:
一个捕蛇人在一个沼泽里捕蛇,他想知道这个沼泽一共有多少的蛇存在,于是先捉了20只,并且坐上了标记,然后放归大自然,过了几天之后,又去捉了20只,然后再将没有标记的做上标记,重复几次,然后便可以算出沼泽里存在的蛇的数量。
这个问题看上去简单,就是一个简单的样本和总体有相同分布,但是这个故事没有告诉我们沼泽里蛇数量与我们每次捉的关系,或者是我们要重复几次得到的答案和真实的数量最相近,同样的要是我们不知道这个沼泽里有多少蛇那么我们要如何捕捉才能更准确的找到答案。
(为什么不找论文去看看呢,说不定别人都研究过了,都说了不想看论文了)

原始问题

出示问题可以简单的看成总体和样本,沼泽中蛇被标记的数量和之后被捕捉蛇中被标记的数量应该有相同的分布,为了让描述统一,还是用沼泽里蛇的数量进行研究。
m a r k e d t t o t a l = m a r k e d b n \frac{marked_t}{total}=\frac{marked_b}{n} totalmarkedt=nmarkedb
其中:
m a r k e d t marked_t markedt:表示别标记过蛇的数量
t o t a l total total:表示沼泽里蛇的数量
m a r k e d b marked_b markedb:表示每次捕捉的蛇中之前被标记蛇的数量
n n n:表示每次捕捉蛇的数量

当然要对问题做一定的假设:

  1. 蛇在放归大自然之后会混入原来的种群之中,也就是被标记的蛇会均匀分布,不会有被标记的蛇被蛇群孤立而远离沼泽的情况发生。
  2. 蛇的种群数量不会变化。在统计期间蛇不会进行繁衍、冬眠、死亡或者被其他人捕捉做成蛇羹的事情发生。
  3. 没有其他人在这片沼泽和我们做同样的实验,并且用着同样的标记。
  4. 我们的标记不会消失。标记不会因为蛇在沼泽里洗澡、蜕皮、被其他人捕捉移除标记。
  5. 沼泽里的蛇不是保护动物,我们不会因为给蛇做标记被抓而完不成实验。
  6. 这个实验没有蛇受到伤害。(毕竟蛇年了,要对蛇蛇好一点)

代码如下:

clc;
clear;

iter = 10; % 重复次数
total = 200; % 蛇的综述 
n = 20; % 每次捕捉数量

a = zeros(1, total);% 初始化
capture = randperm(total, n); % 随便捕捉
a(capture) = 1; % 标记捕捉
marked = n; % 记录标记数量
X = zeros(iter, 1);
for i = 1 : iter
    capture = randperm(total, n);
    before = sum(a(capture)); % 之前捕捉过的数量
    if before ~= 0
        X(i) = round(marked * n / before);
        fprintf('第%2d次捕捉,估计有%.0f只\n', i, X(i))
    end
    marked = marked + 20 - before; % 记录总标记数
    a(capture) = 1; % 标记本次捕捉的
end

在这里我用 r a n d p e r m randperm randperm函数随机生成数字来模拟捕捉。在沼泽蛇总数为200,每次捕捉20只,经过10次捕捉条件下得到的两次结果:

1次捕捉,估计有133只
第 2次捕捉,估计有247只
第 3次捕捉,估计有216只
第 4次捕捉,估计有230只
第 5次捕捉,估计有277只
第 6次捕捉,估计有194只
第 7次捕捉,估计有165只
第 8次捕捉,估计有228只
第 9次捕捉,估计有177只
第10次捕捉,估计有217
1次捕捉,估计有400只
第 2次捕捉,估计有130只
第 3次捕捉,估计有265只
第 4次捕捉,估计有276只
第 5次捕捉,估计有153只
第 6次捕捉,估计有155只
第 7次捕捉,估计有289只
第 8次捕捉,估计有175只
第 9次捕捉,估计有186只
第10次捕捉,估计有171

结果非常的有趣啊,前几次的捕捉下,我们预估的数量和真实的的数量有着一定的距离,最小的误差也在5%以上。将程序重复执行25次,然后把每次运行的结果画出来:
请添加图片描述
可以看到,我们通过这种办法进行的估计波动很大,并不能解决我一开始提出的两个问题,也不是很适合得出一个较为准确的估计数量。
那么有没有办法让我们得出来的结果更准确一点。

改进方法

我第一个想到的是我们每次捕捉的数量是不是不够合理,在第一次捕捉之后,需要增加捕捉数量,在这里我然后本次捕捉数量都比上一次捕捉数量多10。

clc;
clear;

iter = 10; % 重复次数
total = 200; % 蛇的综述 
n = 20; % 第一次捕捉数量
n1 = 10; % 后续增加的捕捉数量

a = zeros(1, total);% 初始化
capture = randperm(total, n); % 随便捕捉
a(capture) = 1; % 标记捕捉
marked = n; % 记录标记数量
X = zeros(iter, 1);

for i = 1 : iter
    n = n + n1;
    capture = randperm(total, n);
    before = sum(a(capture)); % 之前捕捉过的数量
    if before ~= 0
        X(i) = round(marked * n / before);
        fprintf('第%d次捕捉,估计有%.0f只\n', i, X(i))
    end
    marked = marked + n - before; % 记录总标记数
    a(capture) = 1; % 标记本次捕捉的
end

同样在沼泽蛇总数为200,每次捕捉20只,经过10次捕捉条件下得到的两次结果:

1次捕捉,估计有200只
第2次捕捉,估计有171只
第3次捕捉,估计有211只
第4次捕捉,估计有223只
第5次捕捉,估计有199只
第6次捕捉,估计有203只
第7次捕捉,估计有207只
第8次捕捉,估计有209只
第9次捕捉,估计有201只
第10次捕捉,估计有200
1次捕捉,估计有600只
第2次捕捉,估计有163只
第3次捕捉,估计有214只
第4次捕捉,估计有177只
第5次捕捉,估计有210只
第6次捕捉,估计有194只
第7次捕捉,估计有200只
第8次捕捉,估计有195只
第9次捕捉,估计有197只
第10次捕捉,估计有201

经过一点小小的改动,这个结果就变得很好了,同样,程序重复执行25次,然后把每次运行的结果画出来:

在这里插入图片描述
肥肠的好啊,这个一看就是很好的收敛了。

插曲

其实我也想过别的改进方法,在别的算法里,像是PSO中,会有 g b e s t gbest gbest这个全局最优的作为引导,但是在这个问题里面,我们无法判断我们的出来结果的是不是更靠近真实结果,那我就思考,能不能通过之前的计算得到的结果对我们最新的估计做出改善,那么最简单的方案就是对我们全部的估计结果进行取平均值。在程序上的修改也很简单,只需要将输出的 X ( i ) X(i) X(i)改成 m e a n ( X ( 1 : i ) ) mean(X(1:i)) mean(X(1:i))就可以。

clc;
clear;

iter = 10; % 重复次数
total = 200; % 蛇的综述 
n = 20; % 每次捕捉数量

a = zeros(1, total);% 初始化
capture = randperm(total, n); % 随便捕捉
a(capture) = 1; % 标记捕捉
marked = n; % 记录标记数量
X = zeros(iter, 1);
for i = 1 : iter
    capture = randperm(total, n);
    before = sum(a(capture)); % 之前捕捉过的数量
    if before ~= 0
        X(i) = round(marked * n / before);
        fprintf('第%d次捕捉,估计有%.0f只\n', i, mean(X(1 : i)))
    end
    marked = marked + 20 - before; % 记录总标记数
    a(capture) = 1; % 标记本次捕捉的
end

同样选择两次结果如下:

2次捕捉,估计有80只
第3次捕捉,估计有145只
第4次捕捉,估计有180只
第5次捕捉,估计有182只
第6次捕捉,估计有179只
第7次捕捉,估计有180只
第8次捕捉,估计有178只
第9次捕捉,估计有179只
第10次捕捉,估计有179
1次捕捉,估计有100只
第2次捕捉,估计有102只
第3次捕捉,估计有114只
第4次捕捉,估计有189只
第5次捕捉,估计有196只
第6次捕捉,估计有198只
第7次捕捉,估计有202只
第8次捕捉,估计有199只
第9次捕捉,估计有210只
第10次捕捉,估计有212

在这里插入图片描述
很明显这个改善要求的捕捉次数更高,那么增加捕捉次数来再重新计算一下。

在这里插入图片描述

结果也十分的明了,所有的估计值求平均值有一定的帮助,估计值波动更小,但是捕捉次数大大增加,并且结果的准确性依旧不足,很容易陷入一个局部估计值。
(那如果对于之前的捕捉的估计我用加权是不是会更好点)

通过加权之后对结果加以改进
在这里插入图片描述
看得出来在加权之后对于这个的改进就又一个很明显的效果了, 但是同样的这个方法的捕捉次数更大。

奇怪了,一旦不看论文,效率感觉就高好多。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值