大数据机器学习算法与计算机视觉应用03:数据流

Data Stream

  • Streaming Model
  • Example Streaming Questions
  • Heavy Hitters
  • Algorithm 1: For Majority element
  • Misra Gries Algorithm
  • Applications
  • Approximation of count

Streaming Model 数据流模型

数据流就是所有的数据先后到达,而不是同时存储在内存之中。在现实中,数据流或者本身占用空间很大,或者数量很多,保存所有的数据流数据是不可能的。

因此,在数据流相关问题中,我们一般比较关注空间复杂度,也就是节省内存的做法。

本节课提到的数据流模型简单地用数字流来代表数据流,也就是说数据流中地每一个元素都是一个数。

Example Streaming Questions 经典数据流问题

我们假设每个数据需要 b b b 位来存储,总共预计接收到 t t t 个数据

1.维护接收到的所有数据的总和需要的位数

答案是 O ( b + log ⁡ t ) O(b + \log t) O(b+logt)

为什么是这个答案呢?
一个数是 b b b 位, t t t 个数就是 b + log ⁡ t b+\log t b+logt位。这个和十进制里面,十个一位数相加的结果一定是一个 1 + log ⁡ 10 = 2 1 + \log 10 =2 1+log10=2位数来表达一样。这就是这里为什么是元素个数取对数。
2. 维护收到的所有数据的最大值需要的位数

很明显答案是 O ( b ) O(b) O(b)

3.维护收到的所有数据的中位数需要的位数

这个问题似乎有点困难。因为中位数涉及到对于所有数据进行排序。但是也不是完全没办法,请参见下文算法。

Heavy Hitters 频繁项

给定项数 n n n 和权重 ϵ \epsilon ϵ ,请你找到数据流中所有出现次数大于 ϵ n \epsilon n ϵn 的项。这就是数据流中的频繁项问题。我们如何在使用内存尽可能小的情况下解决这个问题呢?

Algorithm 1: For Majority element 主元算法

如果一个数据流中有一个数据的出现频率超过了0.5,那么这个数据就被叫做主元。我们可以先看看如何确定主元的算法,以便我们推广到频繁项。

可行的一个算法如下:
在内存中声明一个数k和一个计数器c.
初始化时,让k为空,让c为0.
每当数据 a i a_i ai 到达时,循环执行如下操作:
如果 c = 0 c=0 c=0 ,那么 a i → k a_i \rarr k aik, 1 → c 1 \rarr c 1c
如果 c ≠ 0 c\neq 0 c=0 a i ≠ k a_i \neq k ai=k,那么 c − − c-- c
如果 c ≠ 0 c\neq0 c=0 a i = k a_i = k ai=k ,那么 c + + c++ c++
循环执行该操作,执行完毕时的数k就可能是主元。

写成代码的形式如下:

    datatype a,k;int c=0;cin >> a;while(a){if(c==0){k=a;c=1;}else if (c>0 && a!=k){c--;}else {c++;}}

注意,这个算法得到的结果不一定是主元,但是这个数是最可能是主元的那一个。
下面我们证明:如果数据流有主元 a m a i n a_{main} amain,那么主元一定是 k k k

每次读入 a m a i n a_{main} amain时,要么 k ≠ a m a i n , c − − k \neq a_{main}, c-- k=amain,c ,要么 k = a m a i n , c + + k = a_{main}, c++ k=amain,c++ ;因为是主元,所以必定存在某个时刻使得 k = a m a i n k = a_{main} k=amain,且因为 c++ 的次数大于 c-- 的次数,因此读入所有数据之后一定满足 k = a m a i n k = a_{main} k=amain

这个算法的主要思路是,由于我们寻找主元,而一个数据流中主元最多就一个,因此我们只需要记录那个可能出现次数过半的就可以了。如果有主元,那么这个数据
一定会被记录下来。但是我们不知道记录下来的是否一定是主元。即这是一个充分不必要条件:
有主元 ⇒ k 是主元 有主元 \rArr k是主元 有主元k是主元

Misra Gries Algorithm MG算法

MG算法是上面算法的一个拓展,用于计算 ϵ \epsilon ϵ 频繁项。如果主元使用一个数来记录,那么最多可以有几个 ϵ \epsilon ϵ 频繁项开一个对应大小的数组就可以了。答案是 ⌈ ( 1 ϵ ) ⌉ − 1 \lceil(\frac{1}{\epsilon})\rceil -1 ⌈(ϵ1)⌉1.为什么是这个数呢? ϵ \epsilon ϵ 带入一下 2 5 \frac{2}{5} 52 1 2 \frac{1}{2} 21 就知道了。

