自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(74)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 Pytorch:gather函数

1.功能利用index来索引input特定dim上的数值2.函数gather(input, dim, index)其中input是我们要索引的tensor,dim是要索引的维度,比如input为一个3*4的tensor,指定dim=1,说明需要索引的维度为1index是在这个维度上的索引值,除了dim维要为1以外,其他各维度需要和input保持一致3.举例input_tensor = torch.tensor([[1,0,0,0],[2,3,0,2],[3,4,5,3]])

2021-01-20 16:49:20 195

原创 模型集成:简述blending和stacking的操作

1.引言假设我们有好几个模型的结果,如何把他们全部利用起来呢?最简单的方法就是大家一起投票,一人一票,票高者得胜。但是这时候问题来了,在这些模型中,有的模型效果比较好,有的模型效果比较差,如果好模型数量相对差模型比较少,那么投票结果也就不那么合理了。(就好比一个专家和一堆小学生去投票一个专业问答知识)于是,有人提出了对模型结果的加权投票,但是这又面临了一个问题,那就是这个权重需要手动调整,有时人为的决定权重可能并不准确,所以有人进一步提出了让模型学习这个加权过程。2.Blendi

2020-12-16 21:25:48 394

原创 Pytorch及其环境踩坑记录+极简安装

今天跑模型的时候发现模型,损失及参数在调用.to(torch.device('cuda'))后,在反向计算梯度时内核会直接卡死,发现是cuda版本过旧,于是进行一系列的踩坑,总结经验如下:0,注意这里都是基于python3.71,不必分别安装cuda和pytorch,这样及其容易造成版本不匹配问题,我们直接使用anaconda的虚拟环境即可。2.通过虚拟环境打开terminal3.调用pytorch官网给出的指令,在虚拟环境中安装环境依赖4.这样直接就可以安装好pytorch以及

2020-11-01 19:48:10 344

原创 图的宽度优先遍历与深度优先遍历

1.图的宽度优先搜索代码非常容易实现,如果你会二叉树的层序遍历,那么图的宽度优先搜索就是在层序遍历的基础之上,引入visited集合,每当入队时,首先考虑入队结点是否处于visited集合中,如果在,说明曾经入队,就跳过。我们先看一下二叉树的层序遍历class Solution: def levelOrder(self, root: TreeNode) -> List[List[int]]: if not root: return []

2020-10-06 19:52:09 1405

原创 前缀树(字典树)

前缀树可以用来解决诸如搜索提示,字符串查询等问题,实现一个前缀树首先需要定义一个前缀树结点,结点不代表字符串中的字符,每个结点的值通常有end(表示是否是某个字符串结尾),past(表示有多少单词经过此结点),next_node(是一个字典,其中key代表此结点相连的字符,value代表这条字符所代表的边连接的结点)。定义前缀树类时,首先要初始化一个前缀树结点,然后定义常用的方法,如插入,删除,搜索和startwith,其基本搜索过程类似,以插入举例,首先定义一个变量node指向root,然后循环遍历字

2020-10-06 18:34:17 179

原创 并查集

并查集可以用来解决集合从属关系,很容易的可以获取如连通分量的个数,其基本实现主要由三部分构成,即:①find函数,用于寻找某一个节点的集合代表节点。②union函数,用于将两个集合合并,简易并查集直接将二者合并,而优化后的并查集要求小集合并到大集合中。③connected函数,用于判断两个节点是否从属于一个集合,在union中也会调用此函数如例题:class UnionFind: father = {} size = {} cnt = 0 def

2020-10-06 12:15:03 97

原创 TopK问题

TopK问题有两种常见的解决方式,一种是利用堆,一种是利用快速排序的partition过程。一,堆import heapqclass Finder: def findKth(self, a, n, K): b = list(map(lambda x:-x, a)) heapq.heapify(b) for _ in range(K-1): heapq.heappop(b) return -heapq

2020-10-05 18:16:38 96

原创 partition与荷兰国旗问题

partition问题:partition问题是快速排序重要的一环,其仅要求将小于等于部分移动到pivot左边,大于的部分移动到pivot右边,基本思想是:设置小于等于区域,然后从low遍历到high,当遍历的值小于等于pivot,则将小于等于区域增1,然后和遍历值交换。def partition(nums, low, high): i = low - 1 pivot = nums[high] for j in ran

2020-10-05 15:54:42 200 1

原创 断金条-贪心算法

一块金条切成两半,是需要花费和长度数值一样的铜板的。比如 长度为20的 金条,不管切成长度多大的两半,都要花费20个铜 板。一群人想整分整块金 条,怎么分最省铜板? 例如,给定数组{10,20,30},代表一共三个人,整块金条长度为 10+20+30=60. 金条要分成10,20,30三个部分。 如果, 先把长 度60的金条分成10和50,花费60 再把长度50的金条分成20和30, 花费50 一共花费110铜板。 但是如果, 先把长度60的金条分成30和30,花费60 再把长度30 金条分成10和20,花

