webdancer's Blog

matlab编程3—添加工具箱

在matlab程序设计中,如果我们要引入别人的写好的工具箱,怎么做呢?

首先,介绍一下matlab中的两个概念:current directory 和 search directory。matlab中的文件操作将这两个文件夹作为引用点,所以我们的文件必须在这两个之一。

1.current directory

current directory在matlab的GUI的matlab toolbars中默认显示,我们很容易更改current directory.如下图:

2.search directory

安装工具箱,就是将工具箱路径,添加到search directory中。

有两种方式:

  1. 命令行。addpath(genpath('/path/to/targettoolbox'))
  2. 通过GUI界面。选择File-->setpath添加。

注意:matlab中,搜索目录中的函数在统一命名空间,这样如果函数重名,是一个比较让人不好办的问题。如果自己写的函数,不要与matlab内置函数重名;如果第三方toolboxs有重名现象,只好改名了。

matlab编程2

matlab里面记录代码的文件成为M-files。可以分为两种类型:script和function。

1.script。不接受输入,也不返回输出。它对workspace的数据进行操作。和python等的脚本文件是一样的,把在控制台的命令给保存起来。

2.function。接受输入参数,返回输出。这类文件的一个注意的地方就是文件名和函数名必须相同.

例子:

function r = rank(A,tol)
%RANK   Matrix rank.
%   RANK(A) provides an estimate of the number of linearly
%   independent rows or columns of a matrix A.
%   RANK(A,tol) is the number of singular values of A
%   that are larger than tol.
%   RANK(A) uses the default tol = max(size(A)) * eps(norm(A)).
%
%   Class support for input A:
%      float: double, single

%   Copyright 1984-2007 The MathWorks, Inc.
%   $Revision: 5.11.4.5 $  $Date: 2007/08/03 21:26:23 $

s = svd(A);
if nargin==1
   tol = max(size(A)) * eps(max(s));
end
r = sum(s > tol);

从这个例子中,看出:

1.从第一行看出,文件名与函数名一致。

2.%的行为注释,用help rank可以查看(当然,help方法删掉了一些没用的,比如最后两行)。

3.下面为函数体,是函数的实现。参数的参数数目可以用方法nargin和nargout获得。(n/arg/in)

function可以分为以下几种类型:

1.匿名函数。

不用创建专门的m文件,可在命令行,m文件内部创建。语法如下

f=@(arglist) expression

例子:

>> sqrt=@(x) x.^(1/2);

2.主函数和子函数。

函数类型的M文件需要一个主函数,放在第一位;后面可以跟若干个子函数(当然可以不跟)。

3.私有函数。

只对一些函数可见,放在名称为:private的目录下面。

4.嵌套函数。

在函数体内,定义新的函数。

提示:

构造字符串参数

用[]可以连接字符串,很容易来构造所需要的参数。

例子:

for i=1:10,
    s=['index' int2str(i) '.dat'];
    load(s);
end 

特殊的函数:

eval:可以执行matlab命令。

例子:

>> cmd='1+1';
>> eval(cmd)

函数句柄:

使用@符号,可以获得matlab函数的句柄。这通常在把matlab函数作为参数的时候非常有用。

function [f,g] = myfun(x)
f = 3*x(1)^2 + 2*x(1)*x(2) + x(2)^2;    % Cost function
if nargout > 1
   g(1) = 6*x(1)+2*x(2);
   g(2) = 2*x(1)+2*x(2);
end

options = optimset('GradObj','on');
x0 = [1,1];
[x,fval] = fminunc(@myfun,x0,options);

使用矩阵运算代替迭代。

在matlab中矩阵运算都经过优化,速度较快。

 

matlab编程1

 

数据类型
前面已经学习了matlab编程的主要的数据类型就是矩阵。
介绍其他的一些数据类型:
** multiarrays
例如:rand(2,2,2)
** cellarrays
例如:carr=cell(8,1)
注意:
cellarrays用{}来索引,所以第二个元素为:carr{2}
cellarrays的元素可以使其他类型数据
**字符和文本
例如: str='hello world!'
**结构体
例如:
fp.no=9;
fp.name='torres';
 
控制流
1.条件语句。
if语句
if condition1,
   statement1
elseif condition2,
   statement2
else,
   statement3
end
与C语言的if是一致的,关键词不同,多了一个elseif。
 
switch语句
switch variable
    case constant1,
        statement1
    case constant2,
        statement2,
    otherwise,
        statement3
end
与C语言的switch是不一致的。matlab的switch不是fall through的。第一个case为true,下面的case
不会执行。
注意:在比较两个矩阵时,用isequal函数。
 
例子:
n = floor(real(double(n(1))));

if mod(n,2) == 1
   % Odd order 
   M = oddOrderMagicSquare(n);
elseif mod(n,4) == 0
   % Doubly even order.
   % Doubly even order.
   J = fix(mod(1:n,4)/2);
   K = bsxfun(@eq,J',J);
   M = bsxfun(@plus,(1:n:(n*n))',0:n-1);
   M(K) = n*n+1 - M(K);
else
   % Singly even order.
   p = n/2;   %p is odd.
   M = oddOrderMagicSquare(p);
   M = [M M+2*p^2; M+3*p^2 M+p^2];
   if n == 2
      return
   end
   i = (1:p)';
   k = (n-2)/4;
   j = [1:k (n-k+2):n];
   M([i; i+p],j) = M([i+p; i],j);
   i = k+1;
   j = [1 i];
   M([i; i+p],j) = M([i+p; i],j);
end
2.循环条件。
for语句
for condition,
    statement;
end
 
while语句
while condition,
      statement;
end
还有两个关键字 continue, break。和C语言中的用法是一致的。
 
例子:
二分法解方程x^3-2x-5。
 
a = 0; fa = -Inf;
b = 3; fb = Inf;
while b-a > eps*b
   x = (a+b)/2;
   fx = x^3-2*x-5;
   if fx == 0
      break
   elseif sign(fx) == sign(fa)
      a = x; fa = fx;
   else
      b = x; fb = fx;
   end
end
disp(x)
 
try-catch语句
try 
    statement1
catch
    statement2
end
 
语句与java中try-catch类似,try语句块里面有错误发生时,被catch捕获。错误可以用lasterr查看。
 
return语句
结束当前语句,返回到调用函数
 

matlab作图

matlab提供了很多的方法来作图。通过图像我们能够直观的来观察数据中的重要特征。我们可以根据我们的数据来选择作图的类型,比如:line,bar,histogram,pie等;还可以用来做三维图形,比如:surfaces等。

我们有有种基本的作图方式,命令行和作图工具。当然,我们可以把它们结合起来,比如用命令行作图后,用作图工具来修改。
 
1.使用plottools作图。
使用GUI的作图工具,可以实现很强大的功能。帮助文档介绍很详细。
2.作图函数。
这时我们在编程时需要的,可以自动的进行数据可视化。
数据:
>>X=-2*pi:.1:2*pi
>>Y=sin(X)
具体函数:
二维作图:plot
x坐标轴:xlabel
y坐标轴:ylabel
标题:title
注意:xlabel,ylabel,title都可以用tex的语法来写数学公式。
例子:
%作sin(x)的图像
>>plot(X,Y,'r');
>>xlabel('X');
>>ylabel('sin(X)');
>>title('the sin function');
通过修改plot的参数,可以同时画出多个函数
例如:
>>plot(X,Y,X,sin(X-.5));
>>legend('sin(x)','sin(x-0.5)'); %标注不同的函数
当然plot还有很多的参数,用来定义图像的外观。
holdon 可以让我们继续往前面的图像上添加函数。
subplot可以使我们在一个图像中使用多个坐标系。
例子:
>>subplot(2,1,1);plot(X,sin(X));
>>subplot(2,1,2);plot(X,cos(X));
mesh, surface ,contour
>> [X,Y]=meshgrid(-8:.1:8);
>> R=sqrt(X.^2+Y.^2)+eps;
>> Z=sin(R)./R;
>> mesh(X,Y,Z);
>>surf(X,Y,Z);
类似mesh
>>contour(X,Y,Z);
当然,使用matlab做好图形还需在实践中慢慢积累。

 

matlab入门

简介

matlab(matrix laboratory)是用来进行科学计算的高效语言,提供了计算,可视化,编程的易用环境。
toolboxs是matlab函数的集合,通常用来处理特定的问题,比如:数字信号,神经网络,小波等。
matlab软件通常包含以下几个部分:
1)开发环境。常用的命令窗口,编辑器,命令行历史,搜索路径等。
2)数学函数库。包含很多的数学函数。
3)matlab开发语言。
4)图形。
5)matlab API。可以让matlab与C/C++或是fortran交互。
 
