水库采样算法 大数据实验二

水库采样算法

1:以stream.txt文件为自己所写程序的输入,读取文件中数据,设为e1,e2,…,en,……(假设每秒到达一个数据);

2:设定样本集合大小为s(该参数为程序输入参数),要求在任意t大于等于s的时刻维持一个采样集合S,要求对于已经看到过的元素e1,e2,…,et中的每个元素都以相同的概率被选进集合S。

3:计算采样集合在所有数据读取完毕后的均值,计算过程如下:

假设S={f1,f2,…,fs},那么均值等于(f1+f2+…fs)/s;

4:精确计算整个数据流中元素的均值,计算过程为如下:

假设数据流delta = e1,e2,…,e10000(比如stream.txt共有10000个元素,实际上stream.txt的元素个数不是10000,这里只是举例),那么均值等于(e1+e2+…e10000)/10000;

设样本集合s=100

import random

if __name__ == "__main__":
    l = (int)(input("请输入样本集合大小l:"))
    # T = (int)(input("请输入时间大小T:"))
    numset=[0]*l
    datanum = 0
    t = 0
    f = open('stream.txt')
    while t < l:
        num = f.readline()
        if num == '':
            break
        num = int(num.strip())
        numset[t] = num
        datanum += num
        t += 1
    while True:
        num = f.readline()
        if num == '':
            break
        num = int(num.strip())
        datanum += num
        i= random.randint(0,t)
        if i < l :
            numset[i] = num
        t += 1
        # if T == t:
        #     sum = 0
        #     for j in range(l):
        #         sum += numset[j]
        #     print("在 %d 时刻 样本集估计平均值为 %f"%(T , sum/l))
        #     print("在 %d 时刻 精确平均值为 %f" % (T , datanum / t))
    sum=0
    for i in range(l):
        sum +=numset[i]
    print("最后 样本集估计平均值为 %f"%(sum/l))
    print("最后 精确平均值为 %f" % (datanum/t))
    print("误差值:", abs(((sum/l) - (datanum/t)) / (datanum/t)))

最后 样本集估计平均值为 2159.590000
最后 精确平均值为 2437.026959
误差值: 0.11384238419270724

设样本集合s=1000

import random

if __name__ == "__main__":
    l = (int)(input("请输入样本集合大小l:"))
    # T = (int)(input("请输入时间大小T:"))
    numset=[0]*l
    datanum = 0
    t = 0
    f = open('stream.txt')
    while t < l:
        num = f.readline()
        if num == '':
            break
        num = int(num.strip())
        numset[t] = num
        datanum += num
        t += 1
    while True:
        num = f.readline()
        if num == '':
            break
        num = int(num.strip())
        datanum += num
        i= random.randint(0,t)
        if i < l :
            numset[i] = num
        t += 1
        # if T == t:
        #     sum = 0
        #     for j in range(l):
        #         sum += numset[j]
        #     print("在 %d 时刻 样本集估计平均值为 %f"%(T , sum/l))
        #     print("在 %d 时刻 精确平均值为 %f" % (T , datanum / t))
    sum=0
    for i in range(l):
        sum +=numset[i]
    print("最后 样本集估计平均值为 %f"%(sum/l))
    print("最后 精确平均值为 %f" % (datanum/t))
    print("误差值:", abs(((sum/l) - (datanum/t)) / (datanum/t)))

最后 样本集估计平均值为 2429.564700
最后 精确平均值为 2437.026959
误差值: 0.003062033996471439

设样本集合s=10000

import random

if __name__ == "__main__":
    l = (int)(input("请输入样本集合大小l:"))
    # T = (int)(input("请输入时间大小T:"))
    numset=[0]*l
    datanum = 0
    t = 0
    f = open('stream.txt')
    while t < l:
        num = f.readline()
        if num == '':
            break
        num = int(num.strip())
        numset[t] = num
        datanum += num
        t += 1
    while True:
        num = f.readline()
        if num == '':
            break
        num = int(num.strip())
        datanum += num
        i= random.randint(0,t)
        if i < l :
            numset[i] = num
        t += 1
        # if T == t:
        #     sum = 0
        #     for j in range(l):
        #         sum += numset[j]
        #     print("在 %d 时刻 样本集估计平均值为 %f"%(T , sum/l))
        #     print("在 %d 时刻 精确平均值为 %f" % (T , datanum / t))
    sum=0
    for i in range(l):
        sum +=numset[i]
    print("最后 样本集估计平均值为 %f"%(sum/l))
    print("最后 精确平均值为 %f" % (datanum/t))
    print("误差值:", abs(((sum/l) - (datanum/t)) / (datanum/t)))

最后 样本集估计平均值为 2421.877600
最后 精确平均值为 2437.026959
误差值: 0.006216328195125965
def Count_accurate():
    data_flu = set()
    with open("stream_for_fm.txt",'r') as f:
        while ture:
            temp = f.readline()
            if temp ='':
                break
            temp=int(temp.strip())
            data_flu.add(temp)
    return len(data_flu)
       
print(Count_accurate())
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值