-
用Python进行边缘检测
边缘检测在图像的检测中是经常会用到的。图片的边缘会包含大量的信息,因此在图像的分割、识别、分析中通常可以取边缘作为图像特征。边缘检测最经典的应用就是图像的锐化了,想必大家都用过。 为了进行边缘检测,我们通常会用到以下的一些算子,即一阶算子(梯度算子)和二阶算子(拉普拉斯算子)。 拉普拉斯算子(Laplacian Operator) 拉普拉斯算子其实就是二阶微分算子,具有各向同性。他也会增强噪声,因此在使用拉普拉斯算子之前需要进行平滑处理。他的主要用处其实是判断一个像素是处于图像的亮区还是…
-
Julia集分形图案绘制
从去年就开始窥东大的C++教学群,当时就被李骏扬老师讲的分形图案给吸引了,简直美赞了。他们的期末作业就是制作一个分形图案的视频,我们这种学校显然不会有这种东西。于是就想着能不能自己研究着画下,然而并不知道这种图案怎么画,度娘上找来的基本没用。搁置了一年,偶然间翻到了一篇论文,终于找到了画图的方法了,加上之前正好有用python绘图的工具,总算把这个东西搞通了一点。其实这个玩意的水还是非常深的,牵涉到了复分析,分形,甚至是混沌理论,据说从上古贝壳的图案,到如今麦田怪圈的图案,都和Julia集有关,…
-
机器学习中的交叉验证思想
简述 在使用训练集对参数进行训练的时候,经常会发现人们通常会将一整个训练集分为三个部分(比如mnist手写训练集)。一般分为:训练集(train_set),评估集(valid_set),测试集(test_set)这三个部分。这其实是为了保证训练效果而特意设置的。其中测试集很好理解,其实就是完全不参与训练的数据,仅仅用来观测测试效果的数据。而训练集和评估集则牵涉到下面的知识了。 因为在实际的训练中,训练的结果对于训练集的拟合程度通常还是挺好的(初试条件敏感),但是对于训练集之外的数据的拟合程度…
-
逻辑回归算法
说到逻辑回归(Logistic Regression),其实他解决的并不是回归问题(Regression),而是分类问题(Classification)。分类问题都明白了,他和一般的回归问题的差别其实也就在于一个值域是连续的,而另一个值域是离散的, Sigmoid函数 我们都知道分类问题需要解决的问题是给你一个分好类的训练集,然后给你一个数据让你判断这个数据属于哪一类。严格来说这是一个离散的问题,然而我们一般能够处理的都应该是连续可导的函数。而连续可导的线性函数一般都不能非常好的体现出离散…
-
多变量线性回归算法
其实所谓的多变量的线性回归(Linear Regression with multiple variables )本质上将与单变量的线性回归没啥差别。因此我们完全可以用上一节中的梯度下降算法来解决,只需要在每一次迭代的时候多考虑几个变量而已。所以这一节就稍微介绍一下了,不再用例子分析。不过毕竟多了一些变量,在对多变量跑梯度下降算法时,显然对参数的调节就更加重要了,因此我们首先得学会一些参数调节的技巧。这些技巧在实际的操作过程中尤为重要。 调节参数 特征值缩放(Feature Scalin…
-
批量梯度下降算法
这一讲介绍了我们的第一个机器学习算法,”批量“梯度下降算法(Batch Gradiant Descent)。注意到他在前面加了个“批量(Batch)”,这其实是为了与以后的另一种梯度下降算法进行区分从而体现出这个算法的特点。 线性回归 梯度下降算法这是用来解决所谓的“线性回归”问题。线性回归应该都懂了,这里大概的进行下定义(以单变量为例): 1、给你一个数据集(Training Set),数据集中有很多个数对,表示$(x_i,y_i)$。 2、你的任务是构造一个预测函数$h_\thet…
-
正则表达式基础(2)
上一节记录了主要的一些元字符集,算是刚刚入了门。这一节主要介绍一些稍微需要动脑筋的东西。 分组捕获与后向引用 分组实际上就是个对括号,用处就是将一个匹配串当成一个整体来看,用于改变匹配的优先级。比如我们要匹配“abcabcabcabc”,就可以这样匹配:(abc){4} 。 在分组的基础上,我们就可以进行后向引用。所谓后向引用,就是将之前匹配到的字符串记录下来,供后来继续用,提高表达式的效率。 具体用法是,系统会给表达式中所有的分组标上序号,从1开始。接下来每当希望用到之前分组的内容时…
-
正则表达式基础(1)
正则表达式这东西真的特别常用,在搜索文本啊,写爬虫什么的都得用到。而且现如今各种语言,都会支持正则表达式。之前也零零碎碎的看过,但是很多细节都记不清,这里姑且把一些知识要点记录下来,供日后查找使用。 通用的正则表达式 由于正则表达式有很多种实现方式,所以各种方式之间有一些区别。但是以下的一些条件,则是在任何语言的正则中都适用的规律: 符号 匹配 ^ 匹配输入字符串开始的位置。 $ 匹配输入字符串结尾的位置。 * 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配…
-
二叉堆简述
简述 对于堆,我个人的理解就是一种优先队列,从队列中取元素的时候总是取出最大(或最小)的元素。二叉堆是一种堆的一种实现形式,是一棵完全二叉树。对于二叉堆,我们显然可以分成两类:大根堆和小根堆,表示他每次取出的是最大元素还是最小元素。而大根堆一定是满足这样的一个性质,即:对于任意一个节点,他一定不大于他的父亲,而且不小于他的两个儿子。小根堆反之。 实现功能 以$O(n)$的时间建树,并以$O(logn)$的复杂度实现插入、寻找最小(或最大)值,修改元素,删除元素。 实现思路(小根堆)…
-
左偏树简述
简述 左偏树与二叉堆一样,是一种优先队列的实现。但是与二叉堆不一样,他不是一种完全二叉树,而是一种不平衡二叉树,这样做的目的是为了实现一个重要的性质--合并。通常的二叉堆并不能方便的实现两个堆之间的合并,而左偏树,却恰恰适合解决这样的问题。 实现功能 实现一个最小优先队列,是的插入、删除、合并等操作均在$O(logN)$的时间复杂度内完成。 实现思路 左偏树定义了一种节点叫“外节点”,即这个节点的左子树或者右子树为空。并且定义了一个性质叫“距离”,就是这个节点到他子孙中最近的外节点…