算法总结8—非负矩阵因式分解

数学基础:

线性代数的矩阵乘法运算。

   非负矩阵分解是一种特征提取的算法,它尝试从数据集中寻找新的数据行,将这些新找到的数据行加以组合,就可以重新构造出数据集。

   算法要求输入多个样本数据,每个样本数据都是一个m维数值向量,首先把我们的数据集用矩阵的形式写出来,每一列是一个数据,而每一行是这些数据对应维度的数值。于是我们就有了一个大小为m*n的输入矩阵。而算法的目标就是将这个矩阵分解为另外两个非负矩阵的积。

$$M_{m,n}=A_{m,r}B_{r,n}$$

   我们将分解矩阵后新得出的一个维度称为特征,那么在前一个m*r的矩阵中,第i行第j列的值就代表属性i对第j种特征的贡献值,而后一个矩阵的第i行第j列则代表第i种特征对第j个样本的贡献值。这样我们就找出了输入样本的r种特征。

   r的大小应该依照需要进行选择,比如如果是希望找到某些共性特征,则就要选择较小的r。当我们确定了一个较为合适的r值后,就要想办法确定后面两个矩阵具体的值了。

   书中给出的算法大致如下:

  1. 定义一个函数计算用来两个矩阵的差异程度(每个对应元素相减后平方的和)
  2. 随机生成2个矩阵(mr维和rn维)记为A(权重矩阵),B(特征矩阵)
  3. 计算AB与输入的mn的数据矩阵的差异,足够小则停止,否则继续
  4. 按一定规则调整A,B的值后转3.

对于调整的方法,可以用模拟退火(下一篇文章中会提到)等多种算法,书里使用的是乘法更新法则,该法则我没有认真去看….感兴趣的可以去看论文….英文的…

2009-09-25    
算法总结7—多维缩放

一直没有时间写…..唉

这个东西好像是属于数据可视化?反正就是把多维的数据降到低维空间但是仍然尽可能的保持原来数据之间的距离关系(就是在原来维度下离的远的点仍然离得远,接近的点仍然接近) 。最常见的应该就是降到2维以方便打印和屏幕输出。

算法的输入是所有数据在高维情况下两两之间的距离(记i与j的距离为Dij)。现在以降到2维为例说明这个算法。

首先我们把所有数据点随机绘制在一张二维图像上,然后计算它们两两之间的距离dij,然后我们计算出它与高维距离Dij的误差,根据这些误差,我们将每对数据点按比例移近或移远,然后重新计算所有dij,不断重复到我们没法减少误差为止。

还是来具体说明一下吧,假设有n个点

  1. 输入每一对点之间的距离Dij。
  2. 随机在2维平面生成n个点,点i坐标记为x[i]、y[i],计算它们两之间的距离,记为dij.
  3. 对所有i 和j计算:eij=(dij-Dij) / Dij,每个点用一个二维的值grad[k]来表示它要移动的距离的比例因子(初始为0,0)。在计算出每个eij后,计算 ((x[i]-x[j]) / dij)* eij,然后把它加到grad[i][x]上,同样把((y[i]-y[j]) / dij)* eij加到grad[i][y]上。
  4. 把所有eij的绝对值相加,为总误差,与前一次的总误差比较(初始化为无穷大),大于前一次的话就停止。否则把它作为上一次总误差,继续。
  5. 对每个点,新的坐标为x[i] -= rate * grad[i][x]  y[i] -= rate*grad[i][y],其中rate是开始时自己定义的一个常数参数,该参数影响了点的移动速度。重新计算各个dij,回到3。

伪码:

2009-09-20    
算法总结5&6—-k-最近邻与聚类

因为这两个算法比较简单,又有些相似,所以这里放在一起。

K-最近邻:

k-最近邻也是一种用来进行预测的算法。

工作原理:

接受一个用以进行数值预测的新数据项,然后将它与一组已经赋过值的数据项进行比较。算法会从中找出与待预测数据最为接近的k项,并这k项其求均值以得到最终的结果。

总计来说这是一个很简单的算法,只要我们做好距离的定义并选择一个适合的k值,我们就可以很容易的实现它。

由于我们计算2组数据的距离的通常方法是将他们中对应的每一项目的差值的绝对值(或平方)相加,所以就会出现不同数据范围不同导致的误差。比如每组数据有2个分量,一个取值为0—10,另一个是0—-999999,那么第二的值就会几乎完全决定我们最后的结果。所以我们要对每一组数据进行缩放。

对数据的缩放取决于具体的应用,我们可以通过交叉验证尝试多组缩放因子然后比较它们的优劣。交叉验证的做法是先数据的一部分去除,然后用剩余数据去推测这组数据,我们就可以根据预测的结果对缩放因子进行评估。

