刘洪江的流水帐

拾起点点滴滴, 聚沙成石.

一个连咖啡都要趁热一饮而尽的男子

Linux命令行提示符配置

| Tags: linux

linux下shell提示符可以任意配置的。

首先看看bash的配置文件,一般在用户的HOME目录下有这样几个文件1

  • .bash_history :记录了您以前输入的命令,
  • .bash_logout :当您退出 shell 时,要执行的命令,
  • .bash_profile :当您登入 shell 时,要执行的命令,
  • .bashrc :每次打开新的 shell 时,要执行的命令。

这些文件是每一位用户的设置。系统级的设置存储在’/etc/profile’、’/etc/bashrc’及目录’/etc/profile.d’下的文件中。但您得习惯用各自的配置文件:编辑不需要’root’权限,还可以使您的设置更有个性。当系统级与用户级的设置发生冲突时,将采用用户的设置。

每次当您打开一个控制台(console)或 xterm 时,最先看到的就是提示符(prompt),类似于:

account@hostname ~ $

在默认设置下,提示符将显示您的用户名、主机名(默认是’localhost’)、当前所在目录(在Unix中,’~’表示您的home目录)。 按照传统,最后一个字符可以标识您是普通用户($),还是’root’(#)。 您可以通过 $PS1, $PS2 变量来设置提示符,$PS2是当在多行内输入一个命令时,换行后,出现的提示符。命令

Elasticsearch之基本操作

| Tags: 3rd tools

摘要: 本文简单介绍了elasticsearch的HTTP API中的插入、删除、更新、查找、搜索功能。

elasticsearch是一个是开源的(Apache2协议),分布式的,RESTful的,构建在Apache Lucene之上的的搜索引擎。

它有很多特点例如Schema Free,Document Oriented。它是#nosql的,基于JSON,同时支持多种API,包括HTTP, thrift, memcached。支持HTTP,是比较爽的一点,因为基本上所有的应用都可以用ES了,页面上的js脚本都可以去查询。

安装

启动和安装特别简单,在ES下载页面下载zip或者tar包后,解压,然后到elasticsearch的目录下,运行下面的命令就可以了。

bin/elasticsearch -f

搭建集群也非常简单,在同网段的机器上,启动es后,它们会自动组建成一个集群,并完成数据的分布式存储,查询时也会按照分布式的方式去查找。

好了恭喜你,现在你已经可以搭建ES单机版和ES集群了,一切都这么简单。

基于SVM的手写数字识别

| Tags: Machine Learning

摘要: 本文主要介绍了一个使用svm实现一个简单的数字手写识别的例子。首先讲到如何将svm应用到多类分类,又简单介绍了高斯核函数,之后又简单介绍了本例所使用的数据来源和格式,最后贴出来实现的代码。

前面两篇blog介绍了支持向量机SVMSMO算法,这一篇就讲讲SVM的一个简单实际应用:使用svm实现一个简单的数字手写识别软件。首先要解决如何使用svm进行多类分类。

svm与多类分类1

svm是一个二类的分类器,即它只回答属于正类还是负类的问题。而现实中要解决的问题,往往是多类的问题,比如文本分类,比如数字识别。如何由两类分类器得到多类分类器, 一般有三种方法:

一对多(一对其余)

比如我们有5个类别,第一次就把类别1的样本定为正样本,其余2,3,4,5的样本合起来定为负样本,这样得到一个两类分类器。 通过类似的方法构造类别2、3、4、5的分类器,对于测试数据,每一个分类器都过一次,在那个分类器中,被判定为正,那么就认识它属于那个分类。 但有两个问题还没有解决:一是被多个分类器判定为正,二是被所有分类器判定为负。第一种情况,可以简单地选择第一个被判定为正的分类,对二种情况,可以视为分类失败了。另外一个问题是,“其余”的那一类样本数总是要数倍于正类(因为它是除正类以外其他类别的样本之和嘛),这就人为的造成了的“数据集偏斜”问题。

SMO序列最小最优化算法

| Tags: Machine Learning

摘要: 序列最小最优化(sequential minimal optimization, SMO)算法是支持向量机的学习算法,本文主要讲解了SMO算法,并且实现了一个简单基于smo的svm。

上一篇blog讲到了svm的原理,最后将需要解决问题抽象成了数学公式,但如何利用计算机,解出这些数学公式的答案。换句话说,就是怎么通过计算机算出我们的svm模型的参数呢?方法就是序列最小最优化(sequential minimal optimization, SMO)算法。

首先回顾一下SVM模型的数学表达,即svm的对偶问题:

选择一个 $ {a^*} $ 的正分量 $ 0 \lt {a_j^*} \lt C $ , 计算(或者通过所有解求平均值):

决策函数为

svm的学习,就是通过训练数据计算出${a^*}$和${b^*}$,然后通过决策函数判定${x_j}$的分类。其中${a^*}$是一个向量,长度与训练数据的样本数相同,如果训练数据很大,那么这个向量会很长,不过绝大部分的分量值都是0,只有支持向量的对应的分量值大于0 。

SMO是一种启发式算法,其基本思想是:如果所有变量的解都满足了此最优化问题的KKT条件,那么这个最优化问题的解就得到了。否则,选择两个变量,固定其它变量,针对这两个变量构建一个二次规划问题,然后关于这个二次规划的问题的解就更接近原始的二次归还问题的解,因为这个解使得需要优化的问题的函数值更小。

翻译一下:对于svm我们要求解${a^*}$,如果 ${a^*}$ 的所有分量满足svm对偶问题的KKT条件,那么这个问题的解就求出来了,我们svm模型学习也就完成了。如果没有满足KKT,那么我们就在 ${a^*}$ 中找两个分量 ${a_i}$ 和 ${a_j}$,其中 ${a_i}$ 是违反KKT条件最严重的分量,通过计算,使得 ${a_i}$ 和 ${a_j}$ 满足KKT条件,直到${a^*}$ 的所有分量都满足KKT条件。而且这个计算过程是收敛的,因为每次计算出来的新的两个分量,使得对偶问题中要优化的目标函数(就是min对应的那个函数)值更小。至于为什么是收敛的,是因为,每次求解的那两个分量,是要优化问题在这两个分量上的极小值,所以每一次优化,都会使目标函数比上一次的优化结果的值变小。

SVM支持向量机

| Tags: Machine Learning

摘要: SVM(support vector machine, 支持向量机)是一个二分的分类器。本文简单讲解了线性svm和非线性svm的原理。

是今年工作中才开始接触机器学习的,之前有所听说,但是也没有深入了解过。其实所谓的接触主要是照着李航的这本《统计学习方法》学习。当时我们是几个同事每人学习一章,学完了,然后给大家办个讲座。我想既然学习了,就应该写博客把这些内容记录下来。于是,就开始写了。

机器学习是最近十年兴起的一门学科。人工智能是计算机学界的一个公认的难题,而机器学习被认为是最有可能解决这个难题的一门学科。当然机器学习在其它很多领域都有应用,比如数据挖掘,信息检索,语言识别,图像识别等很多领域。对于机器学习的基本概念,可以看《统计学习方法》的第一章,发展历史可以看wikipedia的Machine learning。我这里就不罗嗦了。等以后再写一篇机器学习的综述文章吧。

按照《统计学习方法》的划分,机器学习可以分为监督学习,无监督学习和半监督学习、强化学习等。该书讲了监督学习,总共讲了这些学习模型:感知机、k近邻法、朴素贝叶斯法、决策树、逻辑斯谛回归、最大熵、支持向量机、EM算法、隐马尔科夫模型、条件随机场。我先把我们学习过的模型写成博客吧。但其实每个模型都有很多内容,以我一个初学者的水平估计也讲不了什么,我就按照我的理解讲,每个模型争取能实现一个例子,供大家参考。

今天第一篇,SVM(support vector machine, 支持向量机)。

jni调用C和C++

| Tags: C/C++

摘要: java程序可以通过jni调用C或者C++的库。本文实现了一个简单的jni调用例子。

已经在工作中碰到了两个这样的例子了,项目用java,但需要调用C/C++的库。之前一个是用java写hadoop的job,但是调用的算法是用C++实现的,使用的是jni。现在好像jni在android上面也有用到,但是我不了解。我自己也不懂java,但实际工作中有的时候也要看看java代码。所以决定写一个简单的jni例子,了解一下jni怎么完成C/C++调用的。

虚继承

| Tags: C/C++

C++里面的virtual关键字可以用虚函数声明,也可以用于虚继承。上一篇博客讲到了《虚函数》,这篇博客就讲虚继承。

首先来看为什么需要虚继承。C++里面继承关系中有个很有名的继承结构,菱形继承,如下图所示

普通继承,派生类包含了基类所有的非static成员。如果采用普通继承,在上图的iostream类中,实际上会存在两个ios基类。这样会带来很多问题,首先最简单的是空间浪费,iostream类中存在两个相同的ios类,然后是构造效率低,需要构造两个ios类。更严重的是调用基类中的函数时,存在二义性,当iostream调用ios的成员函数时,编译器无法知道是调用istream还是ostream中的ios。

C++的解决方案就是虚拟继承(Virtual Inheritance)。虚拟继承可以说成虚继承,在本文中,这两个词是等价的。 在虚拟继承下,只有一个共享的基类子对象被继承,而无论该基类在派生层次中出现多少次。共享的基类子对象被称为虚拟基类(virtual base class)。在虚拟继承下,基类子对象的复制及由此而引起的二义性都被消除了。

虚函数

| Tags: C/C++

面试的时候,常常宣称自己是一个C++程序员,不免就会被问一些有关C++的问题,例如虚函数的实现原理;析构函数是否能定义为虚函数等等。很多时候都回答不上来,就总会以时间久了忘了,搪塞过去,面试完,可能回去查查答案,但也总是不求甚解。

既然有了博客,我就准备看看这些方面的内容,希望能记录下来,有所积累。于是就到网上查,或在书上找找,后来发现里面的内容太多了,不是一篇两篇博客就能写完的。于是没有办法,就只有硬着头皮写一个系列了。今天是第一部分虚函数和虚继承。

C++的关键字virtual只能用在两个地方,一是定义类的成员函数为虚函数,二是定义类的继承关系为虚继承。这两点的用处大相径庭,但是在设计思想上还是有一定的共同性的。这篇文章先讲虚函数,下一篇讲虚继承。

博客的样式

| Tags: octopress

摘要: 本文就介绍了这个blog搭建过程中,一些样式如何设置的。包括:引用块的样式,表格的样式,首行缩进,添加豆瓣侧边栏, 文章摘要。

使用的markdown解析工具为kramdown。

读Vim手册笔记

| Tags: Vi

书籍

《VIM用户手册》  
作者: Bram Moolenaar  
翻译: ZhaoRuFei<slimzhao@hotmail.com>  
版本: 7.0  

笔记

  1. 要退出Vim, 用命令”ZZ”. 该命令保存当前文件并退出Vim.
  2. 如果你在放弃所有修改后还想以该文件的初始内容作为开始继续编辑, 还可以用”:e!”命令放弃所有修改并重新载入该文件的原始内容.

奇技淫巧

  1. d^ 删除光标到行首第一个非空白字符之间的内容,可用于删除行首的空白
  2. gu/gU 大小写转化,gu小写,gU转为大写.
    u/U: 选中区域,直接进行大小写转换 gg gu G:整篇文章大写转化为小写。
    gU0 :从光标所在位置到行首变为大写
    gU$ :从光标所在位置到行尾变为大写
  3. vundle 管理vim插件
  4. vim查看编译错误 :make 进行编译,需要在makefile所在的目录下打开文件 :cw 带开quickfix窗口 cn (next)下一条 cp (previous) 上一条 cw (显示warning) cc 显示错误 col 前一个旧的错误 勘误表 col 后一个旧的勘误表 cnew 后一个较新的错误列表 ( :help :cnew )