基础算法之二分
12345678910111213141516171819202122232425bool check(int x) {/* ... */} // 检查x是否满足某种性质//两种整数二分方法// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:int bsearch_1(int l, int r){ while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid; // check()判断mid是否满足性质 else l = mid + 1; } return l;}// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:int bsearch_2(int l, int r){ while (l < r) { int mid = l + r + 1 >> 1; ...
Kullback-Leibler(KL)散度
1.概要
在这篇文章中,将探讨一种比较两个概率分布的方法,称为Kullback-Leibler散度(通常简称为KL散度)。通常在概率和统计中,我们会用更简单的近似分布来代替观察到的数据或复杂的分布。KL散度帮助我们衡量在选择近似值时损失了多少信息。
2.公式
KL散度起源于信息论。信息论的主要目标是量化数据中有多少信息。信息论中最重要的指标称为熵,通常表示为H。概率分布的熵的定义是:
$$
H=-\sum_{i=0}^nlogp(x_i)
$$
如果在我们的计算中我们使用log2,我们可以把熵解释为“我们编码信息所需要的最小比特数”。在这种情况下,根据我们的经验分布,信息将是每个牙齿计数的观察结果。根据我们观察到的数据,我们的概率分布的熵为3.12比特。比特的数目告诉我们,在单一情况下,我们平均需要多少比特来编码我们将观察到的牙齿数目。
熵没有告诉我们可以实现这种压缩的最佳编码方案。信息的最佳编码是一个非常有趣的主题,但对于理解KL散度而言不是必需的。熵的关键在于,只要知道所需位数的理论下限,我们就可以准确地量化数据中有多少信息。现在我们可以对此进行量化,当我们将观察到的分布替换为 ...
RNN数学推导
循环神经网络(RNN)是一种特殊类型的神经网络,它在输入之间保持一种状态,并使用该状态来处理序列数据。下面是RNN的数学推导。
假设我们有一个输入序列$x = (x_1, x_2, …, x_T)$,其中每个$x_t$都是一个向量,$y$是输出序列,$h_t$是RNN在处理$x_t$时的隐藏状态。RNN的隐藏状态$h_t$通过以下递归方式计算:
h_t = f(Ux_t + Wh_{t-1})其中,$U$和$W$是权重矩阵,$f$是激活函数,通常是tanh或ReLU。$h_0$通常被初始化为全零向量。
在计算完所有隐藏状态后,我们可以通过一个输出层来预测输出序列$y$,该输出层可以是全连接层,也可以是softmax层,具体取决于任务的要求。例如,在情感分类任务中,我们可能只需要一个全连接层来预测情感标签。
输出层的计算方式如下:
y_t = g(Vh_t)其中,$V$是权重矩阵,$g$是激活函数。在分类任务中,$g$通常是softmax函数。
现在我们可以通过反向传播算法来训练RNN,其中损失函数$L$定义为预测输出$y$与实际输出$\hat{y}$之间的交叉熵:
L = -\s ...
刷题
12345678910111213141516171819202122232425262728#include <iostream>using namespace std;int List[1005][1005];int w[1005];//价值int v[1005];//体积int main() { int N,V; cin>>N>>V; w[0]=v[0]=0; for(int i=1;i<N+1;i++){ cin>>v[i]>>w[i]; } for(int i=0;i<N+1;i++){ for (int j=0;j<V+1;j++){ if(i==0 or j==0){ List[i][j]=0; } else if(v[i]>j){ ...
基于大数据方法的豆瓣电影短评分类、预测与搜索(一)
综述
链接:https://pan.baidu.com/s/10DHtZbPnH2SsuaPaZcIuLQ提取码:tf9p
目前,大数据越来越多的和人工智能关联起来。而人工智能发展迅猛,在多个领域取得了巨大的成就,比如自然语言处理,图像处理,数据挖掘等。而本文正是诞生在如此环境下。首先本文基于Scrapy框架爬取豆瓣短评数据并进行清洗,然后通过hadoop+spark+mongodb完全分布式部署框架来进行数据的分类与采集,最终我们得到了比例为8:1:1的训练集、测试集和验证集。并在此基础上,我们调用了TextCNN、TextRCNN、TextRNN_Att、FastText、Transformer五大文本分类模型训练豆瓣Top250的短评,最后训练出五个可以通过短评来判断电影种类的模型,我们分别计算这五个模型的各个参数,最终选择一个较好的模型——TextRCNN模型来作为我们的后端模型。我们使用Fastapi来进行前后端分离的web应用。同时,我们在此基础上,为了能够让使用者能够仔细观察一个电影的具体情况,找到自己喜欢的电影,我们建立了基于余弦相似度的搜索模型,达到 ...
基于大数据方法的豆瓣电影短评分类、预测与搜索(二):框架介绍
Scrapy框架
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说法不够专业,更专业的描述就是,抓取特定网站网页的HTML数据。抓取网页的一般方法是,定义一个入口页面,然后一般一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然后进入到新页面后再递归的进行上述的操作,其实说来就跟深度遍历或广度遍历一样。
Scrapy 使用 Twisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。
Hadoop
背景
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统( Distributed File System),其中一个组件是HDFS(Hadoop Distributed File System)。HD ...
基于大数据方法的豆瓣电影短评分类、预测与搜索(三):模型介绍
Scrapy框架
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说法不够专业,更专业的描述就是,抓取特定网站网页的HTML数据。抓取网页的一般方法是,定义一个入口页面,然后一般一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然后进入到新页面后再递归的进行上述的操作,其实说来就跟深度遍历或广度遍历一样。
Scrapy 使用 Twisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。
Hadoop
背景
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统( Distributed File System),其中一个组件是HDFS(Hadoop Distributed File System)。HD ...
基于大数据方法的豆瓣电影短评分类、预测与搜索(四):了解NLP的卷积神经网络
了解NLP的卷积神经网络
当我们听到卷积神经网络(CNN)时,我们通常会想到计算机视觉。CNN负责图像分类的重大突破,并且是当今大多数计算机视觉系统的核心,从Facebook的自动照片标记到自动驾驶汽车。
最近,我们也开始将CNN应用于自然语言处理中的问题,并得到了一些有趣的结果。在这篇文章中,我将尝试总结CNN是什么,以及它们如何在NLP中使用。对于计算机视觉用例来说,CNN背后的直觉更容易理解,所以我将从那里开始,然后慢慢转向NLP。
什么是卷积?
对我来说,理解卷积的最简单方法是将其视为应用于矩阵的滑动窗口函数。这很拗口,但看可视化就很清楚了:
带 3×3 滤波器的卷积,来源:http://deeplearning.stanford.edu/tutorial/supervised/FeatureExtractionUsingConvolution/
想象一下,左边的矩阵表示一个黑白图像。每个条目对应一个像素,0 表示黑色,1 表示白色(灰度图像通常在 0 到 255 之间)。滑动窗口称为内核、过滤器或特征检测器。在这里,我们使用 3×3 过滤器,将其值逐个乘以原始矩 ...
基于大数据方法的豆瓣电影短评分类、预测与搜索(五):基于余弦相似的搜索算法
基于余弦相似的搜索算法
给一个例子:
基于大数据方法的豆瓣电影短评分类、预测与搜索(五):Transformer模型
Transformer是一个利用注意力机制来提高模型训练速度的模型。关于注意力机制可以参看这篇文章,trasnformer可以说是完全基于自注意力机制的一个深度学习模型,因为它适用于并行化计算,和它本身模型的复杂程度导致它在精度和性能上都要高于之前流行的RNN循环神经网络。
那什么是transformer呢?
你可以简单理解为它是一个黑盒子,当我们在做文本翻译任务是,我输入进去一个中文,经过这个黑盒子之后,输出来翻译过后的英文。
那么在这个黑盒子里面都有什么呢?
里面主要有两部分组成:Encoder 和 Decoder
当我输入一个文本的时候,该文本数据会先经过一个叫Encoders的模块,对该文本进行编码,然后将编码后的数据再传入一个叫Decoders的模块进行解码,解码后就得到了翻译后的文本,对应的我们称Encoders为编码器,Decoders为解码器。
那么编码器和解码器里边又都是些什么呢?
细心的同学可能已经发现了,上图中的Decoders后边加了个s,那就代表有多个编码器了呗,没错,这个编码模块里边,有很多小的编码器,一般情况下,Encoders里边有6个小编码器,同样 ...