算法
文章平均质量分 91
打工人小飞
公众号:机器修行
展开
-
谈一谈交叉熵损失函数
关于损失函数的概念以及种类特点,可参看博主的博客: 常见的损失函数总结,谈到交叉熵,就不得不提信息熵的概念,同样可参看博主之前的博客:决策树之基 —— ID3 算法,博文中提到了信息熵的相关知识。有了上述两篇博文作为基础,此文不再赘述相关概念。交叉熵的离散函数形式交叉熵(cross entropy)是用来评估当前训练得到的概率分布与真实分布的差异情况,减少交叉熵损失就是在提高模型的预...原创 2018-05-22 16:31:40 · 4155 阅读 · 0 评论 -
BFS 解决 Word Ladder 问题
资源来源于 LeetCode127——Word Ladder。题目描述如下: 以题目给出的例子为例,其实就是在所有路径的权重都为1的情况下求出下列无向图中从节点 hit 到节点 cog 的最短路径: Postscript:图中相互之间只相差一个字母的单词都是相邻节点。这个就是图论算法中的单源最短路,求单源最短路比较通用的算法是 BFS 和 Dijkstra 算法,其区别是 BFS 不能用于带原创 2018-04-27 12:20:18 · 887 阅读 · 0 评论 -
位运算巧解组合问题
资源来自于一道百度面试题,说是现在有 a 到 z 26 个元素, 编写程序打印 a 到 z 中任取 3 个元素的组合(比如打印 a b c ,d y z 等),需要注意的是,组合问题不用考虑元素的顺序。当然,有人会说,这不是三层 for 循环就能解决的吗?是的,这是一种方法,但是,你要是这么做,面试官必然会问,如果我要求4个字母的组合呢?此时的你还忍心说再加一层 for 循环吗(一脸懵逼的状态吧……原创 2018-04-12 11:03:05 · 1149 阅读 · 0 评论 -
机器学习中常见的最优化算法总结
最优化算法的重要性不言而喻,笔者在本科的时候曾经投入不少精力参加数学建模竞赛,学习到了不少东西,也取得过一些较好的奖项。在数学建模竞赛中,优化问题占了大半江山,由此可见其在科研以及实际项目中的分量。本篇博客主要将竞赛和项目中曾遇到过的以及机器学习中的常见优化算法做一个概要总结。1. 梯度下降法关于梯度下降法的详细解释,可参照笔者的另一篇博客:BP 神经网络中的基础算法之二 —— 梯度下...原创 2018-04-10 16:33:16 · 5436 阅读 · 0 评论 -
一个完整机器学习项目流程总结
1. 实际问题抽象成数学问题这里的抽象成数学问题,指的我们明确我们可以获得什么样的数据,目标是一个分类还是回归或者是聚类的问题,如果都不是的话,如果划归为其中的某类问题。2. 获取数据获取数据包括获取原始数据以及从原始数据中经过特征工程从原始数据中提取训练、测试数据。机器学习比赛中原始数据都是直接提供的,但是实际问题需要自己获得原始数据。“ 数据决定机器学习结果的上限,而算法只是尽可能的逼近这个上限原创 2018-04-08 13:53:39 · 22883 阅读 · 4 评论 -
机器学习中,为何经常要对数据归一化?
机器学习中,为何经常要对数据归一化?原因有二:(1)归一化后加快了梯度下降求最优解的速度;(2)归一化有可能提高精度。为什么归一化能提高梯度下降法求解最优解的速度?假定为预测房价的例子,自变量为面积大小和房间数,因变量为房价。那么可以得到的公式为: y=θ1x1+θ2x2y=θ1x1+θ2x2y=\theta_1x_1+\theta_2x_2 其中,x1x1x_1代表房间数,θ1θ1\...原创 2018-04-07 16:50:49 · 8723 阅读 · 0 评论 -
总结 LR 与 SVM 以及 线性回归的区别与联系
LR 与 SVM 的联系与区别相同点LR 与 SVM 都是分类算法;LR 与 SVM 都是监督学习算法;LR 与 SVM 都是判别模型;关于判别模型与生成模型的详细概念与理解,笔者会在下篇博文给出,这里不详述。如果不考虑核函数,LR 与 SVM 都是线性分类算法,也就是说他们的分类决策面都是线性的这里需要说明的是,LR 也是可以用核函数的,因在 LR 算法里,每个样本点都必须参与决策面的计算原创 2018-04-05 15:42:49 · 3388 阅读 · 3 评论 -
二叉树的相关操作回顾(C++实现)
二叉树的初始化思路: 使用队列,队首出队一个元素队末进两个元素,而这两个元素正好是这个队首元素的左右节点。比如我们给定这样的一组数据:{1, 2, 3, 4, 5, 0, 6, 0, 7, 8, 9} (假设0代表空),则可构建二叉树如下: 整个建树以及遍历过程,在这里不细说,该篇博客主要是对数据结构中二叉树的相关具体实现做回顾与备忘。废话不多说,直接上代码:#include <iostream原创 2018-04-04 21:43:57 · 607 阅读 · 2 评论 -
总结 Logistic 回归与 Softmax 回归联系与区别
Logistic 回归与 Softmax 回归是两个基础的分类模型,虽然听名字像是回归模型,实际上并非如此。Logistic 回归,Softmax 回归以及线性回归都是基于线性模型。其实 Softmax 就是 Logistic 的推广,Logistic 一般用于二分类,而softmax 是多分类。逻辑回归的激活函数是 sigmoid 函数,可理解成一个被 sigmoid 函数归一化后的线性回归,si原创 2018-04-03 13:27:59 · 12379 阅读 · 6 评论 -
浅谈 SVM
SVM,全称是 support vector machine,中文名叫支持向量机。SVM 是一个面向数据的分类算法,它的目标是为确定一个分类超平面,从而将不同的数据分隔开。 如上图所示,w⃗ \vec{w} 为分割线(红线)的法向量,对平面上的某个样本点(向量 u⃗ \vec{u}),如果满足: w⃗ ⋅u⃗ ≥c时,则该样本属于正样本.\vec{w}\cdot\vec{u}\geq c 时原创 2018-03-25 17:11:33 · 614 阅读 · 0 评论 -
牛顿迭代法求解开方问题
五次及以上多项式方程没有根式解(就是没有像二次方程那样的万能公式),这个是被伽罗瓦用群论做出的最著名的结论。没有根式解不意味着方程解不出来,数学家也提供了很多方法,牛顿迭代法就是其中一种。资源来源于 LeetCode69——Sqrt(x)。题目描述如下所示: 题目要求实现库函数 sqrt(),并返回整数,实际上是降低了迭代次数,减少了计算量。解决该问题的一个较优也是很经典的方法就是牛顿迭代法。牛顿原创 2018-03-23 10:43:25 · 2629 阅读 · 0 评论 -
常用的激活函数对比
神经网络中激活函数的主要作用是提供网络的非线性建模能力,如不特别说明,激活函数一般而言是非线性函数。假设一个示例神经网络中仅包含线性卷积和全连接运算,那么该网络仅能够表达线性映射,即便增加网络的深度也依旧还是线性映射,难以有效建模实际环境中非线性分布的数据。加入(非线性)激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。因此,激活函数是深度神经网络中不可或缺的部分。在ICML2016的一篇原创 2018-03-19 16:04:58 · 9832 阅读 · 1 评论 -
谈一谈正则化
要理解正则化,首先需要了解过拟合的概念,关于过拟合,笔者在前面的博文中有专门提到,详情可参见博文:过拟合与欠拟合简要总结 以及 如何解决过拟合问题。下面结合 NG 的公开课、网络上资源解读以及自己的一些理解,对正则化做相关阐述:以 NG 公开课中的房价预测问题为背景,展开讨论。 在机器学习中,过多的变量(特征),同时只有非常少的训练数据,会导致出现过度拟合的问题。因此为了解决过度拟合,有以下两个办原创 2018-03-17 21:23:32 · 679 阅读 · 0 评论 -
整数除法的原理
资源来源于 LeetCode29 —— Divide Two Integers. 题目描述如下所示: 这道题让我们求两数相除,而且规定我们不能用乘法,除法和取余操作,比较直接的方法是用被除数一直减去除数,直到为0。这种方法有极端情况,比如除数为1,被除数接近 INT_MAX,则此时复杂度为 O(n)O(n). 除此之外,我们还可以用另一神器位操作 Bit Operation,思路是,如果被除数大于原创 2018-02-25 17:18:57 · 5585 阅读 · 0 评论 -
内排序算法之 —— 基数排序
基数排序是一种常见的算法,虽然在各个数据结构教材中都能看到,但在面试或笔试中却很少遇到,本篇博客简要讲解基数排序的算法原理和效率。基数排序不同于其他的排序算法,它不是基于比较的算法。基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。它是一种稳定的排序算法。多关键字排序中有两种方法:最高位优先法(MSD)和最低位优先法(LSD)。通常用于对数的排序选择的是最低位优先法,即先对最次位关键原创 2018-02-24 18:41:59 · 1117 阅读 · 0 评论 -
内排序算法之 —— 归并排序
归并排序的基本思想是:首先,将 R[0..n-1] 看成是 n 个长度为1的有序表,将相邻的有序表成对归并,得到n/2个长度为2的有序表;然后,再将这些有序表成对归并,得到n/4个长度为4的有序表,如此反复进行下去,最后得到一个长度为n的有序表。这里引用另一位博主的解析图: C++代码示例:void Merge(vector<int> R, int low, int mid, int high)原创 2018-02-24 17:25:53 · 403 阅读 · 0 评论 -
内排序算法之 —— 交换排序
交换排序的基本方法是:两两比较待排序元素的关键字,并交换不满足次序要求的那些偶对,直到全部满足为止。本次介绍冒泡排序和快速排序。冒泡排序冒泡排序的算法思想是:通过无序区中相邻元素关键字间的比较和位置的交换,使关键字最小的元素如气泡一般逐渐往上“漂浮”直至“水面”。整个算法是从最右边的元素开始,对每两个相邻元素的关键字进行比较,且使关键字较小的元素换至关键字较大的元素之上,使得经过一趟排序后,关键字最原创 2018-02-24 11:57:27 · 406 阅读 · 0 评论 -
内排序算法之 —— 选择排序
选择排序的基本方法是:每步从待排序的元素中选出关键字最小的元素,顺序放在已排序的元素序列的最后,直到全部排完为止。本次介绍简单选择排序和堆排序。简单选择排序简单选择排序的过程是:假设元素存放在 R[0..n−1]R[0..n-1] 之中,其中 R[0..i−1]R[0..i-1] 是有序区,R[i..n−1]R[i..n-1] 是无序区,且有序区的所有关键字均小于无序区的所有关键字。需将 R[i]R原创 2018-02-17 19:12:42 · 368 阅读 · 0 评论 -
深度优先搜索(DFS)解决括号排列问题
资源来源于 LeetCode22 —— Generate Parentheses。题目描述如下所示: 该问题是要将所有合法的括号排列打印出来。针对一个长度为 2n 的合法排列(n为左括号或者右括号的个数),第 1 到 2n 个位置都满足如下规则:左括号的个数大于等于右括号的个数。所以,我们就可以按照这个规则去打印括号:假设在位置 k 我们还剩余 leftNum 个左括号和 rightNum 个右原创 2018-02-08 17:14:23 · 894 阅读 · 0 评论 -
内排序算法之 —— 插入排序
这几天开始整理总结一下几个内排序算法。插入排序的基本思想是:每一趟将一个待排序的元素,按其关键字值的大小插入到已经排序的部分文件中的适当位置上,直到全部插入完成。本次介绍两种插入排序算法,即直接插入排序与希尔排序。直接插入排序直接插入排序是一种最简单的排序算法,其过程是依次将每个元素插入到一个有序的序列中去。假设元素放在 R[0…n-1] 之中,R[0…i-1] 是已排好序的元素区(简称有序区,初始原创 2018-02-07 17:12:02 · 843 阅读 · 0 评论 -
BP 神经网络中的基础算法之二 —— 梯度下降算法
在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法,关于最小二乘法,可参考笔者的上一篇博客 BP 神经网络中的基础算法之一 —— 最小二乘法。何为梯度?在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数 f(x,y)f(x,y), 分别对 x,y 求偏导原创 2018-02-06 21:03:10 · 2857 阅读 · 0 评论 -
BP 神经网络中的基础算法之一 —— 最小二乘法(LS 算法)
最小二乘法(LS 算法)是统计分析中最常用的逼近计算的一种算法,其交替计算结果使得最终结果尽可能地逼近真实结果。LS 算法是一种数学优化技术,也是一种机器学习常用算法。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和最小。最小二乘法还可用于曲线拟合,其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。若原创 2018-02-06 16:26:42 · 6950 阅读 · 0 评论 -
栈操作解决括号匹配问题
资源来源于 LeetCode 20 —— Valid Parentheses。题目描述如下所示: 题目意思简单明确,即判断所给的括号字符串是否合法。此题用栈的思想去解决再好不过了,首先将所有括号成对存储在 map 中,遍历字符串,只要栈不为空或者栈顶元素与指定字符不成对匹配,就将指定元素压栈,否则将栈顶元素出栈。一次遍历结束后,如果栈为空,则表示所给括号字符串已经全部匹配成功,即为合法字符串,否则原创 2018-02-05 20:22:00 · 533 阅读 · 0 评论 -
删除链表中倒数第n个节点(时间复杂度为O(n))
资源来源于 LeetCode 19 —— Remove Nth Node From End of List。题目描述如下所示: 题目意思很简单,简而言之就是删除链表中倒数第n个节点,需要注意的是(图中红框标出),只能遍历一次链表。还有一点,n一定是有效的,即n不会大于链表中的元素总数。我们首先要考虑的时,如何找到倒数第n个节点,由于只允许一次遍历,所以我们不能用一次完整的遍历来统计链表中元素的个数原创 2018-02-04 17:26:05 · 1027 阅读 · 0 评论 -
决策树之基 —— ID3 算法
决策树用来预测的是一个固定的对象,从根到叶节点的一条特定路线就是一个分类规则,决定这一个分类算法和结果。 决策树的生成算法是从根部开始,输入一系列带有标签分类的示例(向量),从而构造出一系列的决策节点。其节点又称为逻辑判断,表示该属性的某个分支(属性),供下一步继续判断,一般有几个分支就有几条有向的线作为类别标记。决策树的理论基础——信息熵信息熵指的是对事件中不确定的信息的度量。在一原创 2018-01-29 17:53:55 · 862 阅读 · 0 评论 -
算法设计——解决 3Sum 以及 3Sum Closest 问题
常写算法,多动脑,不会老!3Sum问题: 若不考虑效率问题,则解决该问题的思路就很简单直接,三个 for 循环遍历穷举即可。一个优秀的程序员肯定不能忍受这么无脑的时间复杂度,于是先想到先对全部数据进行排序操作,然后设置三个指针,数组的首尾各一,第三个指针从首位+1开始。设置合理的条件限制,移动指针。该过程中需要解决去重问题。废话不多说,贴代码:vectorvectorint>原创 2018-01-06 19:51:21 · 426 阅读 · 0 评论 -
贪婪算法解决 Integer to Roman 问题
常写算法,多动脑,不会老!理论太枯燥,先来个实际场景,场景取自 LeetCode 12 —— Integer to Roman 问题。要求能把 1~3999 的整型数字转化罗马数字。先科普一下罗马数字,如下表所示: 罗马字符 I V X L C D M 对应的阿拉伯数字 1 5 10 50 100 500 1000需要注意的是,罗马数字原创 2017-12-20 10:59:51 · 563 阅读 · 0 评论 -
LeetCode11——Container With Most Water
常写算法,多动脑,不会老!题目描述:Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and原创 2017-12-19 16:58:12 · 323 阅读 · 0 评论 -
关于显著性检验,有你想要的!
何为显著性检验?显著性检验(significance test)作为判断两个乃至多个数据集之间是否存在差异的方法被广泛应用于各个科研领域。在统计学中,显著性检验是“统计假设检验”(Statistical hypothesis testing)的一种,显著性检验是用于检测科学实验中实验组与对照组之间是否有差异以及差异是否显著的办法。“无假设,不检验”。用更通俗的话来说就是要先对科研数据做一个假设,然后原创 2017-12-14 14:21:05 · 25950 阅读 · 1 评论 -
5 分钟带你弄懂 k-means 聚类
聚类与分类的区别分类:类别是已知的,通过对已知分类的数据进行训练和学习,找到这些不同类的特征,再对未分类的数据进行分类。属于监督学习。聚类:事先不知道数据会分为几类,通过聚类分析将数据聚合成几个群体。聚类不需要对数据进行训练和学习。属于无监督学习。关于监督学习和无监督学习,这里给一个简单的介绍:是否有监督,就看输入数据是否有标签,输入数据有标签,则为有监督学习,否则为无监督学习。更详尽的解释会在后续原创 2017-11-08 16:16:23 · 116547 阅读 · 83 评论 -
对比欧氏距离与余弦相似度
欧式距离欧氏距离就是我们平常所说的距离,如果是平面上的两个点 A(x1,y1)A(x_1,y_1) 和 B(x2,y2)B(x_2,y_2) ,那么 A 与 B 的欧式距离就是 (x1−x2)2+(y1−y2)2‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾√\sqrt{(x_1-x_2)^2+(y_1-y_2)^2} ;如果是三维空间中的两个点 A(x1,y1,z1)A(x_1,y_1,z_1) 和原创 2017-11-07 16:48:20 · 21522 阅读 · 3 评论 -
如何通俗易懂地理解皮尔逊相关系数?
要理解 Pearson 相关系数,首先要理解协方差(Covariance)。协方差表示两个变量 X,Y 间相互关系的数字特征,其计算公式为:COV(X,Y)=1n−1∑n1(Xi−X⎯⎯⎯)(Yi−Y⎯⎯⎯)COV(X,Y)=\frac{1}{n-1}\sum_1^n(X_i-\overline X)(Y_i-\overline Y)当 Y = X 时,即与方差相同。当变量 X,Y 的变化趋势一致时原创 2017-11-06 11:45:57 · 72736 阅读 · 6 评论 -
常用的数量统计量的计算及统计意义
数量统计量是只适合数量类型数据的统计量,使我们最常见的统计量。笔者之前对资料特征数的计算作了简单地介绍,详情可跳转至 资料特征数的计算,本片博客力求全面和简洁易懂。对于数量类型的数据样本 X1,X2,⋯,Xn,X_1, X_2, \cdots ,X_n ,其数量统计量定义如下:均值(Mean)X⎯⎯⎯=1n∑n1Xi\overline X = \frac{1}{n}\sum_1^nX_i 很简单原创 2017-11-02 20:20:17 · 9198 阅读 · 0 评论 -
LeetCode 001 —— Two Sum
博主喜欢在闲暇时写点算法题目活跃活跃思维,之前在许多在线平台都有尝试过,比如北京大学的 POJ,浙江大学的 ZOJ,华为研究院自己研发的华为OJ等等,各有各的特色。最近很长一段时间华为OJ 平台外网登不上去了,很是遗憾,本着满腔热血,开启了 LeetCode OJ 平台的征战。这是在该平台的第一个题目,非常简单,也正好重温一下 C++ 基础知识。题目描述: 解题思路: 非常简单,若不是十分在意耗原创 2017-10-17 20:40:13 · 464 阅读 · 0 评论 -
IOS MD5加密
在软件开发过程中,对数据的加密是保证数据安全的重要手段,在 IOS 开发中,对于发送的网络请求,有时候是需要进行加密处理的,例如,采用阿里云的直播方案,在获取推流地址时,需要对 Token 地址进行加密处理。MD5 加密是一种比较常见的加密算法,它是一种特殊的加密方式。针对其独特性,总结为以下几点:1. 长度固定 不管多长的字符串,加密之后都是一样的长度。2. 容易计算 字符串和文件的加密过程是原创 2017-10-11 16:53:54 · 7906 阅读 · 0 评论 -
华为OJ——输入n个整数,输出其中最小的k个
今天刷的这题比较简单,长时间没刷 OJ 了,今天那这个小题目练练手,回忆一下 C++ 相关知识。先上题目:示例代码:#include <iostream>#include <vector>#include <algorithm>using namespace std;int main(int argc, char *argv[]) { int count; int number;原创 2016-11-04 16:50:14 · 1070 阅读 · 0 评论 -
常用的数据标准化方法
数据的标准化(normalization)是将数据按照一定规则缩放,使之落入一个小的特定区间。这样去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。其中最典型的就是0-1标准化和Z标准化,当然,也有一些其他的标准化方法,用在不同场景,这里主要介绍几种常用的方法。1、Min-Max标准化(Min-Max normalization)也称离差标准化,是对原始数据的原创 2016-06-13 14:46:39 · 27918 阅读 · 0 评论 -
中位数、众数和均值的关系
中位数、众数和均值都是描述数据集中趋势的统计量,他们各有特点。例如,对于某种商品的各种售价,中位数处在中间的价格,大于和小于中位数的价格各为一半;众数为众多价格中出现频数最多的那个价格;而均值在大部分情况下,数值上不会等于其中的任何一个价格,但是将所有的价格都放在数轴上,均值刚好位于平衡点,即在所有价格的重心上,该点两侧的力矩是相等的,恰好使数轴保持平衡。当数据为单峰的对称分布时,其中位数、众数与均原创 2016-01-23 16:35:44 · 21451 阅读 · 0 评论 -
提取不重复的整数(桶排序思想)
描述 输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。 知识点 数组 运行时间限制 10M 内存限制 128 输入 输入一个int型整数 输出 按照从右向左的阅读顺序,返回一个不含重复数字的新的整数 如果返的整数以0开头,去掉0; 如 intput:1010 output:1 样例输入 9876673 样例输出 37689原创 2015-08-30 16:55:42 · 1703 阅读 · 0 评论 -
整形数组合并(STL vector删除重复元素)
描述题目标题:将两个整型数组按照升序合并,并且过滤掉重复数组元素详细描述:接口说明原型:voidCombineBySort(int* pArray1,intiArray1Num,int* pArray2,intiArray2Num,int* pOutputArray,int* iOutputNum);输入参数: int* pArray1 :整型数组1 intiArray1Nu原创 2015-08-06 10:46:49 · 3672 阅读 · 0 评论