算法

YOLOV3算法详解——设计思想以及候选区域选择

雨燕双飞 提交于 2020-01-23 05:44:56
本篇博文是笔者结合百度paddle公开课的一个AI识虫项目对YOLOV3算法做的一个解析 完整项目可参考https://aistudio.baidu.com/aistudio/projectdetail/250211 什么是目标检测? 相信有一定基础的深度学习开发者经常能听到目标检测这个词,那什么任务是目标检测呢。 简单地来说目标检测就是 让计算机识别出图片里面对应的物体,并标上边界框 对于分类任务,我只需要识别这种图片是不是动物的图片即可 而对于目标检测任务,我并不是对 整张图片 做一个分类,而是对图片里的部分区域做一个分类,并绘制一个目标框标记物体 目标检测算法发展历程 既然图片分类是对整张图片进行分类,我们能不能从原图里“抠”下不同区域的图片进行分类呢? 答案当然是可以的,而这也是最初目标检测算法的思路 我们将目标检测任务进行拆分成两个任务,分别是 产生候选区域 , 对候选区域进行分类 。而这也引入了算法的区别,我们常听到的一阶段目标检测算法,就是用一个网络同时产生候选区域并进行预测。而二阶段目标检测算法,则是分别进行候选区域产生和分类任务。 最初产生的候选区域方法比较“笨”,更准确地来说应该称其为 穷举法 ,也就是将图片中每个像素都遍历一遍,再遍历其右下方的像素。两个像素就能确定一个区域,穷举法的好处就是思想简单,产生的候选区域都遍布整张图片,但它带来的计算量实在是过于庞大

机器学习——社区发现算法

ε祈祈猫儿з 提交于 2020-01-23 04:24:12
机器学习——社区发现算法 一、什么是社区? 二、社区发现算法的应用场景 三、社区发现算法 一、什么是社区? 答:同一社区内的节点与节点之间的连接很紧密,而社区与社区之间的连接比较稀疏。 设图 G = G ( V , E ) G= G(V,E) G = G ( V , E ) ,所谓社区发现是指在图G中确定nc( ≥ 1 \geq 1 ≥ 1 )个社区: C = { C 1 , C 2 , . . . , C n c } (1) C= \{C_{1},C_{2},...,C_{nc}\}\tag{1} C = { C 1 ​ , C 2 ​ , . . . , C n c ​ } ( 1 ) 使得各社区的顶点集合构成V的一个覆盖。 若任意两个社区的顶点集合的交集均为空,则称C为非重叠社区,否则称为重叠社区。 如下图所示,不同颜色的属于不同的社区,中间的部分属于多个社区 二、社区发现算法的应用场景 在社交网络中社区圈子的识别(Community Detection) 基于好友关系为用户推荐商品或内容 社交网络中人物影响力的计算 信息在社交网络上的传播模型 虚假信息和机器人账号的识别、 就与社交网络信息对股市、大选的预测 互联网金融行业中的反欺诈预测 三、社区发现算法 在说社区发现算法之前,有必要说图的结构。 给出一些定义: 一个具体的网络可以抽象为一个由节点集合V

【读书笔记】理解基本排序算法

