【算法专题】动态规划
01背包
完全背包
多重背包
分组背包
混合背包
对于物品而言只能选择1个或者0个两种情况
对于物品而言可以无限制选取,也可以不选
对于物品而言最多能够选择从s[i]个,同样也可不选
一些物品捆绑在一起,每一组物品中只能选择其中的一个物品
有些物品可以选择1,有些物品可以选择无数个,有些物品只能选择是s[i]个.即:01背包+完全背包+多重背包.
滚动数组
滚动数组
滚动数组
滚动数组
滚动数组
二进制优化或者单调队列优化
其中多重背包部分参考多重背包优化
0 - 1 背包问题
有 NN 件物品和一个容量是 VV 的背包。每件物品只能使用一次。
第 ii 件物品的体积是 v**ivi,价值是 w**iwi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
123456789101112131415161718192021222324252627282930313233343536373839/* 特点:每个物品仅能使用一次 f[i][j]:前i个物品,背包容量为j的情况下的最优解 1)当前背包容量 ...
【算法专题】位运算
位运算
位运算的基本操作
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091typedef struct Bitset { int setsize; // 16 32 ... int 是32位的 int arraysize; // 相当于有几行 unsigned short *v; // 之后会分配一片连续的空间}Bitset; //还非要大写才行 ..// SetInit(size) 集合大小Bitset SetInit(int size) { Bitset s; s.setsize = size; s.arraysize = (size + 15) >> 4; // 右移4位 除以16 //我之前好像智 ...
【算法专题】二叉树
二叉树
构建二叉树
123456789101112131415161718192021typedef struct BTNode{ int data; struct BTNode *left; struct BTNode *right;}BTNode;// 创建二叉树BTNode BinaryTree() { BTNode *T = (BTNode*)malloc(sizeof(BTNode)); T->data = 0; return T;}//BinaryEmpty(T):bool 判断树是否为空//Root(T):int 返回根结点data//构造二叉树BTNode MakeTree(int x, BTNode *l, BTNode *r) { BTNode *T = (BTNode*)malloc(sizeof(BTNode)); T->data = x; T->left = l; T->right = r; return T;}//BreakTree(x,T,l,r): ...
【机器学习】朴素贝叶斯算法原理
朴素贝叶斯法的学习与分类
先验概率
反映了我们在实际观察之前对某种状态的预期。绝大多数情况下,是根据过去的观测统计得到的数据计算可能性。且所有可能性概率之和为1。
例如,投掷硬币1000次,进行多个回合后的测试可发现,有1/2的概率丢到正面,1/2的概率成为反面。因此,可以说得到正面或得到反面的先验概率是 1/2 的。
正常情况下,可以基于先验做出决策。
例如,统计北京的天气情况可以发现,一年中近乎80%的时间天气是晴朗无雨的,那么在判断是否进行某种运动时,则可以根据此概率确定。
直接使用先验概率的局限很大。
它在不同的时间段内总是做出同样的预测,这是极其不适用的;例如,预测同一年龄段的老年人是否有高血压时,不能单靠先验概率进行直接判断,而是需要考虑到个人的家庭因素、作息等情况。
其次,它无法利用现有的信息进行决策。
最后,如果先验概率是均匀的,那么规则效果不佳。例如,在投掷硬币时,正反面的概率均为1/2,对下一次的投掷结果进行预测,就没有任何的优势,基本是靠猜测。
解决办法:引入特征。可以引入多个观测变量,形成一个特征空间,即进行观测值采样的空间。借助这些观测变量 ...
【机器学习】K近邻算法原理与实践
前言
KNN(K-k-nearest neighbors)又叫做K近邻,是机器学习中相对简单好理解的算法,并且它是唯一一个不需要训练就可以得到预测结果的模型。
我们常说物以类聚,人以群分,大家之所以能够成为朋友,多少是因为身上的某些特质是相近的,K近邻算法借助的就是这个思想。它使用某种方法找到样本空间中距离测试点最近的K个点,以投票表决的方式决定该测试点的标签。
本文将结合阿里云提供的机器学习算法(三): K近邻(k-nearest neighbors)初探与清华大学李航老师的PPT,来具体解释这其中的理论基础和代码实例。
KNN理论基础
背景介绍
大家通过视频软件挑选电影的时候,通常会先按照电影的类别进行挑选,例如动作片、爱情片、歌舞片。这些电影有各自的特点,像是动作片的打斗场景一定比爱情片多,它也不会像音乐片一样一言不合就开始跳舞,但又不能完全排除有出现的可能。
总结这三类型的影片所具有的显著特点:打斗、亲吻、跳舞。假设现在用一个元组(a, b, c)来表示,值在0~1之间,Movie = (0.8, 0.1, 0.1)时,就认为这个电影是动作片。那么很自然的,提出了使用一个 ...
【图像处理】图像轮廓
openCV中可以使用一些函数找到图像轮廓,进而获取目标图像的大小、位置、方向等信息。
下面将针对下图来做图像轮廓的说明:
查找图像轮廓findCounters
1contours, hierarchy = cv2.findContours( image, mode, method)
式中的返回值为:
contours:返回的轮廓。
hierarchy:图像的拓扑信息(轮廓层次)。
式中的参数为:
image:原始图像。8位单通道图像,所有非零值被处理为1,所有零值保持不变。也就是说灰度图像会被自动处理为二值图像。在实际操作时,可以根据需要,预先使用阈值处理等函数将待查找轮廓的图像处理为二值图像。
mode:轮廓检索模式。
method:轮廓的近似方法。
函数cv2.findContours()的返回值及参数的含义比较丰富,下面对上述返回值和参数逐一做出说明。
返回值contours
该返回值返回的是一组轮廓信息,类型为list,每个轮廓都是由若干个点所构成的。
coutours[i][j]表示的是第i个轮廓内的第j个点。
len(contours)的结果表示图中找到了 ...
【论文阅读】《StarGAN》
论文:《StarGAN: Unified Generative Adversarial Networks for Multi-Domain Image-to-Image Translation》
发表时间:CVPR 2018
解决问题:多领域的图像转换问题
背景
Pix2Pix与CycleGAN分别解决了两个领域之间基于匹配数据和非匹配数据的转换。但是在实际的应用中我们会发现需要大量的多领域转换,例如图1所示,这可能是一个智能修图的场景,用户输入一张人物照片,他希望能够通过选项来调节照片中人物的外貌,比如图中例子的发色、性别、年龄、肤色等。又比如图2,对于同一个人物照片我们希望能够将他转换成各种不一样的表情,从普通的表情转换为愤怒、喜悦和恐惧等。
之前的Pix2Pix和CycleGAN可以非常好地解决领域间转换问题,它们同样可以应用于多领域的转换,但是存在的问题是必须在每两个领域之间进行单独的训练。我们假设场景为图8-3的表情转换,一共有四个领域,分别为中性、生气、喜悦与恐惧,我们将它们从1到4标号。如果使用CycleGAN的话我们可以看到图3,在每两个领域都需要训练两个生成 ...
【论文阅读】《Pix2Pix》
论文:《Image-to-Image Translation with Conditional Adversarial Networks》
发表日期:2017 CVPR
前言
pix2pix是cGAN的一个变体,能够实现从图像到图像的映射,在从标签映射合成照片、从边缘映射重建对象、图片上色等多类人物的表现较好。它比较适合于监督学习,即图像的输入和它的输出是相互匹配的。所谓匹配数据集是指在训练集中两个互相转换的领域之间有明确的一一对应数据。在工程实践中研究者需要自己收集这些匹配数据,但有时同时采集两个不同领域的匹配数据是麻烦的,通常采用的方案是从更完整的数据中还原简单数据。比如直接将彩色图片通过图像处理的方法转为黑白图片。
训练完成后,pix2pix可以将图像从领域A变换到领域B。下面这张图中,左侧的input和output分别是同一个地方白天和夜晚的照片,看作是不同领域X和Y的两张图,生成器G应尽可能得将input转换成output。
注意,因为匹配数据集的存在,研究者尝试用普通CNN进行图像对图像的变换,但是不能生成清晰逼真的图像,因为CNN会试图让最终的输出接近所有相类似的 ...
【论文阅读】《DCGAN》
论文:《UNSUPERVISED REPRESENTATION LEARNING WITH DEEP CONVOLUTIONAL
GENERATIVE ADVERSARIAL NETWORKS》
发表日期:ICLR 2016
前言
这几年CNNs在计算机视觉应用的监督学习方面的应用广泛,而在非监督学习方向的应用就相对没有受到关注。因此,提出的这一深度卷积生成对抗网络(DCGANs)中使用了CNNs的内容,证明它也是可以进行非监督学习的。
通过各类的图像数据训练表明,DCGAN的生成器和鉴别器能够学习从物体部分到场景的表示层次。并且能把学到的特征用于新的任务中,以证明他们可以作为一般图像表征的适用性。
其次,GANs在训练时是不稳定的,经常导致生成器输出没有意义的图片。
架构设计规则
为了GAN能够很好得适应于卷积神经网络架构,DCGAN提出了四点架构设计规则:
使用卷积层替换池化层
去除全连接层
使用批归一化
使用恰当的激活函数
卷积层替换池化层
传统的CNN结构不仅包含卷积层,还包括了池化层。而在DCGAN结构中,采取把传统卷积网络中的池化层全部去除的操作,并使用卷积层 ...
【论文阅读】《cGAN》
论文:《Conditional Generative Adversarial Nets》
年份:2014年
引言
原始的GAN过于自由,训练会很容易失去方向,导致不稳定且效果差。比如说GAN生成MNIST数字的过程,虽然可以生成数字,但生成的结果是随机的(因为是根据输入的随机噪声生成的图片),没有办法控制模型生成的具体数字。
CGAN就是在原来的GAN模型中加入一些先验条件,使得GAN变得更加可控制。具体来说,我们可以在生成模型G和判别模型D中同时加入条件约束y来引导数据的生成过程。条件可以是任何补充的信息,如类标签等,这样我们在生成新的样本的同时,还能确切地控制新样本的类型。
cGAN结构
cGAN的全程是Conditional Generative Adversarial Networks,即条件对抗生成网络。它为生成器、判别器都额外加入了一个条件y,这个条件实际上是希望生成的标签。
生成器G必须要生成和条件y匹配的样本,判别器不仅要判别图像是否真实,还要判别图像和条件y是否匹配。cGAN的输入输出为:
生成器G:输入一个噪声z,一个条件y,输出符合该条件的图像G。
判别 ...