Donnerstag, 28. Februar 2008

数据挖掘

从数据挖掘的起源可以发现,它并不是一门崭新的科学,而是综合了统计分析、机器学习、人工智能、数据库等诸多方面的研究成果而成,同时与专家系统、知识管理等研究方向不同的是,数据挖掘更侧重于应用的层面。

因此来说,数据挖掘融合了相当多的内容,试图全面了解所有的细节会花费很长的时间。因此我建议你的第一步是用大概三个月的时间了解数据挖掘的几个常用 技术:分类、聚类、预测、关联分析、孤立点分析等等。这种了解是比较粗的,目标是明白这些技术是用来干什么的,典型的算法大致是怎样的,以及在什么情况下 应该选用什么样的技术和算法。

经过初步了解之后,就要进入选题的阶段,选择自己感兴趣的某个具体方向,然后通读该方向的经典论文(综述、主要发展方向、应用成果)。选题阶段可能会 花费较长的时间,比如一年。此时,要逐渐明确突破点,也就是将来你论文的创新点。创新对于研究来说非常重要,一方面该创新的确比原来的方法要好,另一方面 该创新的确具有实用的价值。

随后,就要来实现自己的想法。通常对于硕士论文来说,需要建立原型系统,进行试验,并用试验结果来支持自己的论文主题。原型系统就是对自己创新点的实 现,需要很好地设计和开发。需要注意的是,原型系统的建立和开发商用系统不同,需要体现比较好的理论基础。也就是说,原型系统并不是简单地用于实现功能, 而是将你的一整套理论付诸实现。这种理论基础也将会包含在你的论文中,以体现论文的理论高度。

原型系统的搭建以及产生令人信服试验结果,这个过程一般需要至少一年的时间。所以要集中精力于核心部分(体现论文创新点的部分),外围的界面等等不应投入太多的精力,以免进度失控。

最后是论文的整理和写作了。建议你在之前的阶段中逐步先写出一些篇幅较短的论文(用于发在期刊、会议上),比如综述、体系框架、算法内核、应用等等。这样在最后写毕业论文时就有了足够多的内容,会写得更好更快一些。

以上只是泛泛而谈。其实我觉得其中的关键点在于选题,而选题的好坏取决于你对数据挖掘研究现状的了解、你的兴趣和专长、以及该方向在应用上的意义。建议你和导师、同行多交流,能够让自己的方向更清晰。

至于数据挖掘领域的就业,应该来说还是前景不错的。如果你对研究有兴趣,象微软研究院、Google、高校研究所都是不错的地方;如果你对实际应用有 兴趣,很多大的公司包括IBM、Accenture、亚信等等都有相应的人力需求,当然一些甲方的单位比如证券、保险、金融等等单位也都需要分析人才。

以前不知道现在知道的

计算机科学的publication
计 算机科学的publication最大特点在于:极度重视会议,而期刊则通常只用来做re-publication。大部分期刊文章都是会议论文的扩展 版,首发就在期刊上的相对较少。也正因为如此,计算机期刊的影响因子都低到惊人的程度,顶级刊物往往也只有1到2左右----被引的通常都是会议版论文, 而不是很久以后才出版的期刊版。因此,要讨论计算机科学的publication,首先必须强调的一点是 totally forget about IF。

另外一点要强调的事,计算机科学的绝大多数期刊和大部分的“好”会议都规模非常有限。很多好的期刊一期只登十来篇甚至三四篇论文,有的还是季刊或双月刊。 很多好的会议每年只录用三四十篇甚至二十篇左右的论文。所以,当你发现计算机的每个领域都有好几种顶级刊物和好几个顶级会议,不必惊讶。

整个计算机科学中最好的期刊为Journal of the ACM(JACM)。此刊物为ACM的官方学刊,受到最广泛的尊敬。但由于该刊宣称它只刊登 那些对计算机科学有长远影响的论文,因此其不可避免地具有理论歧视(theory bias)。事实上确实如此:尽管JACM征稿范围包括了计算机的绝大 部分领域,然而其刊登的论文大部分都是算法、复杂度、图论、组合数学等纯粹理论的东西,其它领域的论文要想进入则难如登天。

