水库采样算法
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())