工作目录:

1.BIB文件:

<pre name="code" class="javascript">@BOOK{ML12,AUTHOR =       {Peter Harrington},TITLE =        {Machine Learning in Action},PUBLISHER =      {Manning Publications Co.},YEAR =         {2012}
}
@misc{ZUIJINLIN14,author = "",title = " 最近邻算法(维基百科)",month = "November",year = "2014",note =       "\begin{verbatim}http://zh.wikipedia.org/wiki/%E6%9C%80%E8%BF%91%E9%84%B0%E5%B1%85%E6%B3%95\end{verbatim}",
}
@misc{MASHIJULI13,author = "",title = "马氏距离(维基百科)",month = "March",year = "2013",note = "\begin{verbatim}http://zh.wikipedia.org/wiki/%E9%A9%AC%E6%B0%8F%E8%B7%9D%E7%A6%BB\end{verbatim}"
}
@misc{JULEI13,author = "kkc235",title = " 聚类(百度百科)",month = "December",year = "2013",note = "\begin{verbatim}http://baike.baidu.com/view/31801.htm\end{verbatim}"
}
@misc{COURSERA,author = "",title = "",month = "",year = "",note = "\begin{verbatim}https://www.coursera.org/course/ml\end{verbatim}"
}
@BOOK{MATH14,AUTHOR =       {吴军},TITLE =        {数学之美},PUBLISHER =      {人民邮电出版社},YEAR =         {2014}
}
@misc{SVD12,author = "aszxqw",title = "SVD在推荐系统中的应用",month = "November",year = "2012",note = "\begin{verbatim}http://blog.csdn.net/wuyanyi/article/details/7964883\end{verbatim}"
}
@misc{LONGXING10,author = "",title = "2010龙星计划机器学习视频教程",month = "",year = "2010",note = "\begin{verbatim}http://pan.baidu.com/share/link?shareid=3053312914&uk=2620399451\end{verbatim}"
}
@misc{GBDT12,author = "",title = "GBDT(MART) 迭代决策树入门教程 | 简介",month = "December",year = "2012",note = "\begin{verbatim}http://hi.baidu.com/hehehehello/item/96cc42e45c16e7265a2d64ee\end{verbatim}"
}
@misc{ANDREW,author = "Andrew Ng.",title = "Ng的cs229课程资料",month = "",year = "",note = "\begin{verbatim}http://cs229.stanford.edu/\end{verbatim}"
}
@misc{STANFU,author = "网易公开课",title = " 斯坦福大学公开课 :机器学习课程",month = "",year = "",note = "\begin{verbatim}http://v.163.com/special/opencourse/machinelearning.html\end{verbatim}"
}
@misc{FP11,author = "yfx416",title = " Frequent Pattern 挖掘之二(FP Growth算法)",month = "October",year = "2011",note = "\begin{verbatim}http://blog.sina.com.cn/s/blog_68ffc7a40100uebg.html\end{verbatim}"
}
@ARTICLE{FAN03,AUTHOR =       {X. Fan and C. Ellis and A. Lebeck},TITLE =        {The synergy between power-aware memory systems and processor voltage},JOURNAL =      {Workshop on Power-Aware Computing Systems},YEAR =         {2003},volume =       {},number =       {},pages =        {},
}

2.LaTeX源文件:

\documentclass[UTF8,twoside]{ctexart}\usepackage{mathtools}
\usepackage[CJKbookmarks=true,colorlinks,linkcolor=blue,anchorcolor=blue,citecolor=green]{hyperref}
\usepackage[top=2cm,bottom=2cm,left=1cm,right=3mm]{geometry}
\usepackage{graphicx}
\usepackage{enumerate}
\usepackage{titlesec}
\usepackage{titletoc}
\usepackage{bm}\usepackage{nameref}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{fancyhdr}\usepackage{lastpage}
\usepackage{everb}   % \colorboxed命令\newcommand{\HRule}{\rule{\linewidth}{0.5mm}}
\newcommand{\myFunc}{}
\newenvironment{myquote}{\begin{quote}\kaishu\zihao{4}}{\end{quote}}\titlecontents{section}[3cm]{\bf \large}%{\contentslabel{2.5em}}%{}%{\titlerule*[0.5pc]{$\cdot$}\contentspage\hspace*{3cm}}%
\titlecontents{subsection}[4cm]{\bf \normalsize}%{\contentslabel{2.5em}}%{}%{\titlerule*[0.5pc]{$\cdot$}\contentspage\hspace*{3cm}}%\begin{document}
\zihao{4}
\begin{titlepage}
\begin{center}
\includegraphics[width=0.3\textwidth]{logobupt}\\[1cm]
\textsc{\LARGE 北京大学}\\[1.5cm]
\HRule \\[0.4cm]
{ \huge \bfseries 机器学习之常见算法思想梳理 \\[0.4cm] }\HRule \\[1.5cm]
\noindent
\begin{minipage}{0.4\textwidth}
\begin{flushleft} \large
\emph{AUTHOR:}\\
\quad {\bf \href{http://www.cnblogs.com/tornadomeet}{tornadomeet}}\footnotemark
\end{flushleft}
\end{minipage}%
\begin{minipage}{0.4\textwidth}
\begin{flushright} \large
\emph{EDITOR:\;\;} \\
{\bf \href{http://blog.csdn.net/u012176591}{哈哈}}\footnotemark
\end{flushright}
\end{minipage}\vfill{\Large \today}
\end{center}
\footnotetext[1]{博客达人,其博客地址:\url{http://www.cnblogs.com/tornadomeet}}
\footnotetext[2]{北大计算机2014级硕士 吴玉音}}
\end{titlepage}
\setcounter{page}{1}
\pagenumbering{Roman}
\pagestyle{fancy}
\fancyhf{}  %清除以前对页眉页脚的设置
\fancyhead{}
\pagestyle{fancy}
\cfoot{\thepage}
\tableofcontents
\newpage
\setcounter{page}{1}
\pagestyle{fancy}
\pagenumbering{arabic}
\fancyhf{}  %清除以前对页眉页脚的设置
\pagestyle{fancy}
\fancyhead[RO,LE]{\bfseries 机器学习串串烧}
\fancyhead[LO,RE]{\bfseries BYR~金良}
\fancyfoot[C]{\thepage $\slash$ \pageref{LastPage}}
%\fancyfoot[LE,RO]{\chaptername}
\section{前言}
找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考虑该岗位,毕竟在机器智能没达到人类水平之前,机器学习可以作为一种重要手段,而随着科技的不断发展,相信这方面的人才需求也会越来越大。纵观IT行业的招聘岗位,机器学习之类的岗位还是挺少的,国内大点的公司里百度,阿里,腾讯,网易,搜狐,华为(华为的岗位基本都是随机分配,机器学习等岗位基本面向的是博士)等会有相关职位,另外一些国内的中小型企业和外企也会招一小部分。当然了,其中大部分还是百度北京要人最多,上百人。阿里的算法岗位很大一部分也是搞机器学习相关的。另外本人有幸签约了网易杭州研究院的深度学习算法岗位,打算从事机器学习领域至少5年。非常感谢小易收留了我!下面是本人在找机器学习岗位工作时,总结的常见机器学习算法(主要是一些常规分类器)大概流程和主要思想,希望对大家找机器学习岗位时有点帮助。实际上在面试过程中,懂这些算法的基本思想和大概流程是远远不够的,那些面试官往往问的都是一些公司内部业务中的课题,往往要求你不仅要懂得这些算法的理论过程,而且要非常熟悉怎样使用它,什么场合用它,算法的优缺点,以及调参经验等等。说白了,就是既要会点理论,也要会点应用,既要有点深度,也要有点广度,否则运气不好的话很容易就被刷掉,因为每个面试官爱好不同。
\section{朴素贝叶斯}
有以下几个地方需要注意:
\begin{itemize}\item 如果给出的特征向量长度可能不同,这是需要归一化为通长度的向量(这里以文本分类为例),比如说是句子单词的话,则长度为整个词汇量的长度,对应位置是该单词出现的次数。\item 计算公式如下:\\\begin{equation}p(c_i|{\bf w})=\frac{p({\bf w}|c_i)p(c_i)}{p({\bf w})}\end{equation}其中一项条件概率可以通过朴素贝叶斯条件独立展开。要注意一点就是$p({\bf w}|c_i)$的计算方法,而由朴素贝叶斯的前提假设可知,$p(w_0,w_1,w_2,\ldots,w_N|c_i)=p(w_0|c_i)p(w_1|c_i)p(w_2|c_i)\ldots p(w_N|c_i)$,因此一般有两种,一种是在类别为$c_i$的那些样本集中,找到$w_j$出现次数的总和,然后除以该样本的总和;第二种方法是类别为$c_i$的那些样本集中,找到$w_j$出现次数的总和,然后除以该样本中所有特征出现次数的总和。\item 如果$p({\bf w}|c_i)$中的某一项为$0$,则其联合概率的乘积也可能为$0$,即$2$中公式的分子为$0$,为了避免这种现象出现,一般情况下会将这一项初始化为$1$,当然为了保证概率相等,分母应对应初始化为$2$(这里因为是$2$类,所以加$2$,如果是$k$类就需要加$k$,术语上叫做{\bf $laplace$光滑}, 分母加$k$的原因是使之满足全概率公式)。
\end{itemize}
{\color{blue}\bf 朴素贝叶斯的优点}:
\begin{itemize}
\item 对小规模的数据表现很好,适合多分类任务,适合增量式训练。
\end{itemize}
{\color{blue}\bf 缺点}:
\begin{itemize}
\item 对输入数据的表达形式很敏感。
\end{itemize}
\section{决策树}
决策树中很重要的一点就是选择一个属性进行分枝,因此要注意一下信息增益的计算公式,并深入理解它。\par
信息熵的计算公式如下:
\begin{equation}
H=-\sum_{i=1}^{n}p(x_i)log_2(p(x_i))
\end{equation}
其中的$n$代表有$n$个分类类别(比如假设是$2$类问题,那么$n=2$)。分别计算这$2$类样本在总样本中出现的概率$p_1$和$p_2$,这样就可以计算出未选中属性分枝前的信息熵。
\par
现在选中一个属性$x_i$用来进行分枝,此时分枝规则是:如果$x_i=v_x$的话,将样本分到树的一个分支;如果不相等则进入另一个分支。很显然,分支中的样本很有可能包括$2$ 个类别,分别计算这$2$个分支的熵$H_1$和$H_2$,计算出分枝后的总信息熵$H’=p_1H_1+p_2H_2$,则此时的信息增益$\Delta H=H-H'$。以信息增益为原则,把所有的属性都测试一边,选择一个使增益最大的属性作为本次分枝属性。\\
{\color{blue}\bf 决策树的优点}:
\begin{itemize}
\item 计算量简单,可解释性强,比较适合处理有缺失属性值的样本,能够处理不相关的特征;
\end{itemize}
{\color{blue}\bf 缺点}:
\begin{itemize}
\item 容易过拟合(后续出现了随机森林,减小了过拟合现象);
\end{itemize}
\section{Logistic回归}
\renewcommand{\myFunc}{$Logistic$\;}
\myFunc 是用来分类的,是一种线性分类器,需要注意的地方有:\\
\begin{itemize}
\item \myFunc 函数表达式为:
\begin{equation}
h_{\theta}({\bf x})=g({\bf \theta}^T {\bf x})=\frac{1}{1+\exp{(-{\bf \theta}^T {\bf x})}},{\textrm where\; } g(z)=\frac{1}{1+\exp(-z)}
\end{equation}
其导数形式为:
\begin{equation}
\begin{split}g'(z)&= \frac{\mathrm d}{\mathrm d x} \frac{1}{1+\exp(-z)}\\&= \frac{1}{\left(1+\exp(-z)\right)^2}\left(\exp(-z)\right)\\&= \frac{1}{1+\exp(-z)}\left( 1-\frac{1}{1+\exp(-z)}\right)\\&= g(z)(1-g(z))
\end{split}
\end{equation}
\item \myFunc 回归方法主要是用最大似然估计来学习的,所以单个样本的后验概率为:
\begin{equation}
p(y|x;\theta)=\left(h_{\theta}(x)\right)^y\left(1-h_{\theta}(x)\right)^{1-y}
\end{equation}
到整个样本的后验概率:
\begin{equation}
\begin{split}L(\theta)   &=p(\vec{y}|\bf{X};\theta)\\&=\prod_{i=1}^{m}p\left(y^{(i)}|x^{(i)};\theta\right)\\&=\prod_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)\right)^{y^{(i)}}\left(h_{\theta}\left(x^{(i)}\right)\right)^{1-y^{(i)}}
\end{split}
\end{equation}
其中:
\begin{equation}
\begin{split}
P(y=1|x;\theta)&=h_{\theta}(x)\\
P(y=1|x;\theta)&=1-h_{\theta}(x)
\end{split}
\end{equation}
通过对数进一步化简为:
\begin{equation}
\begin{split}\ell(\theta)  &= \log L(\theta)\\&=\sum_{i=1}^{m}y^{(i)}\log h\left(x^{(i)}\right)+\left(1-y^{(i)}\right)\log \left(1-h\left(x^{(i)}\right)\right)
\end{split}
\end{equation}
\item 其实它的${\mathrm loss\; function}$为$-\ell(\theta)$,因此我们需使${\mathrm loss\; function}$最小,可采用梯度下降法得到。梯度下降法公式为:
\begin{equation}
\begin{split}
\frac{{\mathrm \partial}}{{\mathrm \partial\theta_{j}}}\ell(\theta) &=\left(y-\frac{1}{g\left(\theta^{T}{\bf x}\right)}-(1-y)\frac{1}{1-g\left(\theta^T{\bf x}\right)}\right)\frac{\partial}{\partial \theta_j}g\left(\theta^T{\bf x}\right)\\
&=\left(y-\frac{1}{g\left(\theta^{T}{\bf x}\right)}-(1-y)\frac{1}{1-g\left(\theta^T{\bf x}\right)}\right)g(\theta^T{\bf x})\left(1-g(\theta^T{\bf x})\right)\frac{\partial}{\partial \theta_j}\\
&=\left(y\left(1-g(\theta^T{\bf x})\right)-\left(1-y\right)g\left(\theta^T{\bf x}\right)\right)x_j\\
&=\left(y-h_{\theta}\left(x\right)\right)x_j\\
\theta_j&:=\theta_j+\alpha\left(y^{(i)}-h_{\theta}\left(x^{(i)}\right)\right)x_j^{(i)}
\end{split}
\end{equation}
\end{itemize}
{\color{blue}\bf Logistic回归优点}:
\begin{itemize}
\item 实现简单;
\item 分类时计算量非常小,速度很快,存储资源低;
\end{itemize}
{\color{blue}\bf 缺点}:
\begin{itemize}
\item 容易欠拟合,一般准确度不太高
\item 只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分;
\end{itemize}\section{线性回归}
线性回归才是真正用于回归的,而不像$Logistic$\;回归是用于分类,其基本思想是用梯度下降法对最小二乘法形式的误差函数进行优化,当然也可以用$normal\;equation$直接求得参数的解,结果为:
\begin{equation}
\hat{{\bf w}}=\left({\bf X}^T{\bf X}\right)^{-1}{\bf X}^T{\bf y}
\end{equation}
\par 而在${\mathrm LWLR}$(局部加权线性回归)中,参数的计算表达式为:
\begin{equation}
\hat{{\bf w}}=\left({\bf X}^T{\bf W}{\bf X}\right)^{-1}{\bf X}^T{\bf W}{\bf y}
\end{equation}
\par 因为此时优化的是:
\begin{itemize}\item {\text Fit} $\theta$ {\text to minimize} $\sum_i w^{(i)}\left(y^{(i)}-\theta^Tx^{(i)}\right)^2$\item {\text Output} $\theta^Tx$
\end{itemize}
\par 由此可见LWLR与LR不同,LWLR是一个非参数模型,因为每次进行回归计算都要遍历训练样本至少一次。\\
{\bf 线性回归优点}:
\begin{itemize}
\item 实现简单,计算简单;
\end{itemize}
{\bf 缺点}:
\begin{itemize}
\item 不能拟合非线性数据;\\
\end{itemize}
\section{KNN算法}
KNN即最近邻算法,其主要过程为:
\begin{enumerate}\item 计算训练样本和测试样本中每个样本点的距离(常见的距离度量有欧式距离,马氏距离等);\item 对上面所有的距离值进行排序;\item 选前$k$个最小距离的样本;\item 根据这$k$个样本的标签进行投票,得到最后的分类类别;
\end{enumerate}
\par 如何选择一个最佳的$K$值,这取决于数据。一般情况下,在分类时较大的$K$值能够减小噪声的影响。但会使类别之间的界限变得模糊。一个较好的$K$值可通过各种启发式技术来获取,比如,交叉验证。另外噪声和非相关性特征向量的存在会使$K$近邻算法的准确性减小。
\par 近邻算法具有较强的一致性结果。随着数据趋于无限,算法保证错误率不会超过贝叶斯算法错误率的两倍。对于一些好的$K$值,$K$近邻保证错误率不会超过贝叶斯理论误差率。
\par {\color{red}注:}马氏距离一定要先给出样本集的统计性质,比如均值向量,协方差矩阵等。关于马氏距离的介绍,这里引用维基百科的内容
\footnote{http://zh.wikipedia.org/wiki/\%E9\%A9\%AC\%E6\%B0\%8F\%E8\%B7\%9D\%E7\%A6\%BB} 如下:\\
%\noindent \includegraphics[width=1.0\textwidth]{mashijuli}\\[1cm]
\begin{center}
\begin{colorboxed}
\begin{myquote}\indent {\bf 馬氏距離}是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示数据的协方差距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的)并且是尺度无关的(scale-invariant),即独立于测量尺度。 对于一个均值为$\mu=\left(\mu_1,\mu_2,\mu_3,\cdots,\mu_p\right)^T$,协方差矩阵为$\Sigma$的多变量向量$x=\left(x_1,x_2,x_3,\cdots,x_p\right)^T$,其马氏距离为:$$D_M(x)=\sqrt{\left(x-\mu\right)^T\Sigma^{-1}\left(x-\mu\right)}$${\bf 马氏距离}也可以定义为两个服从同一分布并且其协方差矩阵为$\Sigma $的随机变量 $\vec{x}$与 $\vec{y}$的差异程度:$$d\left(\vec{x},\vec{y}\right)=\sqrt{\left(\vec{x}-\vec{y}\right)^T\Sigma^{-1}\left(\vec{x}-\vec{y}\right)}$$\quad 如果协方差矩阵为单位矩阵,马氏距离就简化为欧氏距离;如果协方差矩阵为对角阵,其也可称为正规化的欧氏距离。$$d\left(\vec{x},\vec{y}\right)=\sqrt{\Sigma_{i=1}^{p}\frac{\left(x_i-y_i\right)^2}{\sigma_i^2}}$$其中$\sigma_i$是$x_i$的标准差。
\end{myquote}
\end{colorboxed}
\end{center}
{\color{blue} \bf KNN算法的优点}:
\begin{itemize}
\item 思想简单,理论成熟,既可以用来做分类也可以用来做回归;
\item 可用于非线性分类;
\item 训练时间复杂度为$O(n)$;
\item 准确度高,对数据没有假设,对outlier不敏感;
\end{itemize}
{\color{blue} \bf 缺点}:
\begin{itemize}
\item 计算量大;
\item 样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
\item 需要大量的内存;
\end{itemize}\section{SVM}
要学会如何使用libsvm以及一些参数的调节经验,另外需要理清楚svm算法的一些思路:
\begin{enumerate}
\item svm\;中的最优分类面是对所有样本的几何裕量最大(为什么要选择最大间隔分类器,请从数学角度上说明?网易深度学习岗位面试过程中有被问到。答案就是几何间隔与样本的误分次数间存在关系:\mbox{误分次数} $ \leq \left(\frac{2R}{\sigma}\right)^2$,其中的分母就是样本到分类间隔距离,分子中的R是所有样本中的最长向量值),即:
\begin{equation}
\begin{split}
\max {}_{{\bm \gamma,\omega,b}} \; \gamma  &\\
\qquad  s.t. \quad & {\bf y}^{(i)}\left({\bf \omega}^{T}{\bf x}^{(i)}+{\bf b}\right)\geq \gamma, i=1,\cdots,m\\
&\parallel\negthickspace {\bm \omega} \negthickspace\parallel = 1
\end{split}
\end{equation}
\par 经过一系列推导可得为优化下面原始目标:
\begin{equation}\label{equ:svm1}\begin{split}\min {}_{{\bf \gamma,\omega,b}}& \;\frac{1}{2}{\parallel\negthickspace {\bf \omega} \negthickspace\parallel }^2\\s.t.&\quad {\bf y}^{(i)}\left({\bf \omega}^{T}{\bf x}^{(i)}+{\bf b}\right)\geq \gamma, i=1,\cdots,m\end{split}
\end{equation}
\item 下面来看看拉格朗日理论:\\
\begin{equation}\begin{split}\min{}_{\omega}\quad &f\left(\omega\right)\\s.t.&\;g_i\left(\omega\right)\leq 0,i=1,\cdots,k\\&\;h_i\left(\omega\right)=0,i=1,\cdots,l\end{split}
\end{equation}
\par 为了解决该问题,我们定义如下的拉格朗日一般形式
\begin{equation}\begin{split}\mathcal{L}\left(\omega,b,\alpha\right)=f\left(\omega\right)+\sum_{i=1}{k}\alpha_ig_i\left(\omega\right)+\sum_{i=1}{l}\beta_ih_i\left(\omega\right)\end{split}
\end{equation}
%\noindent \includegraphics[width=1.0\textwidth]{lagran}\\
可以将\eqref{equ:svm1}中的优化目标转换为拉格朗日的形式(通过各种对偶优化,KKD条件),最后目标函数为:
\begin{equation}\label{equ:svm2}\mathcal{L} \left(\omega,b,\alpha\right)=\frac{1}{2}{\parallel\negthickspace {\bf \omega} \negthickspace\parallel }^2-\sum_{i=1}^{m}\alpha_i\left[y^{(i)}\left(\omega^Tx^{(i)}+{\bf b}\right)-1\right]
\end{equation}
我们只需要最小化上述目标函数,其中的$\alpha$为原始优化问题中的不等式约束拉格朗日系数。
\item 对\eqref{equ:svm2}中最后的式子分别$\omega$和$b$求导可得:
\begin{equation}\begin{split}\omega&=\sum_{i=1}^{m}\alpha_iy^{(i)}x^{(i)}\\\frac{\partial}{\partial b}\mathcal{L}\left(\omega,b,\alpha\right) &= \sum_{i=1}^{m}\alpha_{i}y^{(i)}=0\end{split}
\end{equation}
由上面第1式子可以知道,如果我们优化出了$\alpha$,则直接可以求出$\omega$了,即模型的参数搞定。而上面第2个式子可以作为后续优化的一个约束条件。
\item 对\eqref{equ:svm2}中最后一个目标函数用对偶优化理论可以转换为优化下面的目标函数:
\begin{equation}\begin{split}\max {}_{\alpha}\quad  {\bf W}(\alpha) &= \sum_{i=1}^{m}\alpha_i-\frac{1}{2}\sum_{i,j=1}^my^{(i)}y^{(j)}\alpha_i\alpha_j\langle x^{(i)},y^{(j)} \rangle\\s.t.\quad  &\alpha_i \geq 0,i=1,\cdots,m\\&\sum_{i=1}^{m}\alpha_iy^{(i)}=0\end{split}
\end{equation}
而这个函数可以用常用的优化方法求得$\alpha$,进而求得$\omega$和{\bf b}。
\item 按照道理,svm简单理论应该到此结束。不过还是要补充一点,即在预测时有:
\begin{equation}\begin{split}\omega^Tx+b&=\left(\sum_{i=1}^m\alpha_iy^{(i)}x^{(i)}\right)^Tx+b\\&=\sum_{i=1}^{m}\alpha_iy^{(i)}\langle x^{(i)},x\rangle+b\end{split}
\end{equation}
那个尖括号我们可以用核函数代替,这也是svm经常和核函数扯在一起的原因。
\item 最后是关于松弛变量的引入,因此原始的目标优化公式为:
\begin{equation}\begin{split}\min {}_{\gamma,\omega,b}\;&\frac{1}{2}{\parallel\negthickspace {\bf \omega} \negthickspace\parallel }^2+C\sum_{i=1}{m}\xi_i\\s.t.\;&y^{(i)}\left(\omega^Tx^{(i)}+b\right)\geq 1-\xi_i,i=1,\cdots,m\\&xi_i \geq 0,i=1,\cdots,m\end{split}
\end{equation}
此时对应的对偶优化公式为:
\begin{equation}\begin{split}\max {}_{\alpha}\; &W\left(\alpha\right)=\sum_{i=1}^m\alpha_i-\frac{1}{2}\sum_{i,j=1}^{m}y^{(i)}y^{(j)}\alpha_i\alpha_j\langle x^{(i)},x^{(j)}\rangle \\s.t.\quad &0\leq \alpha_i \leq C,i=1,\cdots,m\\&\sum_{i=1}^{m}\alpha_iy^{(i)}=0\end{split}
\end{equation}
与前面的相比只是$\alpha$多了个上界。
\end{enumerate}
{\color{blue}SVM算法优点}:
\begin{itemize}\item 可用于线性/非线性分类,也可以用于回归;\item 低泛化误差;\item 容易解释;\item 计算复杂度较低;
\end{itemize}
{\color{blue}缺点}:
\begin{itemize}\item 对参数和核函数的选择比较敏感;\item 原始的SVM只比较擅长处理二分类问题;
\end{itemize}
\section{Boosting}
\renewcommand{\myFunc}{\;Adaboost\;}
主要以\myFunc 为例,首先来看看\myFunc 的流程图,如图$\left(\ref{fig:Adaboost}\right)$所示:\\
\begin{figure}[!ht]\centering\includegraphics[width=0.5\textwidth]{Adaboost.png}\caption{Adaboost的流程图}\label{fig:Adaboost}
\end{figure}
\par 从图$\left(\ref{fig:Adaboost}\right)$中可以看到,在训练过程中我们需要训练出多个弱分类器(图中为3个),每个弱分类器是由不同权重的样本(图中为5个训练样本)训练得到(其中第一个弱分类器对应输入样本的权值是一样的),而每个弱分类器对最终分类结果的作用也不同,是通过加权平均输出的,权值见上图中三角形里面的数值。那么这些弱分类器和其对应的权值是怎样训练出来的呢?
\par 下面通过一个例子来简单说明。
\par 书中(machine learning in action)假设的是5个训练样本,每个训练样本的维度为2,在训练第一个分类器时5个样本的权重各为0.2. 注意这里样本的权值和最终训练的弱分类器组对应的权值$\alpha$是不同的,样本的权重只在训练过程中用到,而$\alpha$在训练过程和测试过程都有用到。
\par 现在假设弱分类器是带一个节点的简单决策树,该决策树会选择2个属性(假设只有2个属性)的一个,然后计算出这个属性中的最佳值用来分类。
\par \myFunc 的简单版本训练过程如下:
\begin{enumerate}\item 训练第一个分类器,样本的权值D为相同的均值。通过一个弱分类器,得到这5个样本(请对应书中的例子来看,依旧是machine learning in action)的分类预测标签。与给出的样本真实标签对比,就可能出现误差(即错误)。如果某个样本预测错误,则它对应的错误值为该样本的权重,如果分类正确,则错误值为0. 最后累加5个样本的错误率之和,记为$\varepsilon$ 。\item 通过$\varepsilon$ 来计算该弱分类器的权重$\alpha$ ,公式如下:\begin{equation}\alpha=\frac{1}{2}\ln\left(\frac{1-\varepsilon}{\varepsilon}\right)\end{equation}\item 通过$\alpha$ 来计算训练下一个弱分类器样本的权重$ D $,如果对应样本分类正确,则减小该样本的权重,公式为:\begin{equation}D_i^{(t+1)}=\frac{D_i^{(t)}e^{-\alpha}}{Sum(D)}\end{equation}如果样本分类错误,则增加该样本的权重,公式为:\begin{equation}D_i^{(t+1)}=\frac{D_i^{(t)}e^{\alpha}}{Sum(D)}\end{equation}\item 循环步骤1,2,3来继续训练多个分类器,只是其$ D $值不同而已。\\测试过程如下:\\输入一个样本到训练好的每个弱分类中,则每个弱分类都对应一个输出标签,然后该标签乘以对应的$\alpha$,最后求和得到值的符号即为预测标签值。
\end{enumerate}
{\color{blue}Boosting算法的优点}:
\begin{itemize}\item 低泛化误差;\item 容易实现,分类准确率较高,没有太多参数可以调;
\end{itemize}
{\color{blue}缺点}:
\begin{itemize}\item 对outlier比较敏感;
\end{itemize}
\section{聚类}
根据聚类思想划分:
\begin{enumerate}\item 基于划分的聚类:\\K-means, k-medoids(每一个类别中找一个样本点来代表),CLARANS.\\k-means是使下面的表达式值最小:\begin{equation}V=\sum_{i=1}^{k}\sum_{x_j\in S_i}\left(x_j-\mu_i\right)^2\end{equation}{\color{blue}k-means算法的优点}:\begin{itemize}\item k-means算法是解决聚类问题的一种经典算法,算法简单、快速。\item 对处理大数据集,该算法是相对可伸缩的和高效率的,因为它的复杂度大约是$O(nkt)$,其中$n$是所有对象的数目,$k$是簇的数目,$t$ 是迭代的次数。通常$k\ll n$。这个算法通常局部收敛。\item 算法尝试找出使平方误差函数值最小的$k$个划分。当簇是密集的、球状或团状的,且簇与簇之间区别明显时,聚类效果较好。\end{itemize}{\color{blue}缺点}:\begin{itemize}\item $k-$平均方法只有在簇的平均值被定义的情况下才能使用,且对有些分类属性的数据不适合。\item 要求用户必须事先给出要生成的簇的数目$k$。\item 对初值敏感,对于不同的初始值,可能会导致不同的聚类结果。\item 不适合于发现非凸面形状的簇,或者大小差别很大的簇。\item 对于``噪声"和孤立点数据敏感,少量的该类数据能够对平均值产生极大影响。\end{itemize}\item 基于层次的聚类:\\ 自底向上的凝聚方法,比如AGNES。\\ 自上向下的分裂方法,比如DIANA。\item 基于密度的聚类:\\ DBSACN,OPTICS,BIRCH(CF-Tree),CURE.\item 基于网格的方法:\\ STING, WaveCluster.\item 基于模型的聚类:\\ EM,SOM,COBWEB.
\end{enumerate}
\par 以上这些算法的简介可参考\href{http://baike.baidu.com/view/31801.htm}{聚类(百度百科)}。
\section{推荐系统}
\par 推荐系统的实现主要分为两个方面:基于内容的实现和协同滤波的实现。
\begin{enumerate}
\item 基于内容的实现:
\par 不同人对不同电影的评分这个例子,可以看做是一个普通的回归问题,因此每部电影都需要提前提取出一个特征向量(即x值),然后针对每个用户建模,即每个用户打的分值作为y值,利用这些已有的分值y和电影特征值x就可以训练回归模型了(最常见的就是线性回归)。这样就可以预测那些用户没有评分的电影的分数。(值得注意的是需对每个用户都建立他自己的回归模型)
\par 从另一个角度来看,也可以是先给定每个用户对某种电影的喜好程度(即权值),然后学出每部电影的特征,最后采用回归来预测那些没有被评分的电影。
\par 当然还可以是同时优化得到每个用户对不同类型电影的热爱程度以及每部电影的特征。具体可以参考\href{https://www.coursera.org/course/ml}{Ng在coursera 上的ml教程}\footnote{https://www.coursera.org/course/ml}:
\item 基于协同滤波的实现:
\par 协同滤波(CF)可以看做是一个分类问题,也可以看做是矩阵分解问题。协同滤波主要是基于每个人自己的喜好都类似这一特征,它不依赖于个人的基本信息。比如刚刚那个电影评分的例子中,预测那些没有被评分的电影的分数只依赖于已经打分的那些分数,并不需要去学习那些电影的特征。
\end{enumerate}
\par SVD将矩阵分解为三个矩阵的乘积,公式如下所示:
\begin{equation}Data_{m\times n} = U_{m\times m}\Sigma_{m\times n}V_{n\times n}^T
\end{equation}
\par 中间的矩阵$\Sigma$为对角矩阵,对角元素的值为Data矩阵的奇异值(注意奇异值和特征值是不同的),且已经从大到小排列好了。即使去掉特征值小的那些特征,依然可以很好的重构出原始矩阵。如图$\left(\ref{fig:recommendation}\right)$所示:
\begin{figure}[!ht]\centering\includegraphics[width=0.6\textwidth]{recommendation.png}\caption{SVD矩阵分解示意图}\label{fig:recommendation}
\end{figure}
\par 其中更深的颜色代表去掉小特征值重构时的三个矩阵。
\par m代表商品的个数,n代表用户的个数,则U矩阵的每一行代表商品的属性,现在通过降维U矩阵(取深色部分)后,每一个商品的属性可以用更低的维度表示(假设为k 维)。这样当新来一个用户的商品推荐向量X,则可以根据公式$X'q\times U1\times {\textrm inv}(S1)$得到一个k维的向量,然后在$V’$中寻找最相似的那一个用户(相似度测量可用余弦公式等),根据这个用户的评分来推荐(主要是推荐新用户未打分的那些商品)。具体例子可以参考网页:\href{http://blog.csdn.net/wuyanyi/article/details/7964883}{SVD在推荐系统中的应用}。
\par 另外关于SVD分解后每个矩阵的实际含义可以参考google吴军的《数学之美》一书(不过个人感觉吴军解释UV两个矩阵时好像弄反了,不知道大家怎样认为)。或者参考《machine learning in action》其中的svd章节。
\section{pLSA}
\par pLSA由LSA发展过来,而早期LSA的实现主要是通过SVD分解。pLSA的模型图如图$\left(\ref{fig:pLSA}\right)$所示::
\begin{figure}[!ht]\centering\includegraphics[width=0.5\textwidth]{pLSA.png}\caption{pLSA模型示意图}\label{fig:pLSA}
\end{figure}
\par 公式中的意义如下:
\begin{enumerate}\item 以$P\left(d_i\right)$的概率选中文档$d_i$;\item 以$P\left(z_k|d_i\right)$的概率选中主题$z_k$;\item 以$P\left(\omega_j|z_k\right)$的概率产生一个单词$d_i$;
\end{enumerate}
\par 我们可以观察到的数据就是$\left(d_i,\omega_j\right)$对,而$z_k$是隐含变量,$\left(d_i,\omega_j\right)$的联合分布为
\begin{equation}
P\left(d_i,\omega_j\right)=P\left(d_i\right)P\left(\omega_j|d_i\right),P\left(\omega_j|d_i\right)=\sum_{k=1}^{K}P\left(\omega_j|z_k\right)P\left(z_k|d_i\right)
\end{equation}
\par 具体可以参考\href{http://bcmi.sjtu.edu.cn/ds/download.html}{2010龙星计划:机器学习中对应的主题模型那一讲}。
\section{LDA}
\par 主题模型,如图$\left(\ref{fig:LDA}\right)$所示:
\begin{figure}[!ht]
\centering
\includegraphics[width=0.5\textwidth]{LDA.jpg}
\caption{概率图}
\label{fig:LDA}
\end{figure}
\par 和\;pLSA\;不同的是\;LDA\;中假设了很多先验分布,且一般参数的先验分布都假设为\;Dirichlet\;分布,其原因是共轭分布时先验概率和后验概率的形式相同。
\section{GDBT}
\par \;GBDT(Gradient Boosting Decision Tree)\; 又叫 \;MART(Multiple Additive Regression Tree)\;,好像在阿里内部用得比较多(所以阿里算法岗位面试时可能会问到),它是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的输出结果累加起来就是最终答案。它在被提出之初就和SVM一起被认为是泛化能力\;(generalization)\;较强的算法。近些年更因为被用于搜索排序的机器学习模型而引起大家关注。
\par \;GBDT\;是回归树,不是分类树。其核心就在于,每一棵树是从之前所有树的残差中来学习的。为了防止过拟合,和\;Adaboosting\;一样,也加入了\;boosting\; 这一项。
\par 关于\;GDBT\; 的介绍可以可以参考:\href{http://hi.baidu.com/hehehehello/item/96cc42e45c16e7265a2d64ee}{GBDT(MART) 迭代决策树入门教程|简介}。
\section{Regularization}
\par 作用是(网易电话面试时有问到):
\begin{enumerate}\item 数值上更容易求解;\item 特征数目太大时更稳定;\item 控制模型的复杂度,光滑性。复杂性越小且越光滑的目标函数泛化能力越强。而加入规则项能使目标函数复杂度减小,且更光滑。\item 减小参数空间;参数空间越小,复杂度越低。\item 系数越小,模型越简单,而模型越简单则泛化能力越强(Ng宏观上给出的解释)。\item 可以看出是权值的高斯先验。
\end{enumerate}
\section{异常检测}
\par 可以估计样本的密度函数,对于新样本直接计算其密度,如果密度值小于某一阈值,则表示该样本异常。而密度函数一般采用多维的高斯分布。如果样本有n维,则每一维的特征都可以看作是符合高斯分布的,即使这些特征可视化出来不太符合高斯分布,也可以对该特征进行数学转换让其看起来像高斯分布,比如说$x=\log(x+c),x=x^{(\frac{1}{c})}$等。异常检测的算法流程如下:\\[2mm]
{\bf Anomaly detection algorithm}\\
\begin{enumerate}\item {\bf Choose features that you think might be indicative of anomalous examples.}\item {\bf Fit parameters} $\mu_1,\cdots,\mu_n,\sigma_1^2,\cdots,\sigma_n^2$\begin{equation}\begin{split}\mu_j&=\frac{1}{m}\sum_{i=1}^{m}x_j^{(i)}\\\sigma_j^2&=\frac{1}{m}\sum_{i=1}^{m}\left(x_j^{(i)}-\mu_j\right)^2\end{split}\end{equation}\item {\bf Given new example} ${\bf x}$,{\bf compute }$p(x)$:\begin{equation}\begin{split}p(x)=\prod_{j=1}^{n}p\left(x_j;\mu_j,\sigma_j^2\right)=\prod_{j=1}^{n}\frac{1}{\sqrt{2\pi}\sigma_j}\exp\left(-\frac{\left(x_j-\mu_j\right)^2}{2\sigma_j^2}\right)\\{\bf Anomaly \; if\; } p\left(x\right) < \varepsilon\end{split}\end{equation}
\end{enumerate}
\par 其中的$\varepsilon$ 也是通过交叉验证得到的,也就是说在进行异常检测时,前面的p(x)的学习是用的无监督,后面的参数$\varepsilon$学习是用的有监督。那么为什么不全部使用普通有监督的方法来学习呢(即把它看做是一个普通的二分类问题)?主要是因为在异常检测中,异常的样本数量非常少而正常样本数量非常多,因此不足以学习到好的异常行为模型的参数,因为后面新来的异常样本可能完全是与训练样本中的模式不同。
\par 另外,上面是将特征的每一维看成是相互独立的高斯分布,其实这样的近似并不是最好的,但是它的计算量较小,因此也常被使用。更好的方法应该是将特征拟合成多维高斯分布,这时有特征之间的相关性,但随之计算量会变复杂,且样本的协方差矩阵还可能出现不可逆的情况(主要在样本数比特征数小,或者样本特征维数之间有线性关系时)。
\par 上面的内容可以参考Ng的{\color{blue}https://www.coursera.org/course/ml}
\section{EM算法}
\par 有时候因为样本的产生和隐含变量有关(隐含变量是不能观察的),而求模型的参数时一般采用最大似然估计,由于含有了隐含变量,所以对似然函数参数求导是求不出来的,这时可以采用EM算法来求模型的参数的(对应模型参数个数可能有多个),EM算法一般分为2步:
\begin{itemize}
\item E步:选取一组参数,求出在该参数下隐含变量的条件概率值;
\item M步:结合E步求出的隐含变量条件概率,求出似然函数下界函数(本质上是某个期望函数)的最大值。
\end{itemize}
\par 重复上面2步直至收敛。
\par 公式如下所示:
\begin{equation}\begin{split}{\mathrm {(E\negthickspace-\negthickspace step)\quad For\; each\; }}i ,&{\mathrm set}\\&Q_i\left(z^{(i)}\right):=p\left(z^{(i)}|x^{(i)};\theta\right)\\\mathrm{(M\negthickspace-\negthickspace step)}\quad \mathrm{Set}\qquad\quad&\\&\theta := \arg\max_\theta\sum_i\sum_{z^{(i)}}\log \frac{p\left(x^{(i)},z^{(i)};\theta\right)}{Q_i\left(z^{(i)}\right)}\end{split}
\end{equation}
\par M步公式中下界函数的推导过程:
\begin{equation}\begin{split}\sum_i\log p\left(x^{(i)};\theta\right)&=\sum_i\log\sum_{z^{(i)}}p\left(x^{(i)},z^{(i)};\theta\right)\\&=\sum_i\log\sum_{z^{(i)}}Q_i\left(z^{(i)}\right)\frac{p\left(x^{(i)},z^{(i)};\theta\right)}{Q_i\left(z^{(i)}\right)}\\&\geq \sum_i\sum_{z^{(i)}}Q_i\left(z^{(i)}\right)\log \frac{p\left(x^{(i)},z^{(i)};\theta\right)}{Q_i\left(z^{(i)}\right)}\end{split}
\end{equation}
\par EM算法一个常见的例子就是GMM模型,每个样本都有可能由k个高斯产生,只不过由每个高斯产生的概率不同而已,因此每个样本都有对应的高斯分布(k个中的某一个),此时的隐含变量就是每个样本对应的某个高斯分布。
\par GMM的E步公式如下(计算每个样本对应每个高斯的概率):
\begin{equation}\begin{split}{\textrm (E\negthickspace-\negthickspace step)For\;each\;}&i,j,{\textrm \;set}\\&\omega_j^{(i)}:=p\left(z^{(i)}=j|x^{(i)};\phi,\mu,\Sigma\right)\end{split}
\end{equation}
\par 更具体的计算公式为:
\begin{equation}p\left(z^{(i)}=j|x^{(i)};\phi,\mu,\Sigma\right)=\frac{p\left(x^{(i)}|z^{(i)}=j;\mu,\Sigma\right)p\left(z^{(i)}=j;\phi\right)}{\sum_{l=1}^{k}p\left(x^{(i)}|z^{(i)}=l;\mu,\Sigma\right)p\left(z^{(i)}=l;\phi\right)}
\end{equation}
\par M步公式如下(计算每个高斯的比重,均值,方差这3个参数):
\begin{equation}
\begin{split}{\mathrm (M\negthickspace-\negthickspace step)\;}&{\mathrm Update\;the\;parameters: }\\&\phi_j:=\frac{1}{m}\sum_{i=1}^{m}\omega_j^{(i)},\\&\mu_j:= \frac{\sum_{i=1}^{m}\omega_j^{(i)}x^{(i)}}{\sum_{i=1}^{m}\omega_j^{(i)}},\\&\Sigma_j:=\frac{\sum_{i=1}^{m}\omega_j^{(i)}\left(x^{(i)}-\mu_j\right)\left(x^{(i)}-\mu_j\right)^T}{\sum_{i=1}^{m}\omega_j^{(i)}}
\end{split}
\end{equation}
\par 关于EM算法可以参考Ng的\href{http://cs229.stanford.edu/}{cs229课程资料} 或者网易公开课:\href{http://v.163.com/special/opencourse/machinelearning.html}{斯坦福大学公开课 :机器学习课程}。
\section{Apriori}
\par Apriori是关联分析中比较早的一种方法,主要用来挖掘那些频繁项集合。其思想是:
\begin{enumerate}
\item 如果一个项目集合不是频繁集合,那么任何包含它的项目集合也一定不是频繁集合;
\item 如果一个项目集合是频繁集合,那么它的任何非空子集也是频繁集合;
\end{enumerate}
\par Aprioir需要扫描项目表多遍,从一个项目开始扫描,舍去掉那些不是频繁的项目,得到的集合称为L,然后对L中的每个元素进行自组合,生成比上次扫描多一个项目的集合,该集合称为C,接着又扫描去掉那些非频繁的项目,重复…
\par 看下面这个例子:
\par 元素项目表格如表$\left(\ref{tab:xiangmuyuansu}\right)$所示。
\begin{table}\centering\Large  %表内的字体大小\caption{A simple list of transactions from a natural foods grocery store called Hole Foods}\label{tab:xiangmuyuansu}\begin{tabular}{c|l}\hlineTransaction number&items\\\hline0&soy milk,lettuce\\1&lettuce,diapers,wine,chard\\2&soy milk,diapers,wine,orange juice\\3&lettuce,soy milk,diapers,wine\\4&lettuce,soy milk,diapers,orange juice\\\hline\end{tabular}
\end{table}
\par 如果每个步骤不去掉非频繁项目集,则其扫描过程的树形结构如图$\left(\ref{fig:Aprioir_2}\right)$所示。
\begin{figure}[!ht]\centering\includegraphics[width=0.5\textwidth]{Apriorior_2.png}\caption{树形结构}\label{fig:Aprioir_2}
\end{figure}
\par 在其中某个过程中,可能出现非频繁的项目集,将其去掉(用阴影表示),如图$\left(\ref{fig:Aprioir_3}\right)$所示。
\begin{figure}[!ht]
\centering
\includegraphics[width=0.5\textwidth]{Apriorior_3.png}
\caption{非频繁的项目集示意图}
\label{fig:Aprioir_3}
\end{figure}
\par 上面的内容主要参考的是《Machine Learning in Action》这本书。
\section{FP Growth}
\par FP Growth\;是一种比\;Apriori\;更高效的频繁项挖掘方法,它只需要扫描项目表2次。其中第1次扫描获得当个项目的频率,去掉不符合支持度要求的项,并对剩下的项排序。第2遍扫描是建立一颗\;FP-Tree(frequent-patten tree)\;。
\par 接下来的工作就是在FP-Tree上进行挖掘。
\par 比如说有如表$\left(\ref{tab:FPxiangmu}\right)$所示的表:
\begin{table}\centering\Large  %表内的字体大小\caption{项目表}\label{tab:FPxiangmu}\begin{tabular}{lcc}\hlineTID&Items bought&(Ordered)frequent items\\\hline100&f,a,c,d,g,i,m,p&f,c,a,m,p\\200&a,b,c,f,l,m,o&f,c,a,b,m\\300&b,f,h,j,o&f,b\\400&b,c,k,s,p&c,b,p\\500&a,f,c,e,l,p,m,n&f,c,a,m,p\\\hline\end{tabular}
\end{table}
\par 它所对应的FP\_Tree如图$\left(\ref{fig:FP_tree}\right)$所示。
\begin{figure}[!ht]
\centering
\includegraphics[width=0.7\textwidth]{FP_2.png}
\caption{FP\_tree}
\label{fig:FP_tree}
\end{figure}
\par 然后从频率最小的单项P开始,找出P的条件模式基,用构造FP\_Tree同样的方法来构造P的条件模式基的FP\_Tree,在这棵树上找出包含P的频繁项集。
\par 依次从m,b,a,c,f的条件模式基上挖掘频繁项集,有些项需要递归的去挖掘,比较麻烦,比如m节点,具体的过程可以参考博客:
\href{http://blog.sina.com.cn/s/blog_68ffc7a40100uebg.html}{Frequent Pattern 挖掘之二 FP Growth算法},里面讲得很详细。
\newpage
\addcontentsline{toc}{section}{参考文献} %向目录中添加条目,以章的名义
\nocite{ML12,ZUIJINLIN14,MASHIJULI13,JULEI13,COURSERA,MATH14,SVD12,LONGXING10,GBDT12,ANDREW,STANFU,FP11,FAN03}
\bibliographystyle{plain}
\bibliography{RefDBase}
\newpage
\addcontentsline{toc}{section}{编程代码} %向目录中添加条目,以章的名义
\appendix
\section{程序代码}
\definecolor{mygreen}{rgb}{0,0.6,0}
\definecolor{mygray}{rgb}{0.5,0.5,0.5}
\definecolor{mymauve}{rgb}{0.58,0,0.82}\lstset{ %  %breakatwhitespace=true,         % sets if automatic breaks should only happen at whitespace%breaklines=true,                 % sets automatic line breakingbackgroundcolor=\color{lightgray},   % choose the background color; you must add \usepackage{color} or \usepackage{xcolor}basicstyle=\small,captionpos=t, % t(top) or b(bottom)                   % sets the caption-position to bottomcommentstyle=\color{mygreen},    % comment styledeletekeywords={...},            % if you want to delete keywords from the given languageescapeinside={\%*}{*)},          % if you want to add LaTeX within your codeextendedchars=true,              % lets you use non-ASCII characters; for 8-bits encodings only, does not work with UTF-8%frame=single,                    % adds a frame around the codekeepspaces=true,                 % keeps spaces in text, useful for keeping indentation of code (possibly needs columns=flexible)keywordstyle=\color{blue},       % keyword style%language=Python,                 % the language of the codemorekeywords={*,...},            % if you want to add more keywords to the setnumbers=left,                    % where to put the line-numbers; possible values are (none, left, right)numbersep=5pt,                   % how far the line-numbers are from the codenumberstyle=\tiny\color{mygray}, % the style that is used for the line-numbersrulecolor=\color{black},         % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. comments (green here))showspaces=false,                % show spaces everywhere adding particular underscores; it overrides 'showstringspaces'showstringspaces=false,          % underline spaces within strings onlyshowtabs=false,                  % show tabs within strings adding particular underscoresstepnumber=1,                    % the step between two line-numbers. If it's 1, each line will be numberedstringstyle=\color{orange},     % string literal styletabsize=2,                       % sets default tabsize to 2 spaces%title=myPython.py                   % show the filename of files included with \lstinputlisting; also try caption instead of title
}
\subsection{冒泡排序代码}
\begin{lstlisting}[language={[ANSI]C},title={bubbleSort.c}]
#include <iostream>
#define LENGTH 8
using namespace std;
//测试用的代码,bubbleSort函数
int main() {int temp,number[LENGTH]={95,45,15,78,84,51,24,12};for(int i=0;i<LENGTH;i++)for(int j=0;j<LENGTH-1-i;j++)if(number[j]>number[j+1]) {temp=number[j];number[j]=number[j+1];number[j+1]=temp;} //if endfor(int i=0;i<LENGTH;i++) cout<<number[i]<<" ";cout<<endl;
}//main end
\end{lstlisting}
\subsection{Python代码}
\lstinputlisting[language=Python, title=myPython.py]{myPython.py}
\end{document}

3.排版效果:

LaTeX完整例子_参考文献、图、表和公式相关推荐

  1. LATEX(1)设置图、表、公式标签方便上下文引用

    在使用编辑器排版时,我们经常会在正文中用到诸如"计算结果见表*","代入公式1","图2显示"这样的字眼,通过引用图表公式的序号方便作者写作 ...

  2. latex 利用jabref 生成参考文献

    latex 利用jabref 生成参考文献 LaTeX 的对参考文献的处理实在是非常的方便,我用过几次,有些体会,写出来供大家 参考.当然,自己的功力还不够深,有些地方问题一解决就罢手了,没有细究. ...

  3. html 甘特图_甘特图怎么画?甘特图基础教程,小白快速入门简单易懂

    甘特图是什么?可能你是第一次听到,甘特图是通过活动顺序和时间间隔表示某一特定项目其顺序与时间的关系.不同于时间表,或日程规划表,甘特图可以使使用者更直观的知道在某一时间的工作内容和进度. 甘特图常见用 ...

  4. jquery中ajax完整例子get,jq的ajax方法,jquery中ajax完整例子

    jq的ajax方法,jquery中ajax完整例子 相较与js异步对象的繁琐,jq的ajax对象结构更加清晰 一:ajax对象简述 ajax(Asynchronous JavaScript and X ...

  5. Latex中自动引用参考文献的方法,一分钟搞定

    Latex中自动引用参考文献的方法,一分钟搞定 平时在写英文paper的时候经常要在IEEE上引用文献,一个个手敲引用信息又太麻烦,vol pp 作者 时间什么的balabala一大堆,latex用常 ...

  6. word中 图、表、公式的自动编号功能

    话外篇:word 中 自己常用的 快捷键 Ctrl + A : 全选 Ctrl + F: 查找 Ctrl + b: 加粗 Ctrl + i : 倾斜 写文档时会涉及图.表.公式的顺序调整.增加或删除, ...

  7. ue4 无限地图_如何使用UE4创建完整游戏地图_资源库

    摘要:如何使用UE4创建完整游戏地图_资源库 地图与场景就是整个副本的舞台,任何的玩法.战斗.剧情等方面都需要借助地图与场景来展现.所以但对于想要设计游戏的人来说,游戏地图的创建非常重要.你想要运用U ...

  8. Markdown mermaid种草(4)_ 甘特图

    Markdown mermaid种草(4)_ 甘特图 文章目录 Markdown mermaid种草(4)_ 甘特图 1 甘特图简介 2 mermaid甘特图语法及参数 2.1 gantt图开始关键字 ...

  9. c语言 filetype ppt,c语言完整课件_图文.ppt

    c语言完整课件_图文 C语言程序设计 第1章 概论 第2章 数据类型.运算符与表达式 第3章 顺序结构程序设计 第4章 选择结构程序设计 第5章 循环结构程序设计 第6章 数组 第7章 函数 第8章 ...

  10. c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...

    这是精心收集的精品经典资料,值得下载保存阅读! c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual h ...

最新文章

  1. 2018 JVM 生态报告:79% 的 Java 开发者使用 Java 8
  2. 深度洞悉2017企业IT三大关注焦点
  3. 大学计算机基础 学年教学计划,大学计算机基础教学计划.pdf
  4. 多线程编程 之 (生产者与消费者(N多))同步常用的方法。
  5. STL中的栈结构和队列结构
  6. java新闻爬虫_java实现简单的爬虫之今日头条
  7. web.xml里filter-mapping中的dispatcher作用
  8. c++语言 自己构造函数 成员对象构造函数 调用顺序,C++类成员构造函数和析构函数顺序示例详细讲解...
  9. JavaScript学习随记——属性类型
  10. java 中的event_Java中this与event有什么不同
  11. pat乙级相当于什么水平_曼彻斯特大学相当于国内什么水平的大学?
  12. 计算机组成原理 mov(r0),-(sp),第三章作业
  13. python怎么定义全局变量_python中如何定义全局变量
  14. 简谈单线程多线程的理解
  15. 怎么把u盘做成启动盘装系统?
  16. 让你的工作变轻松的一套免费的 iPhone 手势图标
  17. EXCEL-VBA:EXCEL的各种文件名获取
  18. 聊聊CVE漏洞编号和正式公开那些事
  19. 说一下浏览器垃圾回收机制?
  20. spring-retry使用以及源码

热门文章

  1. IE、FF、Safari、OP不同浏览器兼容报告
  2. 网页打印问题-页面显示不全
  3. 计算机usb显示不出来怎么办,U盘在电脑上显示不出来怎么办
  4. 蠢蛋秀:匠心独运的脑筋急转弯游戏
  5. pyecharts对于经纬度_echarts 根据经纬度坐标在地图上描点
  6. html5中abbr,HTML 5 abbr 标签 - HTML 参考手册
  7. JavaScript:实现Comb sort梳排序算法(附完整源码)
  8. python基础编码规范_Python语言的基本语法和编码规范.ppt
  9. “十一“出行防诈骗攻略来了!看完再出去浪
  10. requests+正则表达式爬取猫眼电影TOP100!