【动手学MVG】ICP算法原理和代码实现

本文介绍的ICP问题,是在3D点已配对情况下的ICP,并且,3D点坐标的尺度相同。如果两个点云的尺度不同,需要另外考虑。可以搜索关键字"scale of ICP"。
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

机器学习中的主成分分析(PCA)原理+代码实现

机器学习和计算机视觉中,常涉及到主成分分析(PCA),这里从最大可分性的角度介绍了PCA,并给出代码实现。
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

【算法日记】全排列问题递归实现

全排列定义:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。公式:全排列数f(n)=n!(定义0!=1)如123的排列就有:123 213 132 231 321 312算法思想:n个数字,先确定第一位,然后每一种情况后面的n-1个数字继续全排列,继续全排列也是先确定第一位,然后剩下的部分继续全排列,这样剩下的部分最后会不断减少,减少到只有一个元素就输出,此时全排列成功。如图所示核心算法如下```v
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

【算法日记】汉诺塔递归实现

问题描述:汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。(即:小盘子必须在大盘子上面,每次只能移动一个盘子。最后把A上面所有盘子移动到C)思想:假设现在就两个盘子,可以直接把小盘子从A移动到B,然后把大盘子从A移动到C,最后把小盘子从B移动到C。那么其实64
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

python遍历dict

hobbies = {'sing': 100, 'dance': 100, 'rap':100, 'basketball':100}for (k, v) in hobbies.items(): print(k, end=':') print(v)for k in hobbies.keys(): print(k, end=':') print(hobbies[...
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

python中的类型提示(定义函数时加入箭头->)

偶尔看到一些代码在定义函数时,在def那一行后面会加一个->。这个玩意儿有个专门的名词叫 type hint, 即类型提示。官方网站:https://www.python.org/dev/peps/pep-0484/比如:def add(a:int, b:int) -> int: return a+b这个表示并没有多么的神奇,意思是:告诉你期待的输入类型和输出...
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

【pickle】python保存任何类型的中间结果

用python处理数据的过程中,经常涉及计算量相对较大但是不太变动的中间结果。如果每次想拿到这个中间结果就跑一遍计算的话,会非常浪费时间(比如预处理的训练数据)。这个时候会思考,如果有种便捷的方法来保存这些 中间结果,就不用进行反复计算了。对于str类型或者简单的list类型的中间结果,我们可以直接用txt文件保存;对于dict类型的中间结果,我们可以用json保存。But, 如果中间结果是特...
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

python检测函数运行时间用【巧用装饰器】

众所周知,python中的time模块可以获取时间戳,然后得到程序片运行所消耗的时间。但靠时间戳相减得到运行时间对于大规模程序是比较卑微的,你得命名很多个变量名去记录时间戳。这个时候,可以利用装饰器来记录时间。本文介绍两种方法,进行对比。常规版:from time import timedef run(): res = 0 for i in range(10000): for j in range(10000): res += 1
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

【python高阶】Python中的多进程编程

进程是一个系统概念,也对应于CPU的底层硬件概念。首先,可以查一下你的CPU可以支持几个线程:from multiprocessing import cpu_countprint(cpu_count())开启多进程的时候,最好不要接近或者超过CPU的硬件进程数。from multiprocessing import Processfrom time import sleepdef run(n): sleep(n) print(n)if __name__
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

GNN中的Graph Pooling

前言GNN/GCN在非欧数据中的应用具有极大的挖掘价值。通常,GNN的应用分为两种:1,节点分类;2,图分类。节点分类可以用在点云分割,社交网络节点分类,推荐算法等等。图分类可以用在姿态估计,蛋白质分类等等,当然,也可以用在图像分类。对于节点分类而言,图结构在forward阶段是不会改变的,改变的只是节点的隐藏层属性。如下:对于图分类而言,图结构在前传的时候会downsize,最后聚合成一个点的feature再做MLP:截图来自论文:https://arxiv.org/abs
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

networkx+python构建图结构数据并可视化

目前处理非欧数据最常见的方法还是构建图,而networkx一个专门的构建图数据的工具。方便又好用。先给链接:https://networkx.github.io/官方文档:https://networkx.github.io/documentation/latest/networkx的安装方法上面的官方文档已经很详细记录,阿盏就不赘述了。官方文档里给了几个demo,虽然便利,但泛化性不强。我这边给一个泛化性强一些的demo:import networkx as nximport ma
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

pip清理cache以及安装模块时跳过cache

用pip安装python模块的时候,重复安装某一模块会经常出现“Using cache”,这样很容易装错版本。于是在stackoverflow找到大概两种方法。1. 直接跳过cache:(tqdm是栗子)pip install -U tqdm2. 清理pip cachecd ~/.cache/pipsudo rm -rf *注意:做rm的时候一定要看清楚路径,别删了库最后只能跑路了。参考链接:https://stackoverflow.com/questions/9510474
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

python计算两个向量夹角

简单的小代码,项目里可能用到,记录一下:from math import sqrt, powdef angle_of_vector(v1, v2): pi = 3.1415 vector_prod = v1[0] * v2[0] + v1[1] * v2[1] length_prod = sqrt(pow(v1[0], 2) + pow(v1[1], 2)) * sqrt(pow(v2[0], 2) + pow(v2[1], 2)) cos = vector_pro
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

Linux下的终端中用shell命令打开文件夹窗口

用惯了linux,总会一言不合ctrl+alt+t打开terminal操作文件。有的时候想看看文件,terminal那种文件显示太朴素,对于图像视频等文件的缩略图看不出来。所以今天推荐的工具是nautilus直接在命令行输入:nautilus直接会打开根目录的文件夹窗口。如果想打开当前目录的文件夹窗口,可以:nautilus .直接解决需求,干净又卫生。...
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

Linux终端自定义命令(超实用技巧)

今天记录的是一个能够体验linux terminal操作体验的技巧。技巧描述为:linux终端的任何命令都可以替换成其他的字符串来代替。具体怎么玩呢?逐步往下看,惊喜会越来越多。比如,我觉得查看GPU运行状态的nvidia-smi太长,每次输入都很麻烦,我想改成"mygpu"。操作如下:vim ~/.bashrc在文末加上一句:alias mygpu='nvidia-smi'然后:wq保存推出,再source一下:source ~/.bashrc这个时候,你的l
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

【pytorch】RuntimeError: Integer division of tensors using div or / is no longer supported【解决】

ok, 能搜到这篇文章大概遇到了我已经遇到过的问题。今天把pytorch升级到1.6.0,发现tensor和int之间的除法不能直接用'/'。明明1.5.0都是可以用的-_-。火炬这种邻代兼容性有点值得吐槽。对于这个问题直接看官方文档就可以了:https://pytorch.org/docs/stable/generated/torch.div.html或者,看我的解决方案:对于tensor A和整数n之间的除法:result = A / n # not supported in to
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

pytorch中view的用法(重构张量)

view在pytorch中是用来改变张量的shape的,简单又好用。pytorch中view的用法通常是直接在张量名后用.view调用,然后放入自己想要的shape。如tensor_name.view(shape)Example:1. 直接用法:>>> x = torch.randn(4, 4)>>> x.size()torch.Size([4, 4])>>> y = x.view(16)>>&gt...
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

pytorch获取张量元素个数numel()的用法

numel就是"number of elements"的简写。numel()可以直接返回int类型的元素个数import torcha = torch.randn(1, 2, 3, 4)b = a.numel()print(type(b)) # intprint(b) # 24通过numel()函数,我们可以迅速查看一个张量到底又多少元素。...
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

pytorch获取模型的中间层输出结果

在inference阶段,整个模型会load到GPU上,进行端到端的计算,通常只会给你输出一个最终结果。如果想要获取模型的中间层输出,则需要在计算前标定目标层位置(通过forward返回),或者把模型在那层截断(当作一个小模型)输出。本文介绍2种获取模型中间层输出结果的方法:1. 标定目标层位置def forward(self, x): layer1_out = self.layer1(x) layer2_out = self.layer2(layer1_out) ou
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0

Ubuntu重装显卡驱动

本机环境如下:系统:ubuntu16.04GPU:RTX 2080tiCUDA: 10.1NVIDIA driver: 430.40不知为何,每用一段时间,显卡驱动就会崩。大概两个月会重装一次显驱,所以把步骤用博客记录一下:一共分6步1. 开机跳到F1界面:CTRL+ALT+F12. 关掉图形界面:sudo service lightdm stop3. 改变显驱文件的模式:sudo chmod a+x NVIDIA-Linux-x86_64-430.40.ru
分类: 其他 发布时间: 09-25 14:55 阅读次数: 0