优点:

能利用复杂函数进行数值预测,又简单易懂,并且我们可以很容易的在算法中实现查看用哪些近邻进行预测。

缺点:

每次进行预测,它都会使用所有样本,这会导致效率的低下。

寻找缩放因子是一项很乏味的工作.

2009-09-14    
统计,逻辑与智能

      今天上了开学的第一节统计学,开了很久的小差,想了不少东西。

      以前虽然自学过概率论与数理统计,但是也只是了解了一些公式与原理,一直对于统计学的一些应用不甚理解(或者说不能接受),尤其是基于统计的机器学习,一直不能接受它作为一种实现的人工智能的手段。因为我心中的人工智能是绝对理性,严谨,逻辑的。虽然我可以接受统计学的理论,却不能把它作为一种严谨的逻辑。

  但是,今天突然想到了感性,是的,人是理性的,但是人的思维中也充满了感性的,当然,这是早已熟知的事实。

  先给感性下一个定义吧。

  感性:作用于人的感觉器官而产生的感觉,知觉和表象等直观认识,相对与‘理性’”

  是的,感性一种直观的认识,那么这种认识从哪里来呢?过去的经验。人们的感性是在经验的基础上建立的,是一种仅仅由经验得出而没有任何逻辑背景的判断。

  统计学不也是这样么?将大量的样本作为过去的经验,仅仅由这些经验而不带任何逻辑推断的去快速做出一种“感性”的判断。只是这种感性比人的感性更加严谨,不会受到类似“小概率事件经常发生”这种错觉的影响,但也可以算是一种理性的感性了。

      对应的,我又想起了逻辑学,如果统计是根据经验快速简单的做出判断的话,那么逻辑学就是通过严谨的逻辑推理去寻找正确的答案,这个过程会很繁琐,但是它使绝对严谨理性的,比我们的大脑更加严谨,理性——那何不把它看成一种是理性的理性呢?

2009-09-10    
算法总结4—支持向量机

支持向量机……复杂的东西,书里讲得也不怎么详细,起码具体算法没有说……所以又去查了些资料……

支持向量机是用来对数据进行分类的。

首先从最简单的情况开始吧:

如果有一条直线,我们把它看成一条数轴,上面有一些样本点,其中坐标大于某个值的点都属于一类,坐标小于某个值的点都属于一类,那么我们就可以用这个值来做分分界点,它点把直线上的点分为了两类。因为样本点是有限可数的。所以这个分类点的取法不唯一。选好后,随便给我们一个点,我们就可以根据这个随机给出的点是在分界点的左侧还是右侧来判断这个点的类别。

同样,一个平面上有很多样本点,这些点也分为2类,如果我们在平面上可以找到这样一条直线满足这两类样本点分别分布在直线的两侧,那么我们就可以用这个平面作分界面,来对之后随机给出的点进行分类。

仍然用同样的方法,我们可以用一个平面给分布在一个3维立体空间中的点分类。

总结起来就是说:在n维空间中有很多样本点,如果我们能找到一个n-1维的超平面,这个平面恰好把空间中的样本点分在它的两侧,那么我们就可以用这个n-1维的超平面来对之后随机给出点分类。

这种方法有两个问题:

1)  因为那个n-1维的超平面选法往往是不唯一的,我们要选哪一个?

2)  更多情况下,我们找不到这样一个n-1维超平面,你可以想象更多情况下,我们要分类的数据是“混合”在一起的,很难简单的用一个点,一条线,或者一个更高纬度的线性分类器把它分开。

2009-09-08    
算法总结3—神经网络

生物神经网络:

     在生物的神经网络中的基本单位是神经元,神经元与神经元之间是由突触的相互联系来传递信息的,在静止息状态时,神经元的膜的内外电压保持一种稳定状态(膜内电压低于膜外电压),当神经元受到刺激后,在被刺激的部分周围,这种平衡状态会被打破,电压改变,与没有受到刺激的部分形成电流传递信息,电流的强弱取决于受刺激部位电压的改变量。

     前一个神经元的轴突末梢作用于下一个神经元的胞体、树突或轴突等处组成突触。不同的轴突末梢可以释放不同的化学物质对下一个神经元产生不同的影响。也就是说会使下一个神经元的受刺激部分产生不同的电压,也就导致了不同程度的电流,最终也就传递了完全不同的信息。

     一个神经元可以通过轴突作用于成千上万的神经元,也可以通过树突从成千上万的神经元接受信息。当多个神经元同时对一个神经元产生作用时,结果这些神经元的作用强度共同决定。

     神经系统按功能可大致分为传入神经(感觉神经)、中间神经(脑:延脑、脑桥、小脑、中脑、间脑、大脑脊髓)与传出神经(运动神经)三类。

     感受神经的作用是接受外界信息(输入),中间神经则起到了信息传递与计算分析的作用,最用,传出神经会负责对外界信息作出相应的反应(输出)。

     模仿这一过程,我们就可以建立人工神经网络。