我们声明一个数组 T [ k ] T[k] T[k] 负责存储数据,数组 C [ k ] C[k] C[k]负责存储计数器,算法大同小异。其伪代码形式如下:

    datatype a,T[k];int C[k]={0};while(cin >> a){if(C[j]==0){T[j]=a;C[j]=1;}else if (C[j]!=0 && a!=T[j]){all C[j]--;}else if(a==T[j]){C[j]++;}}

Heavy Hitters Guarantee

为什么MG算法可以保证找出所有的频繁项呢?证明方法也是和上面的算法一样。

我们在此证明:
0 ≤ c o u n t t ( e ) − e s t t ( e ) ≤ n k + 1 ≤ ϵ ⋅ n 0 \leq count_t(e) - est_t(e) \leq \frac{n}{k} +1 \leq \epsilon\cdot n 0countt(e)estt(e)kn+1ϵn
其中 c o u n t t ( e ) count_t(e) countt(e)是某个元素 e e e实际出现的次数, e s t t ( e ) est_t(e) estt(e)是指该元素的计数器次数。

等式的左边不难证明,因为我们要在实际接收到一个相同元素之后才会把计数器+1,因此实际次数-计数器次数一定大于0

等式的右边是因为每次所有计数器-1的操作都至少需要k次单个计数器+1的操作,因此减少所有计数器的操作最多只有 n k + 1 \frac{n}{k+1} k+1n 次。

那么对于频繁项, c o u n t t ( e ) > ϵ ⋅ n count_t(e) > \epsilon \cdot n countt(e)>ϵn,而又有 c o u n t t ( e ) − e s t t ( e ) ≤ ϵ ⋅ n count_t(e) - est_t(e) \leq \epsilon\cdot n countt(e)estt(e)ϵn,因此 e s t t ( e ) > 0 est_t(e) >0 estt(e)>0,也就是所有的频繁项一定会在列表之中。注意,所有的频繁项一定在列表之中不代表列表中的所有项都是频繁项。

Space Complexity 空间复杂度

MG算法的空间复杂度就是两个数组的空间复杂度:
O ( k ( log ⁡ ∣ Σ ∣ + log ⁡ n ) ) b i t s O(k(\log |\Sigma| +\log n))bits O(k(log∣Σ∣+logn))bits
两个数组的长度都是 k k k,数据数组每个元素需要 log ⁡ ∣ Σ ∣ \log |\Sigma| log∣Σ∣位来存储(表示数据的范围),计数器数组每隔元素需要 log ⁡ n \log n logn位来存储(表示从0到n)。

Applications

  1. Internet router may want to figure out which IP connections are heavy hitters, e.g., the ones that use more than 0.01% of your bandwidth.(寻找网络中哪些IP地址是常被访问的)

  2. Or the median of the file sizes being transferred.(文件大小的中位数)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/60184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式学习第21天Linux基础

目录 第1章 Linux 系统介绍 1.1 Unix 操作系统(了解) 1.2 Linux 操作系统(了解) 1.3 Linux 操作系统的主要特性(重点) 1.4 Linux 与 Unix 的区别与联系 1.5 GUN 与 GPL(了解) …

【小程序安全】小程序反编译

❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 0x01 前期准备 知识点准备-小程序结构 1.主体结构 小程序包含一个描述整体程序的 app 和多个描述各自页…

C++ : STL容器(适配器)之stack、queue剖析

STL容器适配器之stack、queue剖析 一、stack、queue的接口(一)stack 接口说明(二)queue 接口说明 二、stack、queue的模拟实现(一)stack、queue是容器适配器stack、queue底层默认容器--deque1、deque概念及…

Kubernetes的基本构建块和最小可调度单元pod-0

文章目录 一,什么是pod1.1pod在k8s中使用方法(1)使用方法一(2)使用方法二 1.2pod中容器的进程1.3pod的网络隔离管理(1)pause容器的作用 1.4 Pod分类:(1)自主式…

【CUDA】认识CUDA

目录 一、CUDA编程 二、第一个CUDA程序 三、CUDA关键字 四、device管理 4.1 初始化 4.2 Runtime API查询GPU信息 4.3 决定最佳GPU CUDA C 编程指南CUDA C在线文档:CUDA C 编程指南 CUDA是并行计算的平台和类C编程模型,能很容易的实现并行算法。只…

知识中台如何在精简供应链管理中发挥作用?

您如何与供应商沟通并分享您的最佳实践?您如何确保供应商了解您的基准?如果您正在为这些问题烦恼,请不要担心,本文章将为您提供宝贵的见解。 构建具备弹性的供应链模型,其关键在于知识中台的数据质量。若缺乏数据支撑…

Python 在PDF中绘制形状(线条、矩形、椭圆形等)