矩阵
matlab中的矩阵和我们在线性代数中学的矩阵是一样的。matlab可以让我们很容易的处理整个矩阵。
matlab中矩阵的表示:
** 行元素用空格或是逗号隔开
** 一行的结尾用分号来标记
** 整个矩阵用[ ]来标记
举例:
A=[16 3 2 13; 5 10 11 8;9 6 7 12; 4 15 14 1]
 
下标。
** 在i行j列的元素:A(i,j) 也可表示为:A(i*j) 
** 结尾可以表示为end。如:A(end,end)
 
冒号运算符
在matlab中常用,可产生等差数列。
举例:
1:2:10
结果:
 1     3     5     7     9
和下标结合,如A矩阵的第2列: A(:,2)
 
 
表达式
在matlab的表达式中,真个矩阵参与运算。
变量:matlab中,不进行变量的声明。例如: var = 6
数字:支持复数和实数,象数学里面的传统表示(复数虚部可以用i或是j作为后缀)。例如 1+3j
运算符:
+  矩阵加
-  矩阵减
*  矩阵乘
/  解线性方程组
\  解线性方程组
^  幂运算 
'  转置,复数共轭
() 可以确定运算顺序
[] 连接
 
函数
matlab提供了很多的函数,而且很多函数都有复杂的参数,完成复杂的运算。
可以:
help elfun   查看基础函数
help specfun 查看高级专门函数
help elmat   查看产生矩阵的函数
函数可以分为:built-in和其他类型(比如m类型函数)。built-in无法查看代码,而其他类型可以查看代码。
一些常用的常数:pi,Inf,NaN,realmin,realmax,eps,i,j 可被覆盖。
例如:
eps=1.e-6
恢复:
clear eps
 
在编程中常用的:
产生矩阵:
zeros,ones, rand, randn等
载入数据:
load
 
M-Files:
可以写自己的函数或是脚本,文件名以后缀m结尾
 
计算矩阵行列式
det(A)
 
在上面的运算符前面加上. ,变为矩阵内元素相乘。
如:A.*B
 
++多元数据
matlab使用面向列的分析方式,其中每一列是一个变量,每一行是一个观测。(i,j)表示j变量的i个观测。
帮助:help datafun
 
可以用逻辑或是关系运算的结果做下标
例子:
A(~isprime(A))=0
 
find函数可以用来早满足某个条件的数,如:[i,j]=find(A==3)
 
format函数
控制数字的格式,常用有:format short , format long 等。
 
禁止在屏幕上打印
在语句结束时,加分号;
 

 

[转帖]怎样做研究生?

 

原作:David Chapman

翻译:不详

本文的主旨是解释如何做研究。我们提供的这些建议,对于研究本身(阅读、写作和程序设计)、理解研究过程以及开始研究(方法论、选题、选导师和情感因素),都是极具价值的。

1. 简介

这是什么?

并没有什么神丹妙药可以保证在研究中取得成功,本文只是列举了一些可能会对研究有所帮助的非正式意见。

目标读者是谁?

本文主要是为新入学的研究生而写。

如何使用?

要精读完本文,太长了一些,最好是采用浏览的方式。很多人觉得下面的方法很有效:先快速通读一遍,然后选取其中与自己当前研究项目有关的部分仔细研究。

本文被粗略地分为两部分。第一部分涉及研究者所需具备的各种技能:如阅读,写作和程序设计等等。第二部分讨论研究过程本身:即研究究竟是怎么回事,如何做研究,如何选题和选导师,如何考虑研究中的情感因素。很多读者反映,从长远看,第二部分比第一部分更有价值,也更让人感兴趣。

本文的主要内容包括:

一、掌握一些阅读的诀窍。

二、如何成为研究领域的一员:与相关人员保持联系,他们可以使你保持对研究前沿的跟踪,知道应该读什么材料。

三、学习相关领域的知识:对几个领域都有基本的理解,对于一个或者两个领域要精通。

四、如何做研究笔记。

五、如何写期刊论文和毕业论文。如何为草稿写评审意见,如何利用别人的评审意见。如何发表论文。

六、如何做研究报告及演讲。

七、掌握和自己相关领域的程序设计。

八、有关研究生涯最重要的问题,如何选导师。不同的导师具有不同的风格,导师是你必须了解如何利用的资源。

九、关于毕业论文。毕业论文将占据研究生生涯的大部分时间,本部分涉及如何选题,以及如何避免浪费时间。

十、研究方法论。

十一、或许是最重要的一节:涉及研究过程中的情感因素,包括如何面对失败,如何设定目标,如何避免不安全感,保持自信,享受快乐。

 

一、阅读

很多研究人员花一半的时间阅读文献,可以很快地从别人的工作中学到很多东西。阅读文献,始于今日。一旦你开始写作论文,就没有多少时间了,那时的阅读主要集中于论文主题相关的文献。在研究生的头两年,大部分的时间要用于做课程作业和打基础。此时,阅读课本和出版的期刊文章就可以了。

在自己研究领域打下坚实的基础所需要的阅读量,是令人望而止步的。

一个有用的小技巧是:首先找出那些最本质的论文。此时可以参考一些有用的书目:例如研究生课程表,其他学校(主要是斯坦福大学)研究生录取程序的建议阅读列表,这些可以让你有一些初步的印象。如果你对自己研究的某个子领域感兴趣,向该领域的高年级研究生请教本领域最重要的十篇论文是什么,如果可以,借过来复印。

回顾最近几年的出版物,将那些非常感兴趣的复制下来。这不仅是由于其中很多都是意义重大的论文,对于了解实验室成员的工作进展也是很重要的。每年都应该去所在学校的计算机科学图书馆,翻阅其他院校出版的和自己相关领域技术报告,并选出自己感兴趣的仔细加以阅读。

阅读论文是需要练习的技能。不可能完整地阅读所有的论文。阅读论文可分为三个阶段:第一阶段是:看论文中是否有感兴趣的东西。论文可能含有摘要,其中可能有内容的介绍,但是也有可能没有或者总结得不好,因此需要你跳读,这看一点那看一点,了解作者究竟做了些什么。内容目录(the table of contents)、结论部分(conclusion)和简介(introduction)是三个重点。如果这些方法都不行,就只好顺序快速浏览了。一旦搞清楚了论文的大概和创新点,就可以决定是否需要进行第二阶段了。

在第二阶段,要找出论文真正具有内容的部分。很多15页的论文可以重写为一页左右的篇幅;因此需要你寻找那些真正激动人心的地方,这经常隐藏于某个地方。论文作者从其工作中所发现的感兴趣的地方,未必是你感兴趣的,反之亦然。最后,如果觉得该论文确实有价值,返回去通篇精读。读论文时要牢记一个问题,“我应该如何利用该论文?”“真的像作者宣称的那样么?”“如果..会发生什么?”。理解论文得到了什么结论并不等同于理解了该论文。理解论文,就要了解论文的目的,作者所作的选择(很多都是隐含的),假设和形式化是否可行,论文指出了怎样的方向,论文所涉及领域都有哪些问题,作者的研究中持续出现的难点模式是什么,论文所表达的策略观点是什么,诸如此类。将阅读与程序设计联系在一起是很有帮助的。如果读者对某个领域感兴趣,在阅读了一些论文后,试试实现论文中所描述程序的“玩具”版本。这无疑会加深理解。要知道,其他的机构具有不同的思考问题的方式,值得去阅读,严肃对待,并引用它们的工作,即使你认为自己明晓他们的错误所在。