另外一份在计算机科学领域有重大影响的刊物为Communications of the ACM (CACM)。从某种意义上来说,CACM比JACM 要像Nature/Science很多。JACM上登的全是长篇大论,满纸的定义、定理和证明,别说一般读者没法看,就连很相近的领域的专家都未必能看 懂。而CACM则是magazine,既登高水平的学术论文和综述,也登各种科普性质的文章和新闻。即便是论文,CACM也要求文章必须通俗易懂,不追求 数学上的严格证明,而追求易于理解的直觉描述。在十几二十年前,CACM的文章几乎都是经典。但最近几年,由于CACM进一步通俗化,其学术质量稍有下 降。

IEEE Transaction on Computers为IEEE在计算机方面最好的刊物。但由于IEEE的特点,其更注重 computer engineering而非computer science。换句话说, IEEE Transaction on Computers主要登载systems, architecture, hardware等领域的东西,尽 管它的范围已经比大部分刊物要广泛。

就刊物的质量而言,ACM Transactions系列总体来讲都高于IEEE Transactions系列,不过也不可一概而论。大部分 ACM Transactions都是本领域最好的刊物或最好的刊物之一。大部分IEEE Transactions都是本领域很好的刊物,但也有最好的 或者一般的。非ACM/IEEE的刊物中,也有好的甚至最好的。例如,SIAM Journal on Computing被认为是理论方面最好的期刊之 一。

计算机科学方面的会议论文事实上起着比刊物论文更大的作用。大部分会议都是每年一次,偶尔也有隔年一次的。正规的会议论文需要经过2-4个甚至更多个审稿人的双向或单向匿名评审,并且所有被接收的论文会被结集正式出版。

大部分ACM的会议都是本领域顶级的或很好的会议。大部分IEEE的会议都是本领域很好的会议,但也有顶级的或者一般的。

会议的档次通常可以通过论文录用率表现出来。顶级会议通常在20%左右或更低,有时能达到10%左右。我所知道的最低的录用率为7%。很好的会议通常在30%左右。达到40%以上时,会议的名声就很一般了。60%以上的会议通常很难受到尊敬。

但也有例外。大名鼎鼎的STOC(ACM Symposium on Theory of Computing)录用率就达到30%以上,但它毫无疑问是理论方面最好的会议。造成这样的情形,主要是因为理论方面的工作者不多,而大部分人对STOC又有一种又敬又怕的心理

Montag, 25. Februar 2008

SCORM模型中各种元素的理解

http://www.xerceo.com/confluence/display/xerceo/SCORM+Nomenclature

原文地址

Sonntag, 24. Februar 2008

我们的心多么顽固

叶兆言的小说,写得真好。
稍后要写一个评论的

Donnerstag, 21. Februar 2008

疑惑

我怎么总感觉Microsoft的产品有点弄巧成拙或者说投机取巧的意思??

zz:神经网络介绍

原文地址:http://www-128.ibm.com/developerworks/cn/linux/other/l-neural/index.html

Andrew Blais, Ph.D. (onlymice@gnosis.cx)Gnosis Software, Inc.
David Mertz, Ph.D. (mertz@gnosis.cx)Gnosis Software, Inc.

2001 年 6 月 01 日

神 经网络也许是计算机计算的将来,一个了解它的好方法是用一个它可以解决的难题来说明。假设给出 500 个字符的代码段,您知道它们是 C、C++、Java 或者 Python。现在构造一个程序,来识别编写这段代码的语言。一种解决方案是构造一个能够学习识别这些语言的神经网络。这篇文章讨论了神经网络的基本功能 以及构造神经网络的方法,这样就可以在编码时应用它们了。