2020-10-05 13:22:29 151

原创 随时确定中位数

思路:设置一个大根堆和一个小根堆,大根堆力求存储N/2部分的小值,小根堆力求存储N/2部分的大值,保持此状态后,哪个堆的值多则中位数就是哪个堆的堆顶元素。如何保持均衡分布?每次进入的值和大根堆的堆顶元素比较,当其值大于大根堆时,进入小根堆,当两者的值相差大于等于2时,多的一个堆出堆顶元素赋值给小的堆。、整个过程对于python可以使用heapq简易实现。...

2020-10-05 11:40:01 104

原创 相交链表

思路:对于确定无环的两个链表,有两种思路,一种是让ha和hb不断向下走当走到空时从头继续走直到两者相等返回ha另一种是分别遍历两条链表,让长的一条先走,然后同步走。class Solution: def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: ha, hb = headA, headB while(ha != hb): ..

2020-10-04 20:33:35 166 1

原创 返回环形链表的入环结点

套路:快慢指针,当两指针相遇时,快指针回到头结点,两个指针继续同步移动一步,直到第二次相遇即为所求。class Solution: def detectCycle(self, head: ListNode) -> ListNode: if not head or not head.next: return fast = slow = head while fast and fast.next: ..

2020-10-04 20:02:29 135

原创 之字打印矩阵

基本思路,两个指针都从矩阵左上角出发,一个沿着右上半边移动,一个沿着左下半边移动(碰到边界转向),这样两个指针就压着一条对角线,从而我们只需要打印这个对角线元素,并在每次打印对角线后更新从上到下的标记。class Solution: def findDiagonalOrder(self, matrix: List[List[int]]) -> List[int]: if not matrix: return [] Row1, C..

2020-10-04 13:45:48 117

原创 螺旋打印矩阵

思路:使用Col1和Row1变量记录左上角坐标,使用Col2和Row2变量记录右下角坐标,两个角固定了这个矩阵,设置初始值CurR=0,CurC=0,从左上角开始,然后分四部分打印一圈:当CurC<Col2时,打印并CurC++当CurR<Row2时,打印并CurR++当CurC>Col1时,打印并CurC--当CurR>Row1时,打印并CurR--注意打印时考虑特例一行或一列的情况在大循环中,每次打完一圈以后,左上坐标向右下角移动一格,右下坐标..

2020-10-03 22:23:16 331

原创 栈与队列常见面试问题

问题一:使用数组实现栈和队列实现栈的方法:设置索引index用于表示插入时向哪个下标位置插入,初始时index指向0位置,入栈:当index = len(stack)时报栈满错误,否则stack[index++] = obj出栈:当index = 0时报栈空错误,否则index -= 1peek操作:当index = 0 时返回Null,否则返回stack[index - 1]实现队列的方法:设置索引start表示出队时从哪个下标出队,索引end表示从哪个下标入队,设

2020-10-03 22:13:31 653

原创 堆排序,归并排序和快速排序

一,堆排序,可以用来解决优先队列,topk等问题class Solution: def sortArray(self, nums: List[int]) -> List[int]: def heapsort(nums): len_nums = len(nums) # 建堆过程,也可以理解为向上调整的过程 for i in range(len_nums//2-1, -1, -1):

2020-10-03 12:59:04 326

原创 单调队列及典型例题

一,单调队列和单调栈类似,队列中的元素保持单调递增或递减,可以用以解决区间最小值的问题。二,例题class Solution: def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: queue = [] # 单调队列 res = [] # 结果 for i,num in enumerate(nums): if queue and

2020-10-02 22:44:54 374 1

原创 手推SVM

一,线性可分SVM二,线性SVM这里的loss实际上就是hinge loss,图像如下当z>1时,损失为0,当z<1时,损失为1-z,其中z=Yi(WXi+b)三,lagrange可行证明四,强对偶性证明五,KKT条件...

2020-10-01 11:00:08 111

原创 logistic regression逻辑回归推导

一,逻辑回归的由来逻辑回归是由几率的概念构建线性回归模型,目的是将负无穷到正无穷的线性回归,映射到(0,1)之间。那么什么是几率?几率是事件发生的概率除以未发生的概率,设P为事件发生概率,则1-P为事件未发生概率,我们有:注意odds的范围在[0,正无穷)我们将odds取log,可以将其取值范围扩展到实数空间[负无穷,正无穷]:即当odds趋向于0时,取log后的结果可以整体上趋于负无穷,这就是logit函数。这样,由于logit函数和线性回归模型在同一取值范围,这样我们

2020-09-29 14:10:53 162