在第三阶段,经常会有人递给你一本书或者一篇论文并告诉你应该读读,因为其中有闪光的地方或可以应用到你的研究工作中。但等你阅读完了,你发现没什么特别闪光的地方,仅仅是勉强可用而已。于是,困惑就来了,“我哪不对啊?我漏掉什么了吗?”实际上,这是因为你的朋友在阅读书或论文时,在头脑中早已形成的一些想法的催化下,看出了其中对你的研究课题有价值的地方。

 

二、建立关系

研究生一两年后,对自己准备从事的子领域已经有了一些想法。一般而言,引导所在领域潮流的工作最终会变成正式发表的论文,但至少在领域高手(领先者)完全明白一年之后,也就是说,高手的工作至少领先一年。

高手是如何发现新思路的?可能是来自某次会议,也可能来自于与别人的交流。下面是从新思路产生到发表的一般流程。Jo Cool有了一个好想法,她将尚不完整的实现与其他一些工作融合在一起,写了一份草稿论文。她想知道这个想法究竟怎么样,因此她将论文的拷贝发送给十位朋友并请他们进行评论。朋友们觉得这个想法很棒,同时也指出了其中的错误之处,然后这些朋友又把论文拷贝给他们各自的一些朋友,如此继续。几个月后,Jo对之进行了大量修订,并送交给AAAI(the Association for the Advancement of Artificial Intelligence)。六个月后,该论文以五页的篇幅正式发表(这是AAAI会议录允许的最大篇幅)。最后Jo开始整理相关的程序,并写了一个更长的论文(基于在AAAI发表论文得到的反馈),然后送交给某某期刊。某某刊要花大约两年的时间,包括对论文进行评审,作者对论文修改所花费的时间,以及相应的出版延迟。因此,理想情况下,Jo的思想最终发表在期刊上需要大约三年时间。所以潮人很少能从本领域出版的期刊文章中学到什么东西,来得太迟了。

你,也可以成为一个高手。下面是建立学术关系网的一些诀窍:有很多讨论某个自己研究的子领域(如机器视觉)的邮件列表,选择自己感兴趣的列表加入。 当与很熟悉本领域的人讨论自己的思想时,他们很可能不直接评价你的想法,而是说:“你读过某某吗?”这并不是一个设问,而是建议你去阅读某份文献,它很可能与你的想法有关。如果你还没有读过该文献,从跟你交谈的高手那里得到该文献的详细信息,或者直接从他那里借一份拷贝下来。当你读到某份让你感到很兴奋的论文,复印五份送交给对之感兴趣的其他五个人,他们可能会反馈回来很好的建议。

有的实验室每星期或每两星期聚会一次,对大家阅读完的论文进行讨论。有些人并不介意别人去翻看他们的书桌,也就是说,去翻阅他们堆在书桌上的不久要阅读或者经常翻阅的论文。你可以去翻翻看,有没有自己感兴趣的。当然了,首先要得到主人的许可,要知道有些人确实反感别人翻自己的东西。去试试那些平易近人的人。同样,有些人也并不介意你翻看他们的文件柜。实验室中可是有很多学问精深的人,他们的文件柜里也是有好多宝贝。与利用学校图书馆相比,这通常是更快更可靠的寻找论文的方式。把自己写出的草稿的拷贝分发给那些可能感兴趣的人(这也有一个潜在的问题:虽然所在领域的剽窃很少,但也确实有。你可以在第一页写上“请不要影印或者引用”的字样以做部分防范)。大部分人不会阅读自己收到的大部分论文,因此如果只有少数人返回评论给你,也不用太在意。你可以如此反复几次——这是期刊论文所必需的。注意,除了自己的导师,一般很少将两次以上的草稿送给同一个人。

当你写完一篇论文后,将论文的拷贝送给那些可能感兴趣的人。别以为人家自然而然地就会去阅读发表论文的期刊或者会议录。如果是内部的出版物(备忘录和技术报告)就更不容易读到了。

你保持联系的人越是各式各样,效果就越好。尝试与不同研究组、实验室人员、不同学术领域的人交换论文,使自己成为没有联系的两个科研组交流的桥梁,这样,很快的,你的桌子上就会冒出一大摞相关的论文。

如果某篇论文引用了自己感兴趣的某些东西,做好笔记。维护一份自己感兴趣参考文献的日志。到图书馆去看看能不能找到这些论文。如果要了解某个主题的发展轨迹,可以有意地去做一张引用的参考文献。所谓的参考文献图,是指引用文献组成的网:论文A引用B和C,B引用C和D,C引用D,等等。注意那些被经常引用的论文,这通常是值得阅读的。参考文献图有奇妙的性质,由于经常研究同一主题的研究组可能相互并不了解,当你搜索该图时,会突然发现进入另一部分的方式,这通常出现于不同学校或者采用不同方法的研究组。尽可能了解多种方法是很有价值的,这比非常深入的了解某一种方法更好。

跟别人交谈,告诉他们你在做什么,并询问人家在做什么。(如果你对与别的学生讨论自己的想法感到害羞,也要坚持交谈,即使自己没有什么想法,与他们讨论自己认为确实优秀的论文。这将很自然地引导到下一步做什么的讨论。)当然也可以参加一些非正式的讨论会,比如在午餐时。

从某个时间开始,你将会开始参加学术会议。如果你确实参加了,你会发现一个事实,几乎所有的会议论文都令人生厌或者愚蠢透顶(这其中的理由很有意思,但与本文无关,不做讨论)。那还去参加会议干吗?主要是为了结识实验室之外的人。外面的人会传播有关你的工作的新闻,邀请你作报告,告知你某地的学术风气和研究者的特点,把你介绍给其他人,帮助你找到一份暑期工作,获得到别的实验室工作的机会,诸如此类。如何与别人结识呢?如果觉得某人的论文有价值,就跑上去,说:“我非常欣赏您的论文”,并提问一个问题。这样你会结识另外一群人,或许还会学到另外一种看待事物的方式。可以去问高年级同学如何获取这样的机会,他们或许已经在你想去的地方工作过了,能帮你联系。

 

三、学习其他领域

通常的情况,你只能做自己研究领域的事情,对自己研究领域之外的事情一无所知,好像有些人现在也仍然这么认为。但是,现在要求好的研究者对几个相关的领域都了解颇深。计算的可行性本身并没有对什么是智能提供足够的约束,其他的领域给出了其他形式的约束,例如心理学获得的经验数据。更重要的是,其他的研究领域给了你思考的新工具,看待智能的新方法。学习其他领域的另外一个原因是自己研究的领域本身并没有评价研究价值的标准,全是借自于其他领域。数学将定理作为进展;工程会问某个对象是否工作可靠;心理学要求可重复的试验;哲学有严格的思辨;等等。所有这些标准有时都在自己研究领域中起作用,熟悉这些标准有助于你评价他人的工作,深入自己的工作以及保护自己的工作。

下面是如何学习自己所知甚少领域的一些方法:

选修一门研究生课程,这很牢靠,但通常不是最有效的方法。

阅读课本。这方法还算不错,不过课本的知识经常是过时的,一般还有很高比例的与内容无关的修辞。

找出该领域最棒的期刊是什么,向该领域的高人请教。然后找出最近几年值得阅读的文章,并跟踪相关参考文献。这是最快的感受该领域的方法,但有时候你也许会有错误的理解。

找出该领域最著名的学者,阅读他们所著的书籍。

跟该领域的研究生泡在一起。

参看外校研究该领域的系的课程表。拜访那里的研究生院办公室,挑选有用的文献。

下面是一些需要了解的我们研究领域相关的科目(可能与我们的研究方向有出入,供大家参考):

计算机科学是我们所使用的技术。你需要选修的初级研究生课程肯定不能让你对计算机科学有足够的了解,因此你必须通过阅读学习更多的知识。计算机科学所有的领域——理论体系结构,系统,语言等等——都是必须学习的。