故事扮演 提交于 2020-01-23 03:40:15
开始日期:2018/07/23 前言 近段时间一直在阅读《数据结构与算法JavaScript描述》这本书,重新学习下算法。算法是作为一个程序员的基本素养,还是掌握一些基本的算法的,譬如排序算法。排序算法又分为基本排序算法和高级排序算法,以排序的效率来划分。以下的冒泡排序就是基本排序算法,最慢的排序算法之一。 冒泡排序 最慢的排序算法之一,数据值会像气泡一样从数组的一端飘向另一端。之所以会产生这种现象是因为算法会多次在数组中移动,比较相邻的数据,假设按升序排序,则当左侧值大于右侧值时将它们进行互换。 示例代码: function bubbleSort(arr){ var length = arr.length; // 数组交换方法 var swap = function(arr,index1,index2){ var temp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = temp; } // 外循环则表示相邻比较的次数,比较一次后,最大的数会移向最右侧,则次数减一,进行下一轮循环 for(var outer = length; outer >= 2; --outer){ // 内循环则表示从第一个数值开始相邻比较,一直到最后一个 for(var inner = 0; inner< outer; inner){ if

页面置换算法-LRU,FIFO,LFU---golang实现

こ雲淡風輕ζ 提交于 2020-01-23 01:50:45
页面置换算法 页面置换算法 前提的数据结构 go语言实现双向链表数据结构 FIFOCache FIFOCache实现代码 测试数据和测试代码 测试结果 什么是LRU Cache 数据结构 代码实现 LFUCache 实现代码 测试代码和测试结果 页面置换算法 什么是Cache?狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。 广义上的Cache指的是位于速度相差较大的两种硬件之间, 用于协调两者数据传输速度差异的结构。除了CPU与主存之间有Cache, 内存与硬盘之间也有Cache,乃至在硬盘与网络之间也有某种意义上的Cache── 称为Internet临时文件夹或网络内容缓存等。 前提的数据结构 不管是在fifo,lru,lfu的cache中,其底层数据结构 都是双向链表加hashmap实现的 go语言实现双向链表数据结构 package DoubleLinked import ( "fmt" "strings" ) type Node struct { key interface { } value interface { } prev , next * Node } // 实现打印方法 func ( this Node ) String ( ) string { builder :=

spfa算法

丶灬走出姿态 提交于 2020-01-23 00:07:37
spfa算法是对bellman-ford算法的优化,bellman-ford算法遍历每一条边,不断的迭代更新。但是注意到,有许多边的值是不变的,也就是说不需要更新,所以spfa算法基于这一点进行优化,只有值变小的点才有机会去更新其他点。所以我们用一个队列来存储可以更新其他点的点。 1 1.初始化 2 while 队列不空 3 { 4 2.取队头; 5 3.标记不在队列中 6 4.更新其他点 7 } 1.初始化需要初始化dis数组为正无穷,将第一个点dis置为0,将第一个点加入队列,并标记在队列中。 2.当队列不空时取队头元素,并将其标记置为不在队列中。 3.需要注意的是spfa中的st数组是标记该点是否在队列中,与dijkstra算法中的st数组作用不同,dijkstra算法中的st数组是在出队时标记已经用过,所以只会标记一次。而spfa数组的元素是可以多次入队的。 4.由于spfa算法是bellman-ford算法的优化,所以spfa算法是可以处理带负权边的单源最短路算法,而dijkstra是只能处理正权边的单源最短路算法。 完整代码: 1 #include <cstring> 2 #include <iostream> 3 #include <algorithm> 4 #include <queue> 5 6 using namespace std; 7 8 const int

数据采样与处理算法

心已入冬 提交于 2020-01-22 23:48:24
数据采样与处理算法 这里特别说明,输入量是作为周期函数的算法 均方根算法(参考馈线终端单元的设计与实现—郭阳春) 均方根将所采集的离散型的采样点值计算得出电压电流的幅值,主要用于设备的测量功能,该算法不区分系统中的谐波干扰分量,得到是整体的有效值。 算法可以采用多个周期计算一次,在一周期计算一次的情况下,将采样点的采样值先进行平方计算,然后讲一个周期的N点采样值的平方顺序相加,然后将所得的N点采样值的平方和除以N再开放,就可以得到电气量的有效值。 傅立叶算法 傅立叶算法主要是用于将采集到的离散型采样值,转换成为与电压、电流正弦信号对应的矢量值,经过傅立叶变换得到矢量值的实部和虚部。通过对实部和虚部的计算得到电压电流的幅值和初相角。 算法本能能够分离各次谐波的功能,可以从一个复杂的波形中分离出直流量、基波和各次谐波,不仅可以得到精度较高的基波用于继电保护的判断,也可以较为精确的计算出各次谐波的量。 傅立叶算法又可以分为全波傅式算法、半波傅式算法、快速傅立叶算法等; 2.1全波傅式算法 全波傅式算法的基本思想源于傅立叶基数,假设被采样的模拟量信号是一个周期性的时间函数,可以是正弦函数也可以是包含各次谐波分量的非正弦函数,根据傅式级数的概念可以将此周期函数分解为恒定的直流分量和高次谐波分量。可以表示为: 其中n为谐波次数,和分别为各次谐波的余弦项和正弦项的振幅

[算法]最长子数组问题

强颜欢笑 提交于 2020-01-22 23:46:10
一、未排序正数数组中累加和为给定值的最长子数组长度 题目: 给定一个数组arr,该数组无序,但每个数都是正数,再给定一个正数K。求arr的所有子数组中所有元素相加和为K的最长子数组长度。 例如: arr=[1,2,1,1,1],K=3, 累加和为3的最长子数组为[1,1,1],return 3。 程序: public static int getMaxLength(int[] arr, int k) { if (arr == null || arr.length == 0 || k <= 0) { return 0; } int left = 0; int right = 0; int sum = arr[0]; int len = 0; while (right < arr.length) { if (sum == k) { len = Math.max(len, right - left + 1); sum -= arr[left++]; } else if (sum < k) { right++; if (right == arr.length) { break; } sum += arr[right]; } else { sum -= arr[left++]; } } return len; } 二、未排序数组中累加和为给定值的最长子数组长度 题目一:

类欧几里得算法

不想你离开。 提交于 2020-01-22 21:24:23
求 \(\sum_{x=0}^{n-1}\lfloor \frac{ax+b}{c} \rfloor\) 设 \(f(a,b,c,n)=\sum\limits_{x=0}^{n-1}\lfloor \frac{ax+b}{c} \rfloor\) 进行化简,得 \[ \begin{aligned} &f(a,b,c,n) \\ =&\sum_{x=0}^{n-1}\lfloor \frac{ax+b}{c} \rfloor \\ =&\sum_{x=0}^{n-1}\lfloor \frac{(a \bmod c)x + (a - a \bmod c)x+(b \bmod c)+(b - b \bmod c)}{c} \rfloor \\ =&\sum_{x=0}^{n-1}\lfloor \frac{(a \bmod c)x + (b \bmod c)}{c} \rfloor + \frac{(a - a \bmod c)x}{c} + \frac{b - b \bmod c}{c}\\ =&\sum_{x=0}^{n-1}\lfloor \frac{(a \bmod c)x + (b \bmod c)}{c} \rfloor + \lfloor \frac{a}{c} \rfloor x + \lfloor \frac{b}{c} \rfloor\\ =&\frac{n(n-1

半监督学习

无人久伴 提交于 2020-01-22 21:11:26
概述 监督学习指的是训练样本包含标记信息的学习任务,例如:常见的分类与回归算法; 无监督学习则是训练样本不包含标记信息的学习任务,例如:聚类算法。 在实际生活中,常常会出现一部分样本有标记和较多样本无标记的情形,例如:做网页推荐时需要让用户标记出感兴趣的网页,但是少有用户愿意花时间来提供标记。若直接丢弃掉无标记样本集,使用传统的监督学习方法,常常会由于训练样本的不充足,使得其刻画总体分布的能力减弱,从而影响了学习器泛化性能。那如何利用未标记的样本数据呢? 以下参考博客:https://blog.csdn.net/u011826404/article/details/74358913 未标记样本 1.基本假设 (原文:https://blog.csdn.net/hellowuxia/article/details/66473252 ) 要利用未标记样本,必然要做一些将未标记样本所揭示的数据分布信息与类别标记相联系的假设。 1)平滑假设(Smoothness Assumption):位于稠密数据区域的两个距离很近的样例的类标签相似,也就是说,当两个样例被稠密数据区域中的边连接时,它们在很大的概率下有相同的类标签;相反地,当两个样例被稀疏数据区域分开时,它们的类标签趋于不同。 2) 聚类假设 (Cluster Assumption):当两个样例位于同一聚类簇时