代码改变世界

随笔档案-2012年12月

字符编码及文件读取的基础知识

2012-12-12 22:19 by 钱吉, 1516 阅读, 收藏,
摘要: 这是以前写的一点笔记,把它转过来。1、二进制文件和文本文件首先看二段代码:生成一个二进制文件和一个文本文件。打开一个二进制文件:test.dat,写入整数1234,其对应的十六进制为04D2。 FILE *pfile; int ntest = 1234; if(NULL == (pfile=fopen("test.dat","wb"))) { printf("can't write file:test.dat"); return(1); } fwrite(&ntest,sizeof(int),1,pfile); fcl 阅读全文

BP神经网络算法推导

2012-12-12 21:50 by 钱吉, 23253 阅读, 收藏,
摘要: 前言:自己动手推导了一下经典的前向反馈神经网络的算法公式,记录一下。由于暂时没有数据可以用作测试,程序没有实现并验证。以后找到比较好的数据,再进行实现。一:算法推导 神经网络通过模拟人的神经元活动,来构造分类器。它的基本组成单元称为”神经元”,离线情况下如果输入大于某值时,设定神经元处于兴奋状态,产生输出,否则不响应。而这个输入来自于所有其它的神经元。而神经元的响应函数有多种(需要满足可微,这种简单的函数可以拟合任何非线性函数),本文选择sigmod函数。关于基础知识在此不在多说,这里主要介绍一下BP神经网络,并推导权值和阈值的更新公式。 BP网络通过前向反馈误差来改变权值和阈值,当网络的.. 阅读全文

排序算法(二)

2012-12-08 13:49 by 钱吉, 204 阅读, 收藏,
摘要: 前面讲了冒泡排序和插入排序,今天讲的排序算法是shell排序shell排序命名来自于Donald Shell,该算法被证明为有亚二次时间界。是插入排序的一种改进,舍弃了插入排序逐一比较的不足之处,而是设定一个增量,间隔比较。然后逐渐缩小这个增量,最终达到排序目的,所以shell排序也叫缩减增量排序。首先,需要设定一组增量序列,h1,h2,...hk。然后先从h1开始,以此增量为步长,将全部序列分成若干组,每一组进行插入排序。接着增量变为h2,继续分组,然后再插入排序,这样直到最后。不同的增量序列带来的计算量不一样,本文以shell建议的增量序列为例进行算法说明,即h1=N/2,hk=hk-1/ 阅读全文

排序算法(三)

2012-12-08 13:49 by 钱吉, 254 阅读, 收藏,
摘要: 前面介绍的冒泡排序,插入排序,shell排序都是基于两两元素比较,然后移动的排序算法,有着O(N2)的复杂度,今天讲三种比较牛的排序算法,可以将复杂度降低为O(n*lgn)。分别是:1) 堆排序。2)归并排序。3)快速排序。1、堆排序算法:利用二叉堆(binary heap)的数据结构形式,及其性质对数据进行排序。首先看下什么是二叉堆,wiki解释:二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足堆特性:父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值,且每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个子节点 阅读全文

排序算法(四)

2012-12-08 13:49 by 钱吉, 268 阅读, 收藏,
摘要: 今天讲两种比较诡异的排序算法,之所以诡异是因为这两种排序算法与之前介绍的几种不太一样(见排序算法前三篇)。之前的排序算法都是基于元素比较来得到的,它们中间,像堆排序,快排等都有着比较理想的时间复杂度下界O(nlgn)。那么有没有更快的排序算法?有!下面的这两种排序算法的最好时间复杂度是O(n)。是不是很诱惑?一起来看看。1)桶排序桶排序实际上是先定义m个单元,每个单元满足一定的条件并按顺序排列,然后将所有的数据根据一种映射法则,分配到相应的单元内。然后对每个单元进行排序,最后汇总。说的很抽象,下面举个例子说明:假设现在要统计一个学院的期末考试成绩,共有1000个学生。每个学生的成绩是0-100 阅读全文

排序算法(一)

2012-12-08 13:47 by 钱吉, 291 阅读, 收藏,
摘要: 整理一下比较主流的几种排序算法,这篇介绍的排序算法有:1) 冒泡排序,2) 插入排序。一:冒泡排序这已经成为了教科书式的排序算法了。很容易实现,且对部分已经排好序的数据进行排序时,具有比较好的效率。它的最坏情形是O(N2)。算法思路:以从小到大排序为例,每次从数组最后一个元素开始,比较相邻的两个元素,如果array[j]<array[j-1],即后面的元素小于前面的元素,那么交换两者的顺序,然后j--,再比较j和j-1位置上的元素,直到最后,这样最小的元素就移动到了数组的前面。好比是将数组中的元素看成是不同重量的气泡,放在水中它们会自动在重力作用下,轻的上漂,重的下沉。这也是冒泡排序的原 阅读全文

HTK代码中的log-add算法实现

2012-12-07 10:44 by 钱吉, 1486 阅读, 收藏,
摘要: 在语音识别处理中,一般采用基于高斯混合模型的HMM框架。在模型的训练中(如htk的代码),涉及到大量的概率值计算,这些概率值往往是很小的浮点数。而且概率值相乘后会越变越小,计算起来会损失精度,为了保持准确度,统一将这些概率值进行log处理,再参与运算。也就是说,在代码中处理的概率是对数域的值,即:p1' = logp1p2' = logp2在对数域中,乘法和除法变换为:loga*b = loga + logb; loga/b = loga - logb;所以对于p=p1*p2,则转换到对数域后变为:p' = logp = logp1*p2 = logp1+logp2 = 阅读全文