数学可能是接下来需要了解的最重要的学科。对于工作在视觉或者医学图像处理的人来说更关键。对于以系统为中心的工作,表面上看,并不相关,但数学会教你有用的思维方式。你需要能阅读定理,如果具有证明定理的能力将会给本领域的大多数人留下深刻的印象。很少有人能自学数学,光做个听众是不够的,还得做习题集。尽可能早地选修尽可能多的数学课,其他领域的课程以后选也很容易。计算机科学是以离散数学为基础的:代数,图论,等等。如果你要从事推理方面的工作,逻辑是很重要的。逻辑是认识思维的主流方法。所以你必须具备足够的逻辑知识,这样你才能保护自己的观点。

每一个人都需要知道认知心理学的某些知识。如果你想做有关学习的工作,那么发展心理学是很重要的。发展心理学从一般意义上讲也是很有用的,它能告诉你对于人类来说,哪些事情难哪些容易。它还给出了有关认知体系结构的认知模型。例如,有关儿童语言学习的工作就对语言处理理论施加了坚实的约束。

心理学中更“软”的部分,例如心理分析和社会心理学,对自己研究领域的影响看似很小,但具有潜在的重大意义。它们会给你非常不同的理解人是什么的方式。像社会学和人类学这样的社会科学可以起相似的作用。具有多种观点是很有用的。上述学科你有可能需要自学,不幸的是,很难区分出这些领域哪些是优秀的成果哪些是垃圾。

物理学对于我们某些研究领域也具有极大的影响。

哲学是某些研究领域看不见的框架。哲学也能帮助你运用或者读懂很多自己研究领域论文中用到的观点。有关思维和语言的哲学与自己研究领域更相关。哲学存在着多种学派,从比较大的范围来分,哲学可分为分析哲学和大陆哲学。大陆哲学则对我们习以为常的很多东西有非常不同的看待方式。

看起来要学习太多的东西,是不是?确实如此。要小心一个陷阱:认为对于所有的X,“只有我对X了解的更多,这个问题才会变得容易”。要知道,与之相关需要进一步了解的东西是永远没完的,但最终你还是要坐下来去解决问题的。

 

四、笔记

很多科学家都有做科研笔记的习惯,你也应该这样。可能你曾被告知从五年级开始,对于每一门科学课都应该记笔记,确实如此。不同的记笔记方式适用于不同的人,可以做在线笔记,记在笔记本或者便笺簿上。可能需要在实验室有一个,家里还有一个。在笔记本上记录下自己的想法。只有你自己才会去读它,因此可以记得比较随意。记录下自己的思索,当前工作中遇到的问题,可能的解决方案,对将来可能用到的参考文献作小结。定期翻阅你自己的笔记本,有些人会做月度总结,方便将来的引用。

笔记中记录中的东西经常可以作为一篇论文的骨干。这会使生活变得轻松些。另外,你会发现写粗略的论文——标题,摘要,分标题,以及正文的片段——是一种记录自己当前工作的有效方式,即使你并不准备把它变成一篇真正的论文(过一段时间你或许会改变想法)。你或许会发现Vera Johnson-Steiner的书《Notebooks of the Mind》很有用,该书并不是描写如何做笔记,它描述了随着思想片断的积累,创新思想是如何出现的。

 

五、写作

写作的理由有很多。勤于写作不仅仅给你练习的机会。

在整个读研的过程中,你需要写一到两篇(这取决于你所在系的规定)毕业论文,以获得Ph.D.或者MS。

学术的规则就是要么发表,要么腐烂。在很多领域和学校,这通常只有在你成为一名教师时才会要求。但是我们实验室的很多研究生毕业之前就已经开始发表论文了。鼓励论文发表是促进研究的很好策略。

写下自己的想法是很好的调整思路的方式。你会经常地发现自以为很完美的想法一旦写下来就显得语无伦次。

如果你工作的目的是不仅为自己还要为他人服务,就必须把它发表。这也是研究的基本责任。如果你写得精彩,会有更多的人来了解你的工作。自己单独完成写作是很难的,你需要经常地从他人那里获得反馈。对你的论文作评论就是最重要的一种形式。任何事情,要做就要做到最好

阅读有关如何写作的书籍。Strunk和White的《Elements of Style》对写作中基本的应该如何不应该如何做了介绍。Claire的《The MLA's Line By Line》(Houghton Mifflin)是有关在句子级别如何进行编辑的书籍。Jacques Barzun的《Simple and Direct: A Rhetoric for Writers》(Harper and Row, 1985)是有关如何作文的。

写论文时,读读那些写作高超的书,并思考作者的句法运用。你会发现不知不觉地,你已经吸收了作者的风格。

成为写作高手,需要付出颇多,历经数年,期间还要忍受和认真对待他人的批评。除此之外,并无捷径可走。

写作有时候是很痛苦的,看起来好像是从“实际的”工作中分心了。但如果你已经掌握了写作技巧,写起来会很快。而且如果你把写作当作一门艺术的话,你能从中得到很多乐趣。

你肯定会遇到思路阻塞的情况,这有很多的可能原因,没有一定可以避免的方法。追求完美可能导致思路阻塞:无论开始写什么,总觉得不够好。要理解写作是一个调试的过程。先写一个草稿,然后返回修订。写草稿有助于理顺思路,如果写不出来正文,那就写个大纲。逐步对之细化,直到已经很容易写出各部分的内容。如果连草稿也写不出来,隐藏掉所有写作窗口,然后随便输入自己脑袋里想到的东西,即使看起来好像是垃圾。当你已经写出了很多文本后,重新打开窗口,将刚才写的东西编辑进去。

另外写作中一个常见错误是以为可以将所有的内容依次写出。通常你应该将论文的核心内容写出来,最后才是介绍部分。引起作者思路阻塞的另一个原因是不切实际的以为写作是很容易的事情。写作是耗时耗力的,如果发现自己每天只能写一页,也不要放弃。

完美主义可能会导致对本来已经足够好的论文还在不停地打磨。这是浪费时间(这也是一种有意无意之间逃避做研究的表现)。将论文看作你与本领域其他人交谈时的谈话。在交谈中,并不是每一句话都是完美的。很少有人会期待自己的某次谈话就是全部的故事,是与对方的最后一次交流。

写信是一种很好的练习。很多技术论文,如果其风格更类似于给朋友的信,那么会有很大的提高。坚持记日记也是练习写作的方法(也会使你试验更多的文体,不仅仅是技术论文)。这两种方法还有其它的实质作用。

一个常见的陷阱是花很多时间去追求修辞而不是内容。要避免这样。LaTeX并非完美,但是它有很多你所需的修饰语。如果这还不够,还可从其他从事这一研究的人那里借用一些词语用法。很多站点(例如MIT)都提供一个写作修辞的数据库。

清楚自己要表达什么。这是清楚的写作中最难最重要的因素。如果你写了拙劣的东西,且不知道如何修改,这很有可能是因为你不知道自己要说什么。一旦搞清楚了自己要说什么,说就行了。

论文的写作要有利于读者查找到你所做的工作。无论是段落的组织还是通篇的组织,都要将最核心的部分放在前面要精心写作摘要。确保摘要已经反映出你的好思路是什么。确保自己明白自己的创新点是什么,然后用几句话表达出来。太多的论文摘要只是一般性地介绍论文,只说有一个好思路,却不说是什么。

不要用大话来贩卖你的工作。你的读者都是很优秀的人,正直且自尊。与之相反,也不要为自己的工作道歉或者进行消减。

确保自己的论文有中心思想。如果你的程序在10毫秒内解决了问题X,告诉读者你是如何办到的。不要只是解释你的系统是如何构建的,是做什么的,还要解释其工作原理和价值所在。

写作是给人看的,而不是机器。因此仅观点正确是不行的,还要易懂。不要靠读者自己去推理,除非是最明显的推论。如果你在第七页的脚注上解释了某个小玩意的工作原理,接着在第二十三页没有进一步解释就引用了它,此时如果读者感到困惑一点都不值得奇怪。正式的论文要写清楚是很难的。不要模仿数学领域的文献,它们的标准是尽可能少的解释,使读者感到越困难越好。

