- 博客(193)
- 收藏
- 关注
原创 训练过程可视化
class Accumulator: #@save """在`n`个变量上累加。""" def __init__(self, n): self.data = [0.0] * n def add(self, *args): self.data = [a + float(b) for a, b in zip(self.data, args)] def reset(self): self.data = [0.0] * l...
2021-06-22 15:42:32 1448
原创 pytorch之trainer.zero_grad()
在下面的代码中,在每次l.backward()前都要trainer.zero_grad(),否则梯度会累加。num_epochs = 3for epoch in range(num_epochs): for X, y in data_iter: l = loss(net(X), y) trainer.zero_grad() l.backward() trainer.step() l = loss(net(features),
2021-06-22 08:55:47 2513
原创 pytorch之object.grad.zero_()
object.grad.zero_()的意思是清0object的梯度值。下面做个实验。x = torch.arange(4.0)x.requires_grad_(True)x.grad# 注意此时为None,不为0y = 2 * torch.dot(x, x)y.backward()x.grad# tensor([ 0., 4., 8., 12.])x.grad.zero_()x.grad# tensor([0., 0., 0., 0.])在默认情况下,PyTorch会.
2021-06-21 17:29:47 1918
原创 pytorch之with torch.no_grad
在使用pytorch时,并不是所有的操作都需要进行计算图的生成(计算过程的构建,以便梯度反向传播等操作)。而对于tensor的计算操作,默认是要进行计算图的构建的,在这种情况下,可以使用 with torch.no_grad():,强制之后的内容不进行计算图构建。下面针对是否使用torch.no_grad()做个实验。1. 不使用torch.no_grad()import torchx = torch.arange(4.0)x.requires_grad_(True)# 默认是要进行计算图的构
2021-06-21 17:09:21 399
原创 git与github使用
1 从github上clone到本地配置Git首先在本地创建ssh key;$ ssh-keygen -t rsa -C "your_email@youremail.com"后面的your_email@youremail.com改为你在github上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。成功的话会在~/下生成.ssh文件夹,进去,打开id_rsa.pub,复制里面的key。回到github上,进入 Account Settings(账户配置),左边选择SSH K
2021-04-12 10:08:25 118
原创 八、计数排序及其应用分析
1 本节思路之前的算法的最基本的思想是比较元素大小,所以算法复杂度最好是Θ(nlogn)\Theta(nlogn)Θ(nlogn),本节不再基于元素比较,而是基于计数的Counting sort,然后应用在Radix sort上。2 Counting sort2.1 算法思想Counting sort算法的思想比较简单,就是通过统计每个数字的的个数确定每个数字的位置,譬如【8,6,2】这三个数,通过计数统计知道#8=1,#6=1,#2=1,很自然就是2排正位置1上,6排在位置1+1=2上,8排在位置
2021-02-13 19:40:31 151 1
原创 七、基于比较的排序算法总结
1 问题至此,总结一下已经研究过的排序算法:insertion sort,Θ(n2)\Theta(n^2)Θ(n2)merge sort, Θ(nlogn)\Theta(nlogn)Θ(nlogn)quicksort, Θ(nlogn)\Theta(nlogn)Θ(nlogn)heapsort,Θ(nlogn)\Theta(nlogn)Θ(nlogn)从上面这个现象发现,这些算法的算法复杂度≥Θ(nlogn)\ge\Theta(nlogn)≥Θ(nlogn);从算法的细节上看,算法的
2021-02-01 21:35:36 274
原创 六、Analysis of quicksort
1 引言如题目所示,本节的精华在于用数学解决一个直觉上看似纷乱复杂的问题,里面有一些一般性的分析方法,如引入Indicator变量,从而把不确定问题引入到概率框架进行分析,一步一步把直觉上混乱的问题理清楚,数学之美也就是如此吧!如果有个算法在某些情况下表现的很差,在某些情况下又表现的不错,那么你还会放心的使用该算法吗?通过下面的分析后你会很放心使用快速排序算法。2 Quicksort2.1 算法描述2.2 手工演示指针iii指示的是≤pivot\leq pivot≤pivot的最后一个,作
2021-01-24 16:21:33 126
原创 五、分治法应用--矩阵乘法
1 朴素算法这个算法就是矩阵乘法的定义:很容易看出这个算法复杂度是Θ(n3)\Theta(n^3)Θ(n3)。2 递归算法分治法首先是从分割问题开始的,得到数学上的递归关系后,然后使用递归的方式实现。由上面的数学性质,可以使用递归实现:T(n)=8T(n/2)+Θ(n2)T(n)=8T(n/2)+\Theta(n^2)T(n)=8T(n/2)+Θ(n2),应用主定理可知,T(n)=Θ(n3)T(n)=\Theta(n^3)T(n)=Θ(n3),没有什么进步,不过这里分割思路是没有问题
2021-01-17 19:41:15 2303 1
原创 四、Dynamic-programming algorithm Dynamic--LCS
(学习笔记,无什参考价值!)1 问题2 算法2.1 Brute-force LCS algorithm检查每一个subsequence是否是yyy的子列时,遍历yyy的每一个元素,看是否依次可以全部覆盖subsequence所有元素,所以其复杂度为O(n)O(n)O(n);2.2 Dynamic-programming hallmark #1动态规划的第一特征–最优子结构,下面用定理的方式证明这种特征;这个性质是说,一个规模稍大的最优解问题建立在一些规模较小的最优解问题基础
2021-01-10 15:29:19 325
原创 中文分词--词典分词--最长匹配
(个人学习笔记,慎重参考)1 基本概念中文分词指的是将一段文本拆分为一系列单词的过程,这些单词顺序拼接后等于原文本。作为中文信息处理的第一站,是后续nlp任务的基础,中文分词算法大致可分为词典规则与统计学习,针对具体问题往往会以统计学习为主、词典规则为辅。2 正向最长匹配最长匹配算法就是在以某个下标为起点递增查词的过程中,优先输出更长的单词,这种规则被称为最长匹配算法。从前往后匹配则称为正向最长匹配,反之则称为逆向最长匹配。# -*- coding:utf-8 -*-from t
2021-01-05 22:30:37 1403
原创 深度学习与自然语言处理
(纯属为了记录自己学习的点滴过程,引用资料都附在参考列表)1 传统方法的局限1.1 传统方法的套路传统方法的处理流程简单来说就是:特征提取+传统机器学习模型训练;特征提取:使用了特征模板、TF-IDF、词袋向量等特征提取方法;常用的机器学习模型:HMM、perceptron、CRF、NBM、SVM;这些方法属于普遍规律,要解决具体的nlp问题还需要具体问题具体分析(特殊规律),nlp难就难在这个地方,你找不到稍微普适一点公式可以套用很多问题。就好比韩寒说过的一句话,懂得很多道理,但还是过不好
2021-01-04 22:18:10 878
原创 文本分类--情感分析
(纯属为了记录自己学习的点滴过程,引用资料都附在参考列表)1 基本概念情感分析对于情感分析而言,只需要准备标注了正负情感的大量文档,就能将其视作普通的文本分类任务来解决。此外,一些带有评分的电影、商品评论也可以作为“天然”的标注语料库。2 问题给出某酒店评论数据,正负评论各2000条组成,训练情感分类模型,并对测试数据预测;3 解决思路化归为文本分类问题,使用文本分类的一般步骤,算法使用Naive Bayesian Model;4 实现# -*- coding:utf-8 -*-fro
2021-01-03 21:45:56 1477
原创 文本分类--普通分类
1 基本概念文本分类文本分类(text classification),指的是将一个文档归类到一个或多个类别的自然语言处理任务。文本分类的应用场景非常广泛,包括垃圾邮件过滤、自动打标等任何需要自动归档文本的场合。文本分类在机器学习中属于监督学习,其流程是:人工标注文档类别、利用语料训练模型、利用模型训练文档的类别。2 问题3 解决思路3.1 文本的特征提取特征选择是特征工程中的重要一环,其主要目的是从所有特征中选出相关特征 (relevant feature),或者说在不引起重要信息丢失的前
2021-01-03 21:06:38 1590
原创 文本聚类
(纯属为了记录自己学习的点滴过程,引用资料都附在参考列表)1 基本概念聚类(cluster analysis )指的是将给定对象的集合划分为不同子集的过程,目标是使得每个子集内部的元素尽量相似,不同子集间的元素尽量不相似。注意,单词的颗粒度(分词、新词提取、关键词提取) < 短语的颗粒度(短语提取) < 句子的颗粒度(关键句提起) < 文章颗粒度(聚类),这些无监督任务一直体现着高内聚、低耦合的原则。2 问题对多个文档,在文档颗粒上进行聚类;3 解决思路3.1 基本思想
2021-01-03 15:33:43 1540 1
原创 信息抽取--关键句提取
(纯属为了记录自己学习的点滴过程,引用资料都附在参考列表)1 基本概念关键句提取在一些场合,关键词或关键短语依然显得碎片化,不足以表达完整的主题。这时通常提取中心句子作为文章的简短摘要。2 问题关键句提取;3 解决思路基本思想:由于一篇文章中几乎不可能出现相同的两个句子,所以朴素的 PageRank 在句子颗粒度上行不通。为了将 PageRank 利用到句子颗粒度上去,我们引人 BM25 算法衡量句子的相似度,改进链接的权重计算。这样窗口的中心句与相邻的句子间的链接变得有强有弱,相似的句子将
2021-01-03 13:06:19 2335 2
原创 信息抽取--短语提取
(纯属为了记录自己学习的点滴过程,引用资料都附在参考列表)1 基本概念短语提取在信息抽取领域,另一项重要的任务就是提取中文短语,也即固定多字词表达串的识别。短语提取经常用于搜索引擎的自动推荐,文档的简介生成等。其颗粒度介于单词和句子之间,nlp一系列任务的颗粒度排序如下:单词的颗粒度(分词、新词提取、关键词提取) < 短语的颗粒度(短语提取) < 句子的颗粒度(关键句提起) < 文章颗粒度(分类、聚类)2 问题短语的颗粒度(短语提取);3 解决思路利用互信息和左右信
2021-01-03 12:24:50 1098
原创 信息抽取--关键词提取
(纯属为了记录自己学习的点滴过程,引用资料都附在参考列表)1 基本概念2 问题3 解决思路4 实现5 参考文献6 需要解决的问题
2021-01-02 22:22:41 843
原创 信息抽取--新词提取
(纯属为了记录自己学习的点滴过程,引用资料都附在参考列表)1 基本概念什么是新词(是什么)新词是一个相对的概念,每个人的标准都不一样,所以我们这里定义: 词典之外的词语(OOV)称作新词。为什么要进行新词提取(为什么)新词的提取对中文分词而言具有重要的意义,因为语料库的标注成本很高。那么如何修订领域词典呢,此时,无监督的新词提取算法就体现了现实意义。怎么进行新词提取(怎么办)提取出大量文本(生语料)中的词语,无论新旧。用词典过滤掉已有的词语,于是得到新词。步骤 2 很容易,关键是步骤
2021-01-02 17:48:51 758
原创 词性标注
(纯属为了记录自己学习的点滴过程,99%都是复制别人的东西,引用资料都附在参考列表)1 基本概念什么是词性在语言学上,词性(Par-Of-Speech, Pos )指的是单词的语法分类,也称为词类。同一个类别的词语具有相似的语法性质,所有词性的集合称为词性标注集。不同的语料库采用了不同的词性标注集,一般都含有形容词、动词、名词等常见词性。下图就是HanLP输出的一个含有词性的结构化句子。词性的用处词性的作用是提供词语的抽象表示,词的数量是无穷的,但词性的数量是有限的。词性支撑着许多高级应用,当下游
2020-12-31 14:46:21 5668 1
原创 三、递归树分析法
1 问题2 解决思路使用递归树猜想一个上界,使用归纳法证明上界也是下界。2.1 使用递归树(recursion tree)猜想结论(不严谨)使用递归树两点:1⃣️逐行展开;2⃣️逐行相加;逐行展开本质上是分解问题,每个非叶子结点表示分解+合并问题所付出的代价,叶子结点表示解决边界问题所付出的代价。逐层求和这里要注意,除去非叶子结点,每一层的和呈现出等比数列性质,计算整个代价T(n)T(n)T(n)本质上就是分解(合并)问题付出的代价+解决递归边界付出的代价。Case1:分解问题的代价
2020-12-30 20:45:13 885
原创 二、Merge sort
1 问题2 算法2.1 伪代码 2.2 算法思想2.3 手工演示2.4 Python实现在这里插入代码片3 算法分析
2020-12-13 15:18:22 162 1
原创 一、Insertion sort
1. 问题2. 算法2.1 伪代码2.2 算法思想2.3 手工演示2.4 Python实现《算法导论》一书数组默认从111开始,这种方式适合算法分析,从000开始适合程序实现,为了能和伪代码一致便于对比,后边所有的Python实现中数组均从111开始。# -*- coding: utf-8 -*-import sysdef insertion_sort(A, n): for j in range(2, n+1): key = A[j] i
2020-12-13 13:04:25 110 2
原创 (一)卷积网络之基础要点
一、提出问题对于生活生产中的表格数据,至多也就上百维,而且表格数据的行与行之间没有序列和位置上的关系,所以用传统的机器学习算法就可轻松的解决这些问题。但是到了图片数据,传统机器学习就非常吃力了,一个普通的RGB图片,怎样向量化?传统机器学习的输入都是向量。如果强制把一个RGB图片拉成向量,会出现三个问题:向量纬度会非常大,模型的参数非常多;强制把RGB图片拉成向量,丢失了像素的位置关系,这对于图片数据来说是最大的问题;算法对于向量过于敏感,因为对于图片来说更多的是多个具有结构的像素才具有意义,不像
2020-11-26 21:36:15 116
原创 基于mxnet的Regression问题Kaggle比赛代码框架
一、概述书中3.16节扩展一下可以作为kaggle比赛的框架,这个赛题的名字是House Prices: Advanced Regression Techniques,是一个Regression问题。二、Deeplearning的一般流程结合李航《统计学习方法》中对机器学习流程的总结,分为data、model、strategy、algorithm、training、prediction1、 Data1.1、read data# read datatrain_data = pd.read_csv
2020-11-22 22:10:16 90
原创 面向对象方法使用gluon
一、面向过程与面向对象的优缺点面向过程使用mxnet,就是使用gluon封装好的对象,不加改动的表达机器学习的逻辑过程,其特点是方便、快捷,缺点是不够灵活(虽然可以应对90%以上的问题了),面向对象基于继承、多态的性质,对原有的gluon类进行了继承重写,并在不改变应用接口的情况下(基于多态),灵活的改写原有类,使之更加符合用户特殊需求。本文从自定义模型、自定义层、自定义初始化三个方面说明gluon的继承重写,这三个基本操作足够用户随心所欲的创造模型了。二、自定义模型1、定义静态模型静态模型就是实例
2020-11-22 12:28:32 181 1
原创 从0实现三层神经网络
本文目标分享李沐老师关于深度学习的观点:1⃣️从实践的角度入手深度学习可能比单纯的研究算法更好;2⃣️如果想学习深度学习,要只用简单的数据结构,譬如numpy、NDArray,从0实现一个深度学习算法,这样才能碰到进而解决深度学习中的许多核心问题,也可以更好的理解现在流行的框架;3⃣️从应用的角度,那就直接上现成的框架,结合真实数据不断练习,调得一手好参;结合李航《统计学习方法》中的观点,总结出机器学习(深度学习)的一般代码框架,具体看代码。机器学习的一般框架从0实现版# -*- coding
2020-11-08 16:57:49 106
原创 1025 反转链表 (25分)
输入样例:00100 6 400000 4 9999900100 1 1230968237 6 -133218 3 0000099999 5 6823712309 2 33218输出样例:00000 4 3321833218 3 1230912309 2 0010000100 1 9999999999 5 6823768237 6 -1解题心得:本题两个注意点,1⃣️不是所有结点都是在链表上;2⃣️反转后链表中每个结点的next仍指向反转后的下一个结点,一定要审题!第5.
2020-09-12 10:54:54 125
原创 1019 数字黑洞 (20分)
输入样例 1:6767输出样例 1:7766 - 6677 = 10899810 - 0189 = 96219621 - 1269 = 83528532 - 2358 = 6174输入样例 2:2222解体心得:在初次写str2list时没有考虑到输入是‘123’这样的情形;# -*- coding: utf-8 -*-import sysdef str2list(in_str): result = [c for c in in_str] result =.
2020-09-06 16:46:11 104
原创 1020 月饼 (25分)
输出样例 1:7766 - 6677 = 10899810 - 0189 = 96219621 - 1269 = 83528532 - 2358 = 6174输入样例 2:2222输出样例 2:2222 - 2222 = 0000解题心得:本题因为要排序,优先考虑使用二维数组和sorted最常用的模式;python在建立二维数组时有一个坑,就是[[]] * n中出现浅拷贝问题,操纵一个元素等于操作所有元素,正确建立二维数组的方式是 for i in range(n): .
2020-09-06 16:39:26 183
原创 1018 锤子剪刀布 (20分)
输入样例:10C JJ BC BB BB CC CC BJ BB CJ J输出样例:5 3 22 3 5B B本题有几个地方需要注意:当甲乙没有赢,怎么输出,正确答案是都输出B,这个在题目中找不出线索,有点坑;使用python超时,优化考虑的有三点,1⃣️使用sys.stdin作为输入,尤其是在大量输入数据时;2⃣️以空间换时间,使用一维或者多维list建立索引;3⃣️将执行代码放到函数中,至于为什么这样可以提高效率,主要基于cpython的机制问题,大概是因为局部变.
2020-09-06 09:59:45 157
原创 1017 A除以B (20分)
输入样例:123456789050987654321 7输出样例:17636684150141093474 3# -*- coding: utf-8 -*-import redef big_division(a, b): q_list, r = [], 0 len_a = len(a) for i in range(0, len_a): dividend = 10 * r + eval(a[i]) q_list.append(div.
2020-09-06 09:40:04 105
原创 1016 部分A+B (15分)
输入样例 1:3862767 6 13530293 3输出样例 1:399输入样例 2:3862767 1 13530293 8输出样例 2:0# -*- coding: utf-8 -*-if __name__ == '__main__': input_list = input().split() a, d_a, b, d_b = input_list[0], input_list[1], input_list[2], input_list[3] total.
2020-09-06 09:36:59 69
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人