原创 LSTM+CRF

1.为什么不直接使用LSTM?关于标注任务,我们自然而然的可以想到,使用RNN序列模型,在每一时刻输出对应的隐状态Ht,然后进行每一时刻的逐帧softmax。为什么不行呢?主要原因在于,RNN模型(比如LSTM)没有考虑到输出类标之间的关联性,比如NER任务中,一些输出的类标之间是有顺序性的,而RNN虽然利用隐变量Ht学到了X之间的顺序关系,但是没有考虑到输出序列的顺序性。于是,我们将二者结合起来,使用RNN序列模型提取X之间的转移关系,使用CRF层来处理输出序列的顺序。2.CRF原理在CR

2020-09-28 23:09:03 1004

原创 HMM隐马尔可夫模型和维特比算法

文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言隐马尔可夫模型是关于时序的概率图模型,属于生成模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程。隐马尔可夫模型常用来处理诸如分词,词性标注,命名实体识别(NER)等问题序列标注问题。一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使..

2020-09-26 20:44:09 754

原创 BERT,ELMO,GPT

1.BERTbert全称bidirectional encoder representation from transformer,是使用无监督方式利用大量无标注文本形成的语言模型,其架构为tranformer中的encoder。bert虽然利用了transformer的encoder部分,但是其在部分中还是略有不同。1.embeddingbert的embedding由三种embedding求和而成:token embedding是词向量,也就对应了transformer中的词嵌入部

2020-09-25 15:43:19 508

原创 Transformer理解

1.Transformer示意图transformer宏观上由左边的六层endocer和右边的六层encoder构成,这些block各不分享权重,在左侧的encoder部分,前一时刻的encoder输出作为下一时刻encoder的输入,直到最后时刻的encoder的输出向量会传递给decoder的每一个block(block中的encoder-decoder attention模块)作为其输入的一部分。下图所示的是encoder和decoder的详细释义图:我们先来看一下encoder部

2020-09-24 20:55:20 921

原创 Seq2Seq和attention机制

1.seq2seq的设计初衷seq2seq设计的初衷是为了解决输入和输出都是不定长的问题,seq2seq使用encoder和decoder分别处理不定长的输入和输出,其示意图如下:图中的C背景变量,编码了输入序列的信息,在输出的第一时刻,我们将初始的隐状态S0和初始输出y0(<BOS>)以及C作为输入,产生了y1和隐状态S1,下一时刻的输入为C,y1和S1。2.seq2seq设计原理①endocer部分输入序列部分和普通的RNN没什么太大的区别,输入x可以直接使用索引,.

2020-09-23 16:37:23 277

原创 Glove和Fasttext

1.Gloveglove是一种使用词与词共现信息的词编码算法,要了解glove,首先需要知道共现频率矩阵,现在我们的语料库包括下面三份文档资料:I like deep learning.I like NLP.I enjoy flying.我们设定的窗口大小为1,也就是只看某个单词周围紧邻着的那个单词。此时,将得到一个对称矩阵——共现矩阵。因为在我们的语料库中,I 和 like做为邻居同时出现在窗口中的次数是2,所以下表中I 和like相交的位置其值就是2。而共现频率矩阵,需要

2020-09-22 20:36:11 521

原创 Word2Vec直观理解(全)

①在理解Word2Vec之前,我们需要首先明白一个问题:为什么不用one-hot?其实,无论是one-hot,抑或是Word2Vec,都是对词进行向量表示的一种手段,只不过one-hot更加简单,没有考虑上下文的关联,且任意两个one-hot向量的cosine similarity(余弦相似度,值越大夹角越小,我们认为两个向量越相近)都为0。此外,one-hot会随词表变大而变大,且特征极为稀疏。②Word2Vec的核心思维我们希望模型能够通过一个中心词去很好的预测其周围的单词,或利用周

2020-09-22 11:18:25 466

原创 二叉树的最近公共祖先

此题可分为种情况:1.p,q同侧,则左或右必有一个返回非null节点,此时将其返回2.p,q异侧,此时左右均非null,此时返回根节点3.左右均为null,则无class Solution: def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode: if not(root) or p == root or q == root: ..

2020-09-21 12:25:29 60

原创 买卖股票的最佳时机

原文题的等价问题是第n天卖掉和第n天不卖掉两种情况取大者,第i天如果不卖掉,则第i天最大利润dp[i] = dp[i-1]第i天如果卖掉,则第i天最大利润dp[i] 为当前股票价格prices[i]-之前最小的价格将两者进行比较取最大值即为最大利润。class Solution: def maxProfit(self, prices: List[int]) -> int: len_prices = len(prices) if len_pr..

2020-09-19 11:29:04 387

原创 打家劫舍问题

