Archive for 十月, 2010

标准差,也称均方差(mean square error),协方差,是各数据偏离平均数的距离的平均数,它是离均差平方和平均后的方根,用σ表示。标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。平均数相同的,标准差未必相同。

 \frac{1} {n-1}\sum_{i=1}^n\left(X_i-\overline{X}\,\right)^2

注意,以上公式的分母,当针对样本计算时,分母是n-1;当针对全部数据计算时,使用n。

在R语言里,协方差的计算函数为:var(x);均值为:mean(x)。

Cosine similarity,cosine距离,用来判断两个向量之间的相似性。

Cosine similarity [1][2] is a measure of similarity between two vectors of n dimensions by finding the cosine of the angle between them, often used to compare documents intext mining. In addition, it is used to measure cohesion within clusters in the field of Data Mining[3]. Given two vectors of attributes, A and B, the cosine similarity, θ, is represented using a dot product and magnitude as

 \text{similarity} = \cos(\theta) = {A \cdot B \over \|A\| \|B\|}.

在R语言中,计算如下:

A=c(1,0,0,1)

B=c(1,0,0,0)

C=c(0,1,1,0)

cosine(A,B) = 0.707

cosine(A,C) = 0

cosine(B,C) = 0

cosine=function(A,B)   (A %*% B)/( sqrt(sum(crossprod(A))) * sqrt(sum(crossprod(B))))  。

在php语言中,计算如下:

$tokensA = array(1,4);

$tokensB = array(1);

function cosineSimilarity($tokensA, $tokensB)
{
$a = $b = $c = 0;
$uniqueTokensA = $uniqueTokensB = array();
$uniqueMergedTokens = array_unique(array_merge($tokensA, $tokensB));
foreach ($tokensA as $token) $uniqueTokensA[$token] = 0;
foreach ($tokensB as $token) $uniqueTokensB[$token] = 0;
foreach ($uniqueMergedTokens as $token) {
$x = isset($uniqueTokensA[$token]) ? 1 : 0;
$y = isset($uniqueTokensB[$token]) ? 1 : 0;
$a += $x * $y;
$b += $x;
$c += $y;
}
return $b * $c != 0 ? ($a /(sqrt($b) * sqrt($c))) : 0;
}

即,若A=(a1,a2,a3), B=(b1,b2,b3),则similarity=(a1*b1+a2*b2+a3*b3)/abs(((a1^2+a2^2+a3^2)^(1/2)) *((b1^2+b2^2+b3^2)^(1/2))) )

For text matching, the attribute vectors A and B are usually the term frequency vectors of the documents. The cosine similarity can be seen as a method of normalizing document length during comparison.

The resulting similarity ranges from −1 meaning exactly opposite, to 1 meaning exactly the same, with 0 usually indicating independence, and in-between values indicating intermediate similarity or dissimilarity.

In the case of information retrieval, the cosine similarity of two documents will range from 0 to 1, since the term frequencies (tf-idf weights) cannot be negative. The angle between two term frequency vectors cannot be greater than 90°.

This cosine similarity metric may be extended such that it yields the Jaccard coefficient in the case of binary attributes. This is the Tanimoto coefficientT(AB), represented as

 T(A,B) = {A \cdot B \over \|A\|^2 +\|B\|^2 - A \cdot B}.

向量的点积

两个向量a = [a1a2,…, an]和b = [b1b2,…, bn]的点积定义为:

\mathbf{a}\cdot \mathbf{b} = \sum_{i=1}^n a_ib_i = a_1b_1 + a_2b_2 + \cdots + a_nb_n

首先从别的地方抄袭来一段expect的介绍:

“Expect是一种TCL扩展性的语言,主要用于完成系统交互方面的功能,比如SSH、FTP等,这些程序都需要手工与它们进行互动,而使用Expect就可以模拟人手工互动的过程,使用一种自动的方式控制。

Expect中,有三个重要的主命令,分别是spawn、expect、exp_send,这三个命令几乎存在于所有Expect脚本中,除了这些之外,还有很多Expect所特有的参数、变量,它们也作用与Expect的方方面面。”

我主要想拿它做一个安装脚本,在安装完操作系统之后,执行它,来安装服务器必须的一些程序,并进行一定的配置、交互等。

先说下安装,我用的是geetoo,直接emerge即可。在安装依赖库libtool过程中遇到过问题:

require Automake 1.10.1, but have 1.10

是因为automake的版本过低,所以,更新automake。

先找到automake的完整文件名:

$ emerge –search automake

Searching…

[ Results for search key : automake ]

[ Applications found : 2 ]

* sys-devel/automake

Latest version available: 1.11.1

Latest version installed: 1.11.1

Size of files: 1,041 kB

Homepage:      http://sources.redhat.com/automake/

Description:   Used to generate Makefile.in from Makefile.am

License:       GPL-2

*  sys-devel/automake-wrapper

Latest version available: 4

Latest version installed: 4

Size of files: 0 kB

Homepage:      http://www.gentoo.org/

Description:   wrapper for automake to manage multiple automake versions

License:       GPL-2

然后安装指定版本:
emerge =sys-devel/automake-1.10.3

这里,如果使用了>=来指定版本,会安装1.11.1版本,但是由于libtool里依赖为1.10版本,所以还是会有问题。

automake,其实是由/usr/lib64/misc/am-wrapper.sh脚本封装的,它根据env里指定的WANT_AUTOMAKE变量,动态分配某个版本的automake来执行。默认是最新版本。

然后,安装expect成功:
emerge expect

正式写代码,首先遇到的一个问题是,Expect中的expect命令匹配顺序。

做了一个实验,运行如下脚本:

spawn cat /etc/passwd
exp_internal 1
expect {
“mail” { puts “match 1″; exp_continue}
“user2″ { puts “match 2″ }
}

由于打开了exp_internal,所以可以看到具体的执行过程。

首先spawn输出了一个空白,不匹配任何,所以继续。

然后spawn输出了passwd的内容,其中先匹配到了一个mail,由于mail匹配后有exp_continue,所以字符串的头指针移动到了该mail匹配后的下一个字符处,继续匹配。又匹配到了mail,移动指针,继续。直到匹配到了user2,就结束了,由于它后面没有exp_continue。

那么,这时,把两个匹配句子倒个个,会发生什么呢?

spawn cat /etc/passwd
exp_internal 1
expect {
“user2″ { puts “match 2″ }
“mail” { puts “match 1″; exp_continue}
}

答案是,第一次匹配到了user2之后,就退出了。

之后,尝试安装一个mysql。

最初的脚本如下:

spawn ./configure -prefix=/usr/local/mysql;make;make install

但是很遗憾的发现,貌似不可以在spawn里一下子执行多条命令(如果可以的话,请告诉我,谢谢),会报语法错误。

于是,修改:

spawn ./configure -prefix=/usr/local/mysql

spawn make

spawn make install

执行正常,exp_internal观察得到。但是,没有configure的输出,没有make的结果,sou的一下就结束了。ps查看,也没有configure等执行的进程。

在spawn ./configure -prefix=/usr/local/mysql后加上wait,可以看到程序挂起了!说明,刚才是因为父进程退出,导致子进程也退出了。而且从实际上来说,configure、make和make install也应该是串行的。所以,在每个spawn后面,都加上一个expect eof {}:

spawn ./configure -prefix=/usr/local/mysql

expect eof {  }

spawn make

expect eof {  }

spawn make install

expect eof {  }

这时,又发现问题了,configure到一半,就退出了。答案是,由于这是一个长时间执行的任务,超时了。

所以需要在执行这些长时间spawn之前,加上set timeout -1。不限制超时时长。