在PDF中绘制图形可以增强文档的视觉效果。通过添加不同类型的形状,如实线、虚线、矩形、圆形等,可以使文档更加生动有趣,提高读者的阅读兴趣。这对于制作报告、演示文稿或是教材特别有用。本文将通过以下几个示例介绍如何使用Python 在PDF中绘…

Gitlab-执行器为Kubetnetes时的注意事项,解决DNS解析问题

一、Gitlab-Runner 这里对于Runner的理解非常重要。 具体执行ci流水线的叫执行器。执行器可以部署是shell、docker、k8s的pod.执行完任务则生命周期结束。 管理执行器的叫Gitlab-Runner。Runner则是与Gitlab Server的Ci agent.(可以简单这么理解) 二、执行器为Kubetnetes时,DN…

大数据新视界 -- 大数据大厂之 Impala 性能优化:新技术融合的无限可能(下)(12/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

讨论一个mysql事务问题

最近在阅读一篇关于隔离级别的文章,文章中提到了一种场景,我们下面来分析一下。 文章目录 1、实验环境2、两个实验的语句执行顺序3、关于start transaction和start transaction with consistent snapshot4、实验结果解释4.1、实验14.2、实验24.3、调整实…

json绘制热力图

首先需要一段热力信息的json,我放在头部了。 然后就是需要de-geo库了。 实现代码如下: import * as d3geo from d3-geoimport trafficJSON from ../assets/json/traffic.jsonlet geoFun;// 地理投影函数// let info {max: Number.MIN_SAFE_INTEGER,mi…

K8S之Prometheus 部署(二十)

部署方式:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/prometheus 源码目录:kubernetes/cluster/addons/prometheus 服务发现:https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kube…

kafka中节点如何服役和退役

服役新节点 1)新节点准备 (1)关闭 bigdata03,进行一个快照,并右键执行克隆操作。 (2)开启 bigdata04,并修改 IP 地址。 vi /etc/sysconfig/network-scripts/ifcfg-ens33修改完记…

【Three.js基础学习】21.Realistic rendering

前言 课程回顾 渲染器 1.色调映射 值意在将高动态范围](HDR)值转换为低动态范围(LDR) Three.is中的色调映射实际上会伪造将LDR转换为HDR的过程,即使颜色不是HDR, 结果会产生非常逼真的渲染效果 THREE .NoToneMapping (default) 无色调映射 THREE.Linear…

ORB_SLAM3安装

ORB_SLAM3安装 一.前期准备1.1ubuntu查看当前版本的命令1.2 根据ubuntu版本,更新下载软件源1.3 先下载git1.4 vim语法高亮1.5 常见的linux命令 二.ORB-SLAM3下载2.1 ORB_SLAM3源码下载2.2 安装依赖库2.2.1 依赖库2.2.2 安装pangolin2.2.3 安装opencv2.2.4 Eigen3安装…

无需云端!国产开源大语言模型llama.cpp本地实战

作者:高瑞冬 注: 文章是2023年底写的。代码和运行方式虽有些旧,但基本原理一样。现在出来ollama,vllm等工具框架用来本地部署大模型,顺便更新一下。 [TOC](最后有彩蛋) 背景 上海人工智能实验室与商汤科技…

横向思维导图前端样式

追溯记录图路上 代码如下 index.vue <template><div style"margin-left: 5%;margin-top: 6%"> <el-form style"margin-top: -5%; " :inline"true"><el-form-item label"药品名称"><el-select v-model&qu…

清华大学提出Mini-Omni2:开源多模态模型,功能与GPT-4o媲美!

&#x1f310; 在人工智能领域&#xff0c;多模态模型的发展正如火如荼。今天&#xff0c;我们要介绍的是由清华大学提出的Mini-Omni2&#xff0c;这是一个开源的多模态语言模型&#xff0c;它在功能上与GPT-4o相媲美&#xff0c;能够理解和生成视觉、听觉和文本内容&#xff0…

HarmonyOS入门 : 获取网络数据,并渲染到界面上

1. 环境搭建 开发HarmonyOS需要安装DevEco Studio&#xff0c;下载地址 : https://developer.huawei.com/consumer/cn/deveco-studio/ 2. 如何入门 入门HarmonyOS我们可以从一个实际的小例子入手&#xff0c;比如获取网络数据&#xff0c;并将其渲染到界面上。 本文就是基于…

msvcr100.dll丢失怎么解决?高效靠谱的六种解决方法分享

在我们使用电脑的时候&#xff0c;有一种叫动态链接库&#xff08;DLL&#xff09;的文件特别重要。比如&#xff0c;msvcr100.dll是Microsoft Visual C 2010 Redistributable包里的一部分&#xff0c;很多应用程序在运行的时候都需要用到它。但是&#xff0c;有些用户在使用的…