根据一个简化的 统计,人脑由百亿条神经组成 ― 每条神经平均连结到其它几千条神经。通过这种连结方式,神经可以收发不同数量的能量。神经的一个非常重要的功能是它们对能量的接受并不是立即作出响应,而 是将它们累加起来,当这个累加的总和达到某个临界阈值时,它们将它们自己的那部分能量发送给其它的神经。大脑通过调节这些连结的数目和强度进行学习。尽管 这是个生物行为的简化描述。但同样可以充分有力地被看作是神经网络的模型。

阈值逻辑单元(Threshold Logic Unit,TLU)

理解神经网络的第一步是从对抽象生物神经开始,并把重点放在 阈值逻辑单元(TLU)这一特征上。一个 TLU 是一个对象,它可以输入一组加权系数的量,对它们进行求和,如果这个和达到或者超过了某个阈值,输出一个量。 让我们用符号标注这些功能,首先,有输入值以及它们的权系数:X 1, X 2, ..., X n和 W 1, W 2, ..., W n。接着是求和计算出的 X i*W i ,产生了激发层 a,换一种方法表示:

a = (X1 * W1)+(X2 * W2)+...+(Xi * Wi)+...+ (Xn * Wn)

阈值称为 theta。最后,输出结果 y。当 a >=theta 时 y=1,反之 y=0。请注意输出可以是连续的,因为它也可以由一个 squash 函数 s(或 sigma)判定,该函数的自变量是 a,函数值在 0 和 1 之间,y=s(a)。


图 1. 阈值逻辑单元,带有 sigma 函数(顶部)和 cutoff 函数(底部)
阈值逻辑单元

TLU 会分类,假设一个 TLU 有两个输入值,它们的权系数等于 1,theta 值等于 1.5。当这个 TLU 输入 <0,0>、<0,1>、<1,0> 和 <1,1> 时,它的输出分别为 0、0、0、1。TLU 将这些输入分为两组:0 组和 1 组。就像懂得逻辑连接(布尔运算 AND)的人脑可以类似地将逻辑连接的句子分类那样,TLU 也懂得一点逻辑连接之类的东西。

TLU 能够用几何学上的解释来阐明这种现象。它的四种可能输入对应于笛卡尔图的四个点。从等式 X 1*W 1+ X 2*W 2 = theta,换句话说,也即 TLU 转换其分类行为的点开始,它的点都分布在曲线 X 2 = -X 1 + 1.5 上。这个方程的曲线将 4 个可能的输入分成了两个对应于 TLU 分类的区域。这是 TLU 原理中更为普通的实例。在 TLU 有任意数目的 N 个输入的情况下,一组可能的输入对应于 N 维空间中的一个点集。如果这些点可以被超平面 ― 换句话说,对应于上面示例中的线的 N 维的几何外形切割,那么就有一组权系数和一个阈值来定义其分类刚好与这个切割相匹配的 TLU。





回页首


TLU 的学习原理

既然 TLU 懂得分类,它们就知道素材。神经网络也可假定为可以学习。它们的学习机制是模仿大脑调节神经连结的原理。TLU 通过改变它的权系数和阈值来学习。实际上,从数学的观点看,权系数阈值的特征有点武断。让我们回想一下当 SUM(Xi * Wi) >= theta 时 TLU 在临界点时输出的是 1 而不是 0,这相当于说临界点是出现在 SUM(X i* W i)+ (-1 * theta) >= 0 的时候。所以,我们可以把 -1 看成一个常量输入,它的权系数 theta 在学习(或者用技术术语,称为 培训)的过程中进行调整。这样,当 SUM(X i* W i)+ (-1 * theta) >= 0 时,y=1,反之 y=0。

在培训过程中,神经网络输入:

  1. 一系列需要分类的术语示例
  2. 它们的正确分类或者目标

这样的输入可以看成一个向量:1, X 2, ..., X n, theta, t>,这里 t 是一个目标或者正确分类。神经网络用这些来调整权系数,其目的使培训中的目标与其分类相匹配。更确切地说,这是有指导的培训,与之相反的是无指导的培训。前者是基于带目标的示例,而后者却只是建立在统计分析的基础上(请参阅本文随后的 参考资料)。权系数的调整有一个学习规则,一个理想化的学习算法如下所示:


清单 1. 理想化的学习算法
fully_trained = FALSE

DO UNTIL (fully_trained):
fully_trained = TRUE
FOR EACH training_vector = ::
# Weights compared to theta
a = (X1 * W1)+(X2 * W2)+...+(Xn * Wn) - theta
y = sigma(a)
IF y != target:
fully_trained = FALSE
FOR EACH Wi:
MODIFY_WEIGHT(Wi) # According to the training rule
IF (fully_trained):
BREAK

您或许想知道,“哪些培训规则?”有很多,不过有一条似乎合理的规则是基于这样一种思想,即权系数和阈值的调整应该由分式 (t - y) 确定。这个规则通过引入 alpha (0 <>学习率。W i 中的更改值等于 (alpha * (t - y)* Xi)。当 alpha 趋向于 0 时,神经网络的权系数的调整变得保守一点;当 alpha 趋向于 1 时,权系数的调整变得激进。一个使用这个规则的神经网络称为 感知器,并且这个规则被称为 感知器学习规则。Rosenblatt 于 1962 年(请参阅 参考资料)下的结论是,如果 N 维空间的点集被超平面切割,那么感知器的培训算法的应用将会最终导致权系数的分配,从而定义了一个 TLU,它的超平面会进行需要的分割。当然,为了记起 Keynes,最终我们都切断了与外界的联系,专心思考。但是在计算时间之外,我们仍濒临危险,因为我们需要自己的神经网络对可能输入的空间进行不止一次的切割。

文章开始的难题举例说明了这个,假设给您 N 个字符的代码段,您知道是 C、C++、Java 或者 Python。难的是构造一个程序来标识编写这段代码的语言。用 TLU 来实现需要对可能的输入空间进行不止一次的分割。它需要把空间分成四个区域。每种语言一个区域。把神经网络培训成能实现两个切割就可完成这种工作。第一个切割将 C/C++ 和 Java/Python 分开来,另一个将 C/Java 和 C++/Python 分开。一个能够完成这些切割的网络同样可以识别源代码样本中的语言。但是这需要网络有不同结构,在描述这个不同之处之前,先来简单地看一下实践方面的考虑。

图 2. 初步的(不完整的)感知器学习模型
感知器学习模型

考虑到排除取得 N 个字符代码所需的计算时间,统计从 ASCII 码的 32 到 127 的范围内可视 ASCII 码字符出现的频率,并在这个统计以及关于代码语言的目标信息的基础上培训神经网络。我们的方法是将字符统计限制到 C、C++、Java 和 Python 代码字符库中最常用的 20 个非字母数字字符。由于关注浮点运算的执行,我们打算用一种规格化因素将这 20 字符统计分开来,并以此培训我们的网络。显然,一个结构上的不同是我们的网络有 20 个输入节点,但这是很正常的,因为我们的描述已经暗示了这种可能性。一个更有意思的区别是出现了一对中间节点,N1 和 N2,以及输出节点数量从两个变成了四个(O1 到 O4)。

我们将培训 N1,这样当它一看到 C 或 C++,设置 y1=1,看到 Java 或 Python,它将设置 y1=0。同理培训 N2,当它一看到 C 或 Java,设置 y2=1,看到 C++ 或 Python,设置 y2=0。此外,N1 和 N2 将输出 1 或 0 给 Oi。现在如果 N1 看到 C 或 C++,而且 N2 看到 C 或者 Java,那么难题中的代码是 C。而如果 N1 看到 C 或 C++,N2 看到 C++ 或 Python,那么代码就是 C++。这个模式很显而易见。所以假设 Oi 已被培训并根据下面表格的情况输出 1 或 0。

映射到输出(作为布尔函数)的中间节点

N1 N2 O1 (C) O2 (C++) O3 (Java) O4 (Python)
0 0 0 0 0 1
0 1 0 0 1 0
1 0 0 1 0 0
1 1 1 0 0 0

如果这样可行的话,我们的网络就可以从代码示例中识别出语言了。这个想法很好。但是在实践上却有些难以置信。不过这种解决方案预示了 C/C++ 和 Java/Python 输入被一个超平面切割了,同样 C/Java 和 C++/Python 输入被另一个切割。这是一个网络培训的解决方案,迂回地解决了这个输入空间的设想。





回页首


关于 delta 规则

另一种培训的规则叫做 delta 规则。感知器培训规则是基于这样一种思路 ― 权系数的调整是由目标和输出的差分方程表达式决定。而 delta 规则是基于梯度降落这样一种思路。这个复杂的数学概念可以举个简单的例子来表示。从给定的几点来看,向南的那条路径比向东那条更陡些。向东就像从悬崖上掉 下来,但是向南就是沿着一个略微倾斜的斜坡下来,向西像登一座陡峭的山,而北边则到了平地,只要慢慢的闲逛就可以了。所以您要寻找的是到达平地的所有路径 中将陡峭的总和减少到最小的路径。在权系数的调整中,神经网络将会找到一种将误差减少到最小的权系数的分配方式。

将我们的网络限制为没有隐藏节点,但是可能会有不止一个的输出节点,设 p 是一组培训中的一个元素,t(p,n) 是相应的输出节点 n 的目标。但是,设 y(p,n) 由以上提到的 squash 函数 s 决定,这里 a(p,n) 是与 p 相关的 n 的激活函数,或者用 (p,n) = s( a(p,n) ) 表示为与 p 相关的节点 n 的 squash 过的激活函数。为网络设定权系数(每个 Wi),也为每个 p 和 n 建立 t(p,n) 与 y(p,n) 的差分,这就意味着为每个 p 设定了网络全部的误差。因此对于每组权系数来说有一个平均误差。但是 delta 规则取决于求平均值方法的精确度以及误差。我们先不讨论细节问题,只是说一些与某些 p 和 n 相关的误差:?* square( t(p,n) - y(p,n) )(请参阅 参考资料)。现在,对于每个 Wi,平均误差定义如下:


清单 2. 查找平均误差
sum = 0

FOR p = 1 TO M: # M is number of training vectors
FOR n = 1 TO N: # N is number of output nodes
sum = sum + (1/2 * (t(p,n)-y(p,n))^2)
average = 1/M * sum

delta 规则就是依据这个误差的定义来定义的。因为误差是依据那些培训向量来说明的,delta 规则是一种获取一个特殊的权系数集以及一个特殊的向量的算法。而改变权系数将会使神经网络的误差最小化。我们不需要讨论支持这个算法的微积分学,只要认为任何 Wi 发生的变化都是如下所示就够了:

alpha * s'(a(p,n)) * (t(p,n) - y(p,n)) * X(p,i,n).


X(p,i,n) 是输入到节点 n 的 p 中的第 i 个元素,alpha 是已知的学习率。最后 s'( a(p,n) ) 是与 p 相关的第 n 个节点激活的 squashing 函数的变化(派生)率,这就是 delta 规则,并且 Widrow 和 Stearns (请参阅 参考资料)向我们展示了当 alpha 非常小的时候,权系数向量接近某个将误差最小化的向量。用于权系数调节的基于 delta 规则的算法就是如此。


梯度降落(直到误差小到适当的程度为止)
step 1: for each training vector, p, find a(p)

step 2: for each i, change Wi by:
alpha * s'(a(p,n)) * (t(p,n)-y(p,n)) * X(p,i,n)

这里有一些与感知器算法相区别的重要不同点。显然,在权系数调整的公式下有着完全不同的分析。delta 规则算法总是在权系数上调整,而且这是建立在相对输出的激活方式上。最后,这不一定适用于存在隐藏节点的网络。





回页首


反向传播

反向传播这一算法把支持 delta 规则的分析扩展到了带有隐藏节点的神经网络。为了理解这个问题,设想 Bob 给 Alice 讲了一个故事,然后 Alice 又讲给了 Ted,Ted 检查了这个事实真相,发现这个故事是错误的。现在 Ted 需要找出哪些错误是 Bob 造成的而哪些又归咎于 Alice。当输出节点从隐藏节点获得输入,网络发现出现了误差,权系数的调整需要一个算法来找出整个误差是由多少不同的节点造成的,网络需要问,“是谁让我误入歧途?到怎样的程度?如何弥补?”这时,网络该怎么做呢?


图 3:“代码识别”反向传播的神经网络

反向传播算法同样来源于梯度降落原理,在权系数调整分析中的唯一不同是涉及到 t(p,n) 与 y(p,n) 的差分。通常来说 W i的改变在于:

alpha * s'(a(p,n)) * d(n) * X(p,i,n)

其中 d(n) 是隐藏节点 n 的函数,让我们来看(1)n 对任何给出的输出节点有多大影响;(2)输出节点本身对网络整体的误差有多少影响。一方面,n 影响一个输出节点越多,n 造成网络整体的误差也越多。另一方面,如果输出节点影响网络整体的误差越少,n 对输出节点的影响也相应减少。这里 d(j) 是对网络的整体误差的基值,W(n,j) 是 n 对 j 造成的影响,d(j) * W(n,j) 是这两种影响的总和。但是 n 几乎总是影响多个输出节点,也许会影响每一个输出结点,这样,d(n) 可以表示为:

SUM(d(j)*W(n,j))

这里 j 是一个从 n 获得输入的输出节点,联系起来,我们就得到了一个培训规则,第 1 部分:在隐藏节点 n 和输出节点 j 之间权系数改变,如下所示:

alpha * s'(a(p,n))*(t(p,n) - y(p,n)) * X(p,n,j)

第 2 部分:在输入节点 i 和输出节点 n 之间权系数改变,如下所示:

alpha * s'(a(p,n)) * sum(d(j) * W(n,j)) * X(p,i,n)

这里每个从 n 接收输入的输出节点 j 都不同。关于反向传播算法的基本情况大致如此。

将 Wi 初始化为小的随机值。

使误差小到适当的程度要遵循的步骤

第 1 步:输入培训向量。
第 2 步:隐藏节点计算它们的输出
第 3 步:输出节点在第 2 步的基础上计算它们的输出。
第 4 步:计算第 3 步所得的结果和期望值之间的差。
第 5 步:把第 4 步的结果填入培训规则的第 1 部分。
第 6 步:对于每个隐藏节点 n,计算 d(n)。
第 7 步:把第 6 步的结果填入培训规则的第 2 部分。

通常把第 1 步到第 3 步称为 正向传播,把第 4 步到第 7 步称为 反向传播。反向传播的名字由此而来。





回页首


识别成功

在掌握了反向传播算法后,可以来看我们的识别源代码样本语言的难题。为了解决这个问题,我们提供了 Neil Schemenauer 的 Python 模型 bpnn(请参阅 参考资料)。用它的模型解决问题真是难以置信的简单,在我们的类 NN2 里定制了一个类 NN ,不过我们的改变只是调整了表达方式和整个过程的输出,并没有涉及到算法。基本的代码如下所示:


清单 3:用 bpnn.py 建立一个神经网络
                # Create the network (number of input, hidden, and training nodes)

net = NN2(INPUTS, HIDDEN, OUTPUTS)
# create the training and testing data
trainpat = []
testpat = []
for n in xrange(TRAINSIZE+TESTSIZE):

#... add vectors to each set
# train it with some patterns
net.train(trainpat, iterations=ITERATIONS, N=LEARNRATE, M=MOMENTUM)
# test it
net.test(testpat)
# report trained weights
net.weights()


当然我们需要输入数据,实用程序 code2data.py 提供了这个功能。它的界面很直观:只要将一堆扩展名各不相同的文件放到一个子目录 ./code 中,然后运行这个实用程序,并列举那些扩展名作为命令选项。例如:

python code2data.py py c java

您得到的是一堆 STDOUT 上的向量,可以把这些向量输入到另一个进程或者重定向到一个文件,它的输出如下所示:


清单 4:Code2Data 的输出向量
0.15 0.01 0.01 0.04 0.07 0.00 0.00 0.03 0.01 0.00 0.00 0.00 0.05 0.00 > 1 0 0

0.14 0.00 0.00 0.05 0.13 0.00 0.00 0.00 0.02 0.00 0.00 0.00 0.13 0.00 > 1 0 0
[...]

让我们回忆一下输入值都是不同特殊字符出现的规格化数目,目标值(在大于号以后)是 YES/NO,它代表包含这些字符的源代码文件的类型,不过对于什么是什么来说,并没有非常明显的东西。数字可以是输入或期望的 任意值,这才是最重要的。

下一步是运行实际的 code_recognizer.py 程序。这需要(在 STDIN 中)像上面一样的向量集。这个程序有一个包,它能够根据实际文件推断出需要多少输入节点(计算在内的和期望的),选择隐藏节点的数目是一个诀窍。对于源代码的识别,6 到 8 个隐藏节点似乎工作得很好。如果打算试验网络从而发现对于这些不同的选项它是如何做的,您可以覆盖命令行中的所有参数,但每一次运行还是会耗费一些时间。值得注意的是, code_recognizer.py 将它的(大的)测试结果文件发送到 STDOUT,而将一些友好的消息放在 STDERR 里。这样在大部分时间里,为了安全保管,您将会把 STDOUT 定向到一个文件,并监视针对进程和结果概要的 STDERR。


清单 5:运行 code_recognizer.py
> code2data.py py c java | code_recognizer.py > test_results.txt

Total bytes of py-source: 457729
Total bytes of c-source: 245197
Total bytes of java-source: 709858
Input set: ) ( _ . = ; " , ' * / { } : - 0 + 1 [ ]
HIDDEN = 8
LEARNRATE = 0.5
ITERATIONS = 1000
TRAINSIZE = 500
OUTPUTS = 3
MOMENTUM = 0.1
ERROR_CUTOFF = 0.01
TESTSIZE = 500
INPUTS = 20
error -> 95.519... 23.696... 19.727... 14.012... 11.058... 9.652...
8.858... 8.236... 7.637... 7.065... 6.398... 5.413... 4.508...
3.860... 3.523... 3.258... 3.026... 2.818... 2.631... 2.463...
2.313... 2.180... 2.065... 1.965... 1.877... 1.798... 1.725...
[...]
0.113... 0.110... 0.108... 0.106... 0.104... 0.102... 0.100...
0.098... 0.096... 0.094... 0.093... 0.091... 0.089... 0.088...
0.086... 0.085... 0.084...
Success rate against test data: 92.60%

不断减少误差是个很好的兆头,这至少在一段长时间里所获得的一种进步,且最后的结果必然是深入人心的。就我们的观点而言,网络完成了一项值得尊敬的工作,来识别代码 ― 我们将会乐意倾听,对于您的数字向量它是如何做的。



Mittwoch, 20. Februar 2008

MIT的免费课程

http://ocw.mit.edu/OcwWeb/web/home/home/index.htm

http://www.myoops.org/

Donnerstag, 14. Februar 2008

冠希老师出事儿后....

冠希老师出事儿后
卡通人物法国籍小美女玛勒格碧因为跟陈老师和两岸三地的警警和察察有点个人恩怨
决定用冠希老师的照片儿为武器,还原事实真相,让网络人民每个人都能收到这份特别的鼠年礼物
玛勒格碧为了躲避警警和察察的堵截,发照片的时候拟文如下:
XX,你好,这是前两天小陈儿小钟儿小张儿他们出去郊游的合影,可惜没有你,给你寄去,以资鼓励。
XX,你好,欢迎你来欧洲跟我洽谈关于如何开展公司欧洲业务的事宜,附件里是详细的事宜议程!

...