2009-09-07    
算法总结2—决策树分类器

数学基础:

树:树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

每个结点有零个或多个子结点;

每一个子结点只有一个父结点;

没有前驱的结点为根结点;

除了根结点外,每个子结点可以分为m个不相交的子树;

没有子节点的节点称为叶节点。

决策树分类器原理:

决策树是一颗树,要分类的样本从树根进入,在树的每个节点通过对样本的某种属性的判断选择不同的路径逐步下降到底,得出其所属类别。

例图:

为了建立一棵决策树,我们首先应向程序输入大量训练数据(包含所属类别的数据),程序将根据训练数据按某一算法自动生成决策树。

决策树生成算法:

   为了构造决策树,算法首先创建一个根节点,然后通过分析训练数据,逐步选出适合的变量对数据进行拆分(即逐步构造上图中的非叶子节点。)

   为了选择适合的变量对数据进行拆分,我们需要一个方法来评估一种拆分方案的好坏,其评估方法包括:

  1. 基尼不纯度:

定义:基尼不存度是指来自集合的某种结果随机应用于集合中某一数据的预期误差。(如果集合中所有结果属于同一类,则误差为0)

使用:利用这一思想,我们可以将集合中每种类别的数据出现的次数除以数据总数计算相应概率,再将这些概率的乘积相加(所有概率两两相乘后在相加),这样就会得到某一数据被随机分配到错误结果的总概率。

2009-09-06    
算法总结1—贝叶斯分类器

 这几天以很快的速度翻完了<集体智慧编程>,因为只是对里面的算法感兴趣,对那些web2.0的应用没什么感觉,所以很多地方都是一扫而过,现在按最后一章的顺序来对所有相关的算法作一个详细的复习….

这个是第一篇……贝叶斯分类器

数学基础:

条件概率

定义:设A, B是两个事件,且P(A)>0 称P(B∣A)=P(AB)/P(A)为在条件 A下发生的条件事件B发生的条件概率。

乘法公式

设P(A)>0,则有P(AB)=P(B∣A)P(A)

全概率公式和贝叶斯公式

定义: 设S为试验E的样本空间,B1, B2, …Bn为E的一组事件,若BiBj=Ф, i≠j, i, j=1, 2, …,n; B1∪B2∪…∪Bn=S则称B1, B2, …, Bn为样本空间的一个划分。

定理

设试验E的样本空间为,A为E的事件,B1, B2, …,Bn为的一个划分,且P(Bi)>0(i=1, 2, …n),则P(A)=P(A∣B1)P(B1)+P(A∣B2)+ …+P(A∣Bn)P(Bn)称为全概率公式。

定理

设试验E的样本空间为S,A为E的事件,B1, B2, …,Bn为的一个划分,则P(Bi∣A)=P(A∣Bi)P(Bi)/∑P(B|Aj)P(Aj)=P(B|Ai)P(Ai)/P(B)称为贝叶斯公式。

2009-09-05    
读《你的灯亮这么》—走出问题的乌托邦

军训期间闲着无聊时,决定读一些“杂书”,其中有一本叫《你的灯亮着么?》的小册子,刚读完不久,趁着今晚休息的时间作以记录。

1)动手解决问题前,好好想想问题的来源。2)如何从各个角度看待问题,找到其真正所在。3)为什么不要把人们的解决方法误以为是问题的定义,更不要把某个问题的解决方法误认为是问题的定义,特别是整个解决方法是你自己所使用的。4)永远不要肯定你已经有了一个正确的定义,即使是在问题好像已经解决之后。5)每一种解决方法都会带来新的问题。6)问题最难处理的部分恰恰是去意识到它们的存在。7)在理解问题前,至少要做好准别接受三种可能的出错情况。8)或许还可以改变问题的表述来获得不同的解决方法。9)当你沉迷于寻找问题的定义和解决方法时,不要忘记随时都回头看看,看看自己是不是已经迷路了…。10)当别人能很好的解决自己的问题时,千万不要越俎代庖。11)如果某人能够解决这个问题,但是他们并不会遇到这一问题时,那么你首先要做的就是让他们也感受一下问题。12)不管看上去如何,人们很少知道他们要什么,直到你给了他们所需要东西。13)甚至,事实上,并没有多少人真的希望他们的问题被解决。

2009-08-25