如果你等做完所有的工作后才开始写作,会失去很多。一旦开始了某个科研项目,建议养成这样的习惯:每隔几个月,就写一篇解释当前工作进展或者学习所得的非正式论文。从你研究笔记中的记载开始,花两天的时间写下来——如果你花的时间更长,说明你是一个完美主义者。写的只是草稿——不是为了被引用的那种。将论文复制数十份,送给你的朋友和那些感兴趣的人(包括你的导师)。与写正式论文相比,这样做也有很多好处(评论,理清思路,写作练习等等),而且从某种意义上讲,付出无需那么多。如果你做得不错,这些非正式论文以后可以作为正式论文的骨干内容,也就是从自己实验室的Working Paper成为一篇期刊文章。一旦你成为Secret Paper Passing Network的成员,会有很多人给你寄论文拷贝要求评论。获得他人对自己的论文的评论是很有价值的。因此你评论的论文越多,你获得支持就越多,也会收到更多人对你论文的评论。不仅如此,学习评价别人的论文也有助你的选择。为论文写有用的评论是一门艺术。

要写出有用的评论,需要读两遍论文。第一遍了解其思想,第二遍开始作评论。如果某人在论文中屡次犯同一错误,不要每次都标记出来。而是要弄清楚模式是什么,他为什么这样做,对此还可以做什么,然后在第一页清晰地指出或者私下交流。

不要在论文写毁灭性的批评如“垃圾”,这对于作者毫无帮助。花时间提出建设性的建议,要设身处地地为作者着想。评论有很多种,有对表达的评论,有对内容的评论。对表达的评论包括校对打字稿、标点、拼写错误、字词丢失等;还可以是校正语法,修辞,以及混乱不清楚的段落。通常人们会持续地犯同一语法错误,因此需要花时间明确指出。接下来是对组织结构的评论:不同程度(子句,句子,段落,小节乃至一章)的次序混乱,冗余,无关的内容,以及论点是否丢失。你可以建议作者扩展自己的想法,考虑某个问题或错误,论文存在的潜在问题,表达赞美等。“因为Y,你应该读X”是一种总是有用的评论。当被要求对论文作评论时,你首先要弄清楚哪种评论更有用。对于早期的论文草稿,主要需要你对内容和论文的组织结构作评论;对于最终的草稿,主要需要你评论表达的细节。

注意,作为一种礼貌,在要求别人评论之前,应首先用拼写检查器对自己的论文进行检查。你无须接受所有的意见,但是必须都认真对待。将论文的部分内容裁掉是挺令人痛心的,但往往也提高了论文的水平。你经常会发现某个意见确实指出了问题,但是解决方法你觉得不可接受,那么就去寻找第三条道路。要多发表论文,这其实比想象中的容易。

确保论文可读性比较好。论文被拒绝的原因,除了没有意义之外,就是无法理解或者组织糟糕。

通常是先向会议投交一篇篇幅比较短的有关工作内容的早期报告,然后再往期刊投交一份篇幅较长的最终正式论文。看看IJCAI(International Joint Conferences on Artificial Intelligence)的会议录,你会发现会议论文录取的标准相当低。而且由于会议评审过程本身固有的随机性,录取的标准变化更大,所以一个发表论文的诀窍是不停地试。主要的会议都会在被接收的论文中评出内容和表达俱佳的获奖论文,仔细研究研究。

论文在投往期刊之前,应该交流一段时间,并根据反馈的评论进行适当的修订。要抵制那种急匆匆地把结果投往期刊的做法。在自己的研究领域,没有竞赛,而且不管怎么说,出版周期的延迟要大大超过对草稿进行评论的时间。另外,读一读你想投稿的期刊或者会议的过刊,确保自己论文的风格和内容是适合的。很多出版物都有一页左右的“作者投稿须知”,仔细看看。

论文被拒绝了,千万不要沮丧灰心。

期刊和会议的论文评审过程存在很大的不同。为了节省时间,会议论文的评审必须迅速,没有时间细究或者交流。如果你被拒绝了,你就失败了。但期刊论文则不同,你可以经常地与编辑争辩,通过编辑与评审人争辩。如果你收到了令人生厌的评审报告,应该向大会的程序主席或者编辑投诉。评审人一般都会对你有所帮助,当然不能期望可以从会议论文评审人那里得到多少反馈,但对于期刊论文,往往可以得到非常棒的建议。你不必完全按照评审报告的建议去做,但是,如果你不按照报告去做,那么就必须解释原因,并且要意识到这可能会导致进一步的负面评价。不管怎么样,无论是哪种评审,作为被评审者都要有礼貌。因为在余下的职业生涯中,你将会与评审者在一个学术圈子里。

论文写作所花的时间总是比期望的要高,论文的发表在耗费时间这个问题上则更严重。当你完成了一篇论文,投出去,等待发表。数月后,论文以及评论意见被返回来,你不得不对论文进行修改。然后又是几个月,才返回对你修改的确认。如果你同时发表了该论文的不同形式,如有一篇短的投会议,一篇长的投期刊,这样的过程将反复数个回合。结果有可能是当你已经厌倦了,研究主题也已经令人生厌后数年,你仍然在修改那篇论文。这启示我们:不要去做那些需要热情投入但是很难发表论文的研究,那将苦不堪言。

 

六、讲演

与同行交流的另外一种方式就是讲演,上面提到的有关论文写作的问题,同样适用于讲演。站在听众面前从容讲演而不会使听众恹恹欲睡的能力,对于你成功地获得别人的承认、尊敬乃至最终的求职都是非常关键的。讲演的能力不是天生的,下面是一些学习和练习讲演的方法:

Patrick Winston有一篇很好的有关如何作讲演的小论文。每年的一月,他都会就此作讲演,演示和描述他的演讲技巧。

如果你觉得自己是一个糟糕的演讲者,或者想成为一名优秀的演讲者,选一门公共演讲课。初级的表演课也很有用。

如果你的导师有定期的研究讨论会自愿去作演讲

计算机教研室有一系列的半正式报告座谈会,如果你觉自己的某些观点值得写进研究领域的Memo或者会议论文中,自告奋勇去作一场报告。

深入了解实验室的不同人研究的项目,当你外地的亲朋好友来的时候,你可以领着他们逛一圈,并就自己研究的内容做20分钟的汇报。

由于修改演讲远比修改论文容易,有些人会觉得这是很好的寻找如何表达思想的方式(Nike Brady有一次曾说,他所有最好的论文都来自于演讲)。

在一间空屋子里练习,最好就是你马上要做的报告。这有助于调整报告的技巧:每一张幻灯讲些什么;转换的延迟以及保持衔接;保持解释和幻灯的同步;估计报告的时间长度。你花在调整设备上的时间越少,留下来的与人交流的时间就越长。

用镜子,录音机或者录像机练习是另外一种方法。实验室会提供这三种设备,这也有助于调整自己的发音和肢体语言。

对于比较正式的报告,特别是你的答辩,应该在几个朋友面前练习一遍,请他们批评指正。

观察别人是如何做报告的。有很多访问MIT的人会做报告,参加这样的报告会能够感受自己不熟悉的领域,并且如果报告令人提不起兴趣,你可以暗中分析报告者错在哪里。

找一位朋友,将你最近的想法说给他听。这既可以提高交际技巧,又能检验自己的思路。

 

七、程序设计

并不是所有自己研究领域的论文都包含代码,而且本领域的很多重量级人物从来没有写过一个重要的程序。但是为了掌握自己研究的工作原理,你必须会程序设计。不仅仅是很多计算机研究工作需要编写代码,学会程序设计还能带给你什么是可计算的什么是不可计算的直觉。

当然,学习一门语言并不能等同于学习程序设计;自己的程序设计包含的一些技术与那些在系统程序设计或者应用程序设计中用到的大不相同。开始学的时候,可以先看看Abelson和Sussman的《Structure and Interpretation of Computer Programs》,并做一些练习。这本书与自己所研究的程序设计本质上并不相干,但是包含了一些相同的技术。最后,进行实际的程序设计,而不是阅读,才是最好的学习程序的方法。