问题一这里的原问题可以分解为第n天不偷,和第n天偷的两种情况。如果第n天偷,则能偷到的最多钱数是dp[n-2] +nums[n]如果第n天不偷,则能偷到的最多钱数是dp[n-1]class Solution: def rob(self, nums: List[int]) -> int: len_nums = len(nums) if len_nums == 0: return 0 if len_num

2020-09-18 20:31:34 109

原创 双指针法之盛最多水的容器

初始时默认选择最左边和最右边的柱子,下次只需向中心移动较小的柱子,因为移动大柱子会导致左右柱子距离变小,但是盛水的高度由于受到小柱子限制不会变高。所以我们只需要向中心移动小柱子才有可能使得盛水高度变高,在宽度变窄的情况下也可能会使得整体的面积大于之前的。class Solution: def maxArea(self, height: List[int]) -> int: left = 0 right = len(height) - 1 ..

2020-09-17 16:01:44 85

原创 排序总结

选择排序,外循环每次确定一个最小的,内循环从下一个元素开始比较class Solution: def sortArray(self, nums: List[int]) -> List[int]: len_nums = len(nums) for i in range(len_nums): for j in range(i+1, len_nums): if nums[j] < nums[i]:

2020-09-17 14:41:17 77

原创 快速排序

class Solution: def sortArray(self, nums: List[int]) -> List[int]: if len(nums) <= 1: return nums left = [] right = [] for num in nums[1:]: if num <= nums[0]: left.append.

2020-09-17 13:10:57 61

原创 堆排序

堆排序的过程:1.创建初始堆。2.将堆的最后一个元素和堆顶元素交换,减少堆的范围, 调整堆。class Solution: def findKthLargest(self, nums: List[int], k: int) -> int: len_nums = len(nums) for i in range(len_nums//2-1, -1, -1): self.adjust_heap(nums, i, len_nums

2020-09-17 11:37:43 87

原创 回文串之中心扩展法

中心扩展法可以帮助减少在回文子串中暴力遍历的一次循环,在普通暴力遍历中,我们需要两次循环分别确定左指针和右指针(即回文子串的左右边界),然后还有一次循环向中间靠拢判断。中心扩展法将向中心靠拢的这一步改为了由中心向两边延申,由于回文子串有奇数和偶数之分,所以中心扩展法的起始点需要分两种情况讨论,即在遍历变量i在遍历的过程中,分别需要从i,i,和i,i+1开始。class Solution: def countSubstrings(self, s: str) -> int:

2020-09-17 10:44:33 578

原创 单调栈

1.什么是单调栈?单调栈是一种数据结构,其栈底到栈顶元素必然是有序的,如果是单调递增,则是单调递增栈,反之则是单调递减栈。2.单调栈的应用由于单调递增栈在每时每刻栈底到栈顶都是递增的,所以在维护这样的一个栈后,栈顶元素一定是新加入的元素左边第一个比他小的值。相反,单调递减栈可以帮助我们找到某一元素左边第一个比他大的元素。如果我们读入元素的顺序是相反的,则我们可以确定右边第一个比元素大的值和右边第一个比元素小的值。3.单调栈的代码target = [4, 7, 5, 2, 3]

2020-09-15 16:07:00 98

原创 回溯法之括号生成

class Solution: def generateParenthesis(self, n: int) -> List[str]: res = [] track = "(" def back_track(track, n): left_num , right_num = track.count('('), track.count(')') if left_num == n and righ...

2020-09-13 10:31:35 194

原创 回溯法之递增子序列

class Solution: def findSubsequences(self, nums: List[int]) -> List[List[int]]: res = [] track = [] used = [] # 使用used数组对同层重复元素剪枝, 使用start变量对下一层重复元素剪枝 len_nums = len(nums) def back_track(start, track, used)...

2020-09-13 10:23:57 121

原创 回溯模板之组合总和

class Solution: def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: res = [] track = [] def back_track(start, track, target, candidates): if sum(track) == target: re...

2020-09-12 21:03:25 78

原创 二分搜索及左边界右边界模板

int binary_search(int[] nums, int target) { int left = 0, right = nums.length - 1; while(left <= right) { int mid = left + (right - left) / 2; if (nums[mid] < target) { left = mid + 1; } else if (nums[mid.

2020-09-12 18:07:23 75

原创 位运算及典型例题

前置知识:任意一个数和0异或仍然为自己:a^0 = a任意一个数和自己异或是0:a^a=0异或操作满足交换律和结合律:a^b^a=(a^a)^b=0^b=b题目:解答:class Solution: def singleNumber(self, nums: List[int]) -> int: res = 0 for i in nums: res ^= i return res

2020-09-09 16:39:21 237

吉大967软专1995-2019真题全收录.pdf

1995-2019年吉大967软件工程历年真题全收录-----------

2019-07-28

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除