学习程序设计有很多传统。有些人习惯一起写代码,这取决于个性。还有的人寻找机会直接向有经验的程序员学习,或者请他对你的代码进行评价。阅读别人的代码也是很有效的方法。如果可以向高年级同学要他们的源代码,他们可能会有些抱怨,说自己的编程风格差极了,程序实际上并不能工作云云。不管怎么样,最后你获得了源代码。然后你要仔细地通篇阅读,这很费时间。通常阅读并完全理解别人代码所花的时间与你自己编程完成的时间是一样多的,因此要计划好在你的头一个或者头两个学期用数周的时间去阅读别人的代码。你将从中学到很多以前不曾想到在课本中也没有的技巧。如果你读到了整篇不可理解没有注释的程序,你就会明白不应该如何写代码了。在软件工程课里学习到的那些知识在自己的程序设计中很有可能依然有用。要给代码加注释,使用正确的数据抽象,将数据和你的代码隔离开,提高可移植性,诸如此类。经过头几年的学习后,就应该写一些自己的标准程序设计模块了。

任何你感兴趣的东西都可以尝试用程序实现。你可以抓住问题的实质,在几天之内完成一个功能版本。修改已有的程序是另外一种有效的方法,前提是你已经写过这样的东西,并且确实了解其工作原理,优缺点以及效率等问题。不像其他通常的程序员相互借阅代码(演示代码例外)。虽然可以对代码进行修改满足自己的需要,但记住理解别人的代码是很耗时的,有时候还不如自己写一个。有时候构建一个标准包的工作本身就可以成为一篇论文。像论文一样,程序也有可能过于追求完美。不停重写代码以求完美,最大化的抽象所有的东西,编写宏和库,与操作系统内核打交道,这都使得很多人偏离了自己的论文,偏离了自己的领域(从另外一方面,或许这正是你需要将来谋生的手段)。

 

八、导师

导师应该有两种类型,教学导师和论文导师,由于一些客观原因,我们科里的导师身兼两职,既是教学导师又是论文导师。

教学导师的作用是作为系方代表,告诉你对你的正式要求是什么,如果你的进度慢了敦促你,批准你的课程计划等。如果一切顺利的话,你每年只需要见教学导师两次,在注册日那天。从另一方面讲,如果你遇到了困难,教学导师替你向系里反映或者提供指导。论文导师是监督你研究的人,选择论文导师是你读研期间最重要的选择,比选题都重要得多。有很多领域的技术方面或者研究过程中的非正式知识,只能从导师那里学到,在任何教科书上都找不到。导师与研究生的关系是非常个性化的,你的个人特点必须与导师的配合得很好,这样你们才能合作成功。不同的导师具有不同的风格。

下面是一些需要值得考虑的因素(对四医大而言,基本上在录取时就确定了导师,下面亦可作为与导师交流及课题选择时的参考):

你需要多大程度的指导?有些导师会给你一个定义良好的适合做论文的问题,对解决方法进行解释,并告诉你如何开展工作。如果你陷在某个地方了,他们会告诉你如何开展下去。有些导师则属于甩手型,他们可能对你的选题毫无帮助,但是一旦你选好题目,他们对于引导你的思路具有非常大的作用。你需要考虑清楚自己适合独立工作还是需要指导。

你需要多大程度的联系?有的导师要求每周与你见面,听取你工作进展的汇报。他们会告诉你应该读的论文,并给你实际的练习和项目做。而有些导师每学期与你的谈话不会超过两次。

你能承受的压力有多大?有些导师施加的压力是很大的。

听取导师意见的认真程度如何?大多数导师会相当正式地建议你的论文题目。有些导师是值得信赖的,他们给出的建议,如果按照执行,几乎肯定会做出一篇可接受的论文,如果不是令人兴奋的论文的话。有些导师则一下子抛出很多思路,大部分是不切实际的,但是有一些,或许会导致重大突破。如果选了这样的一位导师,你首先得把自己当作一个过滤器。

导师提供了什么类型的研究组?有些教授会创造环境,把所有的学生聚集在一起,即使他们做的不是同一个项目。很多教授每周或者每两周与自己的学生们会面。这对你有用么?你能与教授的学生和睦相处么?有些学生发现他们更能与其他教研组的学生建立良好的工作关系。

你想参与大的项目么?有些教授将大系统分解,每个学生负责一部分。这给了你与一组人讨论问题的机会。有些论文项目包含了多个研究领域,需要你与两个以上的教授建立密切的工作关系。虽然你正式的论文导师只有一位,但是有时候这并不反映实际情况。

导师愿意指导其研究领域之外的论文题目么?你是否能与导师一起工作,比你做什么本身更重要。推理方面的教员指导过视觉方面的论文。但是有些教员只愿意指导自己研究兴趣领域内的论文,这对于那些欲获得终身职位的年轻教员来说尤其如此。

导师愿意并且能够在会议上推荐你的工作吗?这是导师工作的一部分,对你将来工作意义重大。上述这些因素,不同学校的情况很不相同。

研究生研一结束或研二学年开始阶段,必须找导师对你的论文进行指导,下面是一些诀窍。查阅实验室的研究总结,其中有一页左右的篇幅描述了每个教师以及很多研究生目前在做什么。如果你对某些教师的研究工作感兴趣,查阅其最近的论文。在第一学期,与尽可能多的教师交谈,去感受他们喜欢做什么,他们的研究和指导风格是什么。与预期导师的研究生交谈,要保证与导师的多个学生交流,因为每位导师在与不同的学生交流时有不同的工作方式和交流效果,不能被一个学生的看法所左右。很多教师所在研究组的会议对新同学都是公开的,这是非常好的了解导师工作方式的途径。不要由于交流不好,浪费时间在自己并不想做的项目上。不要完全依赖你的导师,要建立自己的网络,找一些能定期评审你的工作的人是很重要的,因为研究时很容易走火入魔。网络中的人可以包括自己实验室或者外单位的研究生和老师。实验室中有些同学只是名义上由导师指导,这对于那些独立性很强的人来说很好。除非你确保自己没有导师也行,且有牢靠的支持网络,否则就不要这么干。

 

九、论文

做论文将占据研究生生活的大部分时间,主要是去做研究,包括选题,这比实际的写作耗时更多。硕士论文的目的是为做博士论文练兵。博士水平的研究如果没有准备好的话,是很难进行的。硕士论文最本质的要求是展示自己的掌握程度:你已经完全理解了本领域最新进展,并具备相应的操作水平。并不需要你对本领域的最新知识有所拓展,也不要求发表你的论文。但我们实验室的论文总是比较大气的,因此很多硕士论文实际上都对本领域的发展做出了显著的贡献,大约有一半都出版了,这并不一定是好事情,很多人精力都集中于硕士的工作,所以我们也有这样的名声:硕士论文的质量往往比博士论文高。这有悖于硕士工作本来是为博士研究做准备的原有目的。

论文的另外一个因素是所做研究要对领域有所贡献,至少需要两年,这使得研究生学习时间之长令人难以忍受。现在或许你感受不到匆忙,但当你已经在实验室呆了七年后,你肯定迫不及待地想逃出去。硕士从入学到毕业平均时间是两年半,如果某个硕士生的题目过于庞大,可将之分解,一部分来做硕士论文,另一部分给博士生作博士论文。想要了解硕士论文研究是什么样的,读几本最新的硕士论文。记住比较好的论文是那些出版的或者成为技术报告的,因为这标志着该论文被认为是扩展了领域的最新知识——换句话说,他们的论文远远超出了硕士论文的水平。还要读一些通过的但是没有出版的论文。博士论文必须对最新知识有所拓展,博士论文的研究必须具备可出版的质量。

选题是论文工作中最重要最困难的部分:好的论文题目不仅能够表达个人观点,而且可与同行交流。选择题目必须是自己愿意倾注热情的,其远景是你愿意作为一个科学家的理由,是你最为关注的目标。或许你想造一台可与之交谈的计算机,或许你想把人类从计算机的愚蠢使用中拯救出来,或许你想展示万物都是统一的,或许你想在太空发现新生命。远景观点总是比较大的,你的论文并不能实现你的远景,但是可以朝着那个方向努力。

做论文时,最困难的就是如何将问题缩减至可解决的水平,同时规模又足以做一篇论文。题目太大太虚了,你会发现需要不断的缩小题目的范围。选题是一个渐进的过程,会持续到你宣布论文已经完成那一刻为止。实际上,解决问题通常比精确地描述问题要容易得多。如果你的目标是一个五十年的工程,那么合理的十年工程是什么,一年的呢?如果目标的结构庞大,那么最核心的部件是什么?如何最大程度的了解核心部件?一个重要的因素是你可以忍受多大程度的风险。在最终的成功和风险之间需要权衡。

好的论文选题要有一个中心部分,你确信肯定可以完成,并且你和你的导师都同意这已经满足毕业要求了。除此之外,论文中还有多种扩展,有失败的可能,但如果成功了,会增加论文的精彩程度。虽然不是每一个论文选题都符合这个模式,但值得一试。有些人觉得同时在多个项目中工作可以在选题的时候选择可以完成的那个,这确实降低了风险。另外一些人则愿意在做任何工作之前,选一个单独的题目。

可能你只对某个领域感兴趣,这样你的选题范围就狭窄得多。有时候,你会发现系里的老师没有一个人能够指导你选择的领域,可能还会发现好像那个领域没什么很自然的选题,反而对别的领域有好想法。硕士选题比博士选题更难,因为硕士论文必须在你所知不多没有足够自信时就完成。博士选题需要考虑的一个因素是是否继续硕士阶段所研究的领域,可能拓展或者作为基础,或者干脆转到另外一个领域。待在同一个领域事情就简单了,可能只需要一到两年就毕业了,特别是如果在硕士阶段的工作中已经发现了适合做博士论文的题目。不足之处在于容易定型,改换领域则能增加知识的宽度。

有的论文题目很新奇,有的则很普通。前者开创了新领域,探索了以前未曾研究过的现象,或者为很难描述的问题提供了有效的解决方法;后者则完美地解决了定义良好的问题。两种论文都是有价值的,选择哪一种论文,取决于个人风格。

无论选什么样的题目,必须是前人未曾做过的。即使是同时有人做的工作,也不好。有很多东西可作,根本无需竞争。还有一种常见的情况,读了别人的论文后感觉很惊慌,好像它已经把你的问题解决了。这通常发生在确定论文题目过程中。实际上往往只是表面类似,因此将论文送给某个了解你的工作的高人看看,看他怎么说。另外,每个论文的“将来的工作”部分,是很好的论文题目来源。

选好题后,你必须能够回答下列问题:论文的论点是什么?你想说明什么?你必须分别有一句、一段、五分钟的答案。如果你不知道自己在干什么,别人也不会严肃对待你的选题,更糟糕的是,你会陷在选题——再选题的圈子里而不能自拔。开始作论文研究后,一定要能够用简单的语言解释每一部分的理论和实现是如何为目标服务的。记住,一旦选好了题目,你必须与导师就论文完成的标准达成清晰的一致。如果你和他对论文具有不同的期望,最后你肯定死得很惨。必须定义好“完成”的测试标准,像一系列的能够证明你的理论和程序的例子,这是必须做的,即是你的导师并不这么要求。如果环境发生了根本的变化,测试也要随之改变。用实例检验是最简单的测试方式。做论文的过程中,有很多浪费时间的方式,要避免下列活动(除非确实跟论文相关):语言表达的设计;用户接口或者图形接口上过分讲究;发明新的形式化方法;过分优化代码;创建工具;官僚作风。任何与你的论文不是很相关的工作要尽量减少。一种众所周知的“论文逃避”现象,就是你突然发现改正某个操作系统的BUG是非常吸引人也很重要的工作,此时你总是自觉不自觉的偏离了论文的工作。要记住自己应该做些什么(本文对于部分作者来说就属于论文逃避现象)。

 

十、研究方法论

研究方法学定义了什么是科研活动,如何开展研究,如何衡量研究的进展,以及什么叫做成功。不同的方法论定义了不同的研究学派。方法是工具,使用即可,不要让他们来使用你,不要把自己陷于口号之中:“在问为什么之前,先搞清楚计算的是什么”。 实际上,要在自己研究领域取得成功,你必须擅长各种技术方法,还必须具备怀疑的态度。例如,你必须能够证明定理,同时你还必须思考该定理是否说明了什么。

很多优秀的篇章都是巧妙地在几种方法论中取得平衡。例如,你必须选择一条在太多理论(可能与任何实际问题都无关)和繁琐的实现(把实际的解决方法表达得语无伦次)之间的最佳路线。你经常会面临区分“干净”和“肮脏”的研究决策。你应该花时间将问题在某种程度上形式化吗?还是保持问题的原始状态,此时虽然结构不良但更接近实际?采用前一种方法(如果可行的话)会得到清晰确定的结果,但这一过程往往是繁琐的,或者至少不会直接解决问题。后者则有陷入各种处理的漩涡之中的危险。任何工作,任何人,必须做出明智的平衡。有些工作像科学:你观察人们是怎样学习算术的,大脑是如何工作的,袋鼠是如何跳的,然后搞清楚原理,形成可检验的理论。有些工作像工程:努力创建一个更好的问题解决方法或者算法。有些工作像数学:跟形式化打交道,要理解属性,给出证明。有些工作是实例驱动的,目标是解释特定的现象。最好的工作是以上几种的结合。方法具有社会性,看看别人是如何攻克类似难题的,向别人请教他们是如何处理某种特殊情况的(内容有些难于理解,可尽量体会)。

 

十一、情感因素

研究是艰苦的工作,很容易对之失去兴趣。一个令人尴尬的事实是在本实验室读博的学生只有很少比例最后获得学位。有些人离开是因为可以在产业界赚到更多的钱,或者由于个人的原因;最主要的原因则是由于论文。本节的目标是解释这种情况发生的原因,并给出一些有益的建议。

所有的研究都包含风险。如果你的项目不可能失败,那是开发,不是研究。面对项目失败时是多么艰难啊,很容易将你负责的项目失败解释为你自己的失败,虽然,这实际上也证明了你有勇气向困难挑战。在人工智能领域很少有人总是一直成功,一年年地出论文。实际上,失败是经常的。你会发现他们经常是同时做几个项目,只有一些是成功的。最终成功的项目也许反复失败过多次,经历过很多由于方法错误的失败之后,才取得最终的成功。在你以后的工作生涯中,会经历很多失败。但是每一个失败的项目都代表了你的工作,很多思想,思考方式,甚至编写的代码,在若干年后你发现可用于另外一个完全不同的项目。这种效果只有在你积累了相当程度的失败之后才会显现出来。因此要有最初的失败后才会成功的信念研究所花费的实际时间往往比计划的要多得多,一个小技巧是给每个子任务分配三倍于预期的时间(有些人加了一句:“……,即使考虑了这条原则”)。

成功的关键在于使得研究成为你日常生活的一部分。很多突破和灵感都发生在你散步时。如果无时无刻地都潜意识的思考研究,就会发现思如泉涌。成功的研究者,坚持的作用一般大于天资。“尝试”也是很重要的,就是区分浅薄和重要思路的能力。你会发现自己成功的比例是很随机的。有时候,一个星期就做完了以前需要三个月才能完成的工作,这是令人欣喜的,使得你更愿意在本领域工作下去。其他一些时候,你完全陷在那里,感觉什么也做不了,这种情况很难处理。你会觉得自己永远不会做出任何有价值的东西了,或者觉得自己不再具备研究者的素质了。这些感觉几乎肯定是错误的,你需要的是暂停一下,对糟糕的结果保持高度的容忍。

通过定期设置中短期的目标,例如每周的或者每月的,你有很多工作要做。增加达到这些目标的可能性有两种方法,你可以把目标记在笔记本中,并告诉另外一个人。你可以与某个朋友商定交换每周的目标并看谁最终实现了自己的目标,或者告诉你的导师。有时你会完全陷在那里,类似于写作过程的思路阻塞,这有很多可能的原因,却并无一定的解决方法。

如果范围过于宽泛,可尝试去解决流程中的子问题。

有时候对你研究能力的怀疑会消磨掉你所有的热情而使得你一事无成。要牢记研究能力是学习而得的技能,而不是天生的。

如果发现自己陷入严重的困境,一个多星期都毫无进展,尝试每天只工作一小时。几天后,你可能就会发现一切又回到了正轨。

害怕失败会使得研究工作更加困难。如果发现自己无法完成工作,问问自己是否是由于在逃避用实验检验自己的思路。发现自己最近几个月的工作完全是白费的这种可能,会阻止你进一步开展工作。没有办法避免这种情况,只要认识到失败和浪费也是研究过程的一部分。

看看Alan Lakien的书《How to Get Control of Your Time and Your Life》,其中包含很多能使你进入充满创造力的状态的无价方法。

在数学中,如果你证明了某个定理,你就确实做了某些事情;如果该定理别人都证不出来,那么你的工作是令人兴奋的。但不同的实践者、子领域和学校会强调不同的标准。这样的一个后果就是你不可能令所有的人都满意。另外一个后果就是你无法确定自己是否取得了进展,这会让你觉得很不安全。对你工作的评价从“我所见过最伟大的”到“空虚,多余,不明所以”不一而足,这都是很正常的,根据别人的反馈修订自己的工作。有几种方法有助于克服研究过程中的不安全感。被承认的感觉:包括毕业论文的接受,发表论文等。更重要的是,与尽可能多的人交流你的思路,并听取反馈。首先,他们能贡献有用的思路;其次,肯定有一些人会喜欢你的工作,这会使你感觉不错。由于评价进展的标准是如此不确定,如果不与其他的研究者充分的交流,很容易盲目。特别当你感觉不太好时,应该就你的工作进行交流。此时,很容易看不到自己的贡献,总是想:“如果我能做,肯定是微不足道的。我的所有思想都太明显了”。实际上,当你回头看时,这些虽然对你是很明显的,对别人却并不一定是明显的。将你的工作解释给很多门外汉听,你会发现对你来说平淡无奇的东西原来那么难!获得反馈和支持是非常重要的。一项对诺贝尔获奖者进行的关于怀疑自己问题(在你研究的过程中,你一直觉得自己是在做震惊世界的工作吗?)的调查表明:获奖者们一致回答他们经常怀疑自己工作的价值和正确性,都经历过觉得自己的工作是无关的、太明显了或者是错误的时期。任何科学过程中常见和重要的部分就是经常严格的评价,很多时候不能确定工作的价值也是科学过程不可避免的一部分。有些研究者发现与别人协作比单打独斗工作效果更好。

很多来到实验室的学生都是以前所在学校最厉害的人。到了这里后,会发现很多更聪明的人,这对于很多一年级学生的自尊形成了打击。但周围都是聪明人也有一个好处:在你把自己不怎么样的(但自己又没有觉察到)想法发表之前就被其他人给打倒在地了。更现实的讲,现实世界中可没有这么多聪明人,因此到外面找一份顾问的工作有利于保持心理平衡。首先,有人会为你的才能付费,这说明你确实有些东西。其次,你发现他们确实太需要你的帮助了,工作带来了满足感。反之,实验室的每一个学生都是从四百多个申请者挑选出来的,因此我们很多学生都很自大,很容易认为只有我才能解决这个问题。这并没什么错,而且有助于推进领域的发展。潜在的问题是你会发现所有的问题都比你想象的要复杂得多,研究花的时间比原先计划的多得多,完全依靠自己还做不了。这些都使得我们中的很多人陷入了严重的自信危机。你必须面对一个事实:你所做的只能对某个子领域的一小部分有所贡献,你的论文也不可能解决一个重大的问题。这需要激烈的自我重新评价,充满了痛苦,有时候需要一年左右的时间才能完成。但这一切都是值得的,不自视过高有助于以一种游戏的精神去作研究。人们能够忍受研究的痛苦至少有两个情感原因。一个是驱动:对问题的热情。你做该研究是因为离开它就没法活了,很多伟大的工作都是这样做出来的,虽然这样也有油尽灯枯的可能。另外一个原因是好的研究是充满乐趣的。在大部分时间里,研究是令人痛苦的,但是如果问题恰好适合你,你可以玩一样的解决它,享受整个过程。二者并非不可兼容,但需要有一个权衡。要想了解研究是怎么样的,遭到怀疑的时候应该如何安慰自己,读一些当代人的自传会有些作用。Gregory Bateson的 Advice to a Young Scientist,Freeman Dyson的Disturbing the Universe, Richard Feynmann的Surely You Are Joking, Feynmann和George Hardy的A Mathematician's Apology,以及Jim Watson的The Double Helix。

当你完成了一个项目——例如论文——一两个月后,你可能会觉得这一切是那么不值。这种后冲效果是由于长时间被压抑在该问题上,而且觉得本可以做得更好。总是这样的,别太认真。等再过了一两年,回头看看,你会觉得:嘿,真棒!多棒的工作!

 

python连接MySQL数据库

python连接MySQL可以使用MySQLdb,数据库API规范可以参考PEP249,描述了类和应具有的属性和方法。MySQL的操作可以参考MySQL tutorial。

1.环境配置。

在Ubuntu11.10下面,自带python,但是没有MySQL,MySQLdb,所以首先安装MySQL,MySQLdb.

sudo apt-get install mysql-server
sudo apt-get install python-mysqldb

2.熟悉MySQL的基本操作。

连接Server:

mysql -h host -u user -p

输入Queries:

select version();

创建,使用database:

create database students;
use students;

查看数据库,表:

show databases;
show tables;

创建表:

create table webgrades(class varchar(10),number varchar(15), name varchar(20),grade int);

向表插入内容:

insert into webgrades values ('1','001','Justin',76);

从表查找内容:

select * from webgrades;

更多的内容参考MySQL tutorial。

3.python使用MySQLdb连接Server。

#! /usr/bin/env python
# -*- coding: utf8 -*-
import MySQLdb

#connect to the server
con=MySQLdb.connect(host='localhost',user='root',passwd='qweqwe',db='students')
#get cursor
cursor=con.cursor()
#execute the sql
operator="""insert into webgrades values (%s,%s,%s,%s)"""
para=[('1','200201000101','王丽',95),
      ('2','200201000201','赵宝刚',88),
      ('3','200201000301','杜玉',92)
      ]
cursor.executemany(operator,para)

#close the connection
con.close()

当然,更多的有关python连接数据库的知识参考python.org。

求中位数

统计学中,中位数代表一个样本中的一个数值,其可将数值集合划分为相等的上下两部分。

实数$$x_1,x_2,......,x_n$$按大小顺序(升序,降序皆可)排列为$$x_1^,,x_2^,,......,x_n^,$$,实数数列$$x_1,x_2,......,x_n$$的中位数$$Q_\frac{1}{2}(x)$$为:

$$Q_\frac{1}{2}(x)$$=$$\lfloor\frac{(n+1)}{2}\rfloor$$

明确了概念后我们可以来解决怎么找中位数了。

算法1:按照定义所说的,首先排序,然后直接返回$$Q_\frac{1}{2}(x)$$即可。

算法2:在《算法导论》中介绍了如何可以在期望线性时间找到中位数。

 思想是:1.按照快排的思想,不断的随机分割。

                 2.如果随机分割的返回值恰是我们找的,可以返回该位置的数。

                 3.如果不满足,比较一下返回值与我们找的位置的大小,递归的进行下去,直到满足1.

算法3:

思想是: 1.利用快速排序的思想,不断的的分割。不过没有用递归。

用python实现了一下上面的算法,结果:

  algorithm1(ms) algorithm2(ms) algorithm3(ms)
$$10^3$$ 0 0 0
$$10^4$$ 9 19 20
$$10^5$$ 140 120 70
$$10^6$$ 2149 1689 780
$$10^7$$ 27480 21479 12480

 

 

 

 

 

 

参考:

1.http://zh.wikipedia.org/wiki/%E4%B8%AD%E4%BD%8D%E6%95%B0

2.算法导论。




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee