一,问题描述

过三关游戏,也叫井字棋,两个游戏者,一个画圈一个画叉,最先横竖斜连成一条线的为赢。现在的问题是,已知900个棋局,如何运用机器学习的方法让计算机自动判定一个给定的棋局为赢还是为输。棋局有9格子,所以每个棋盘可以有个9维的向量表示,1表示x,-1表示圈,0表示空格,每个棋局有两种可能的状态,赢或是输,可以用1表示赢,-1表示输。

游戏的数据可以在这个网站得到:http://archive.ics.uci.edu/ml/。可以用其中的50%用于训练,其余50%用于测试。

解决的方法很多,先说SVM方法,因为有个很好用的工具LIBSVM。

二,SVM 

SVM--支持向量机,用于解决分类问题。 在解决小样本,非线性的问题中,有很好的应用。

三, LIBSVM

Libsvm是一个实现了svm算法的工具软件(http://archive.ics.uci.edu/ml/)。 下载到本地,不用安装,文件件里有个windows文件夹,里面是window下的可执行文件。

        1)数据处理。libsvm用的数据有固定的格式,而得到的棋盘数据是不能直接用的。

    要进行如下的转换:x,x,x,x,o,o,x,o,o,positive----->1 1:1 2:1 3:1 4:1 5:0 6:0 7:1 8:0 9:0

   第一个1表示这是赢局,后面9个数据对用9个特征值。 

   900多条数据,如果人工转换肯定要疯了。excel有专门的函数来进行转换,不过这个我们试过。我用的是gvim,执行几条命令也可以转换。 

        2)数据缩放

           数据一般缩放到-1到+1之间,这样处理的速度比较快。用svm-scale.exe这个执行程序。

           因为选取的数据本来就在-1到+1,所以这步可以免了。

        3)训练数据

            执行命令:svm-tain data.txt model.txt

            用数据文件data.txt里数据生成模型,保存在model.txt里。

            这个过程涉及选择核函数和选择参数的问题。 

         4)预测数据

           执行命令:svm-predict testingdata.txt model.txt output.txt

           testingdata.txt是测试数据文件,model.txt是模型文件,output.txt是结果输出文件。

四,一点总结

     对于这个问题,最好的核模型是线性核,比常用的rbf核效果好。原因可能是,svm要做的首先是数据从低维到高维的映射 ,是线性不可分的问题变为线性可分的问题,但这个问题本来就是个线性可分问题,所以没有必要映射。所以线性核就能够用,rbf核或许大才小用了,但是如果选好参数,rbf应该也能达到高的正确率。对于核模型也是不甚理解,需要更多的思考。

 

             

           

 

 

 

posted @ 2011-11-25 19:23 orchid 阅读(19) 评论(0) 编辑

KNN--k nearest neighbor algorithm

应用领域:KNN方法主要用于模式识别,是机器学习中最简单的一种学习方法。

思想:一个数据归为哪类,由最近的K个邻居投票,把它归为票数最多的类。这K个邻居取自已知数据。

要考虑的问题:选择那种距离--欧式距离,海明距离...

                    如何选择K值?

                    如何克服噪声的影响?

 

海明距离 Hamming Distance 

 两个相等长度的字符串,挨个比较每个字符,相同为0不相同为1,那么最后1的个数就是海明距离。

 

交叉验证 cross validation

这篇文章讲的比较通俗易懂 :http://www.cnblogs.com/galaxyprince/archive/2010/12/12/1903678.html

 

posted @ 2011-11-24 16:47 orchid 阅读(12) 评论(0) 编辑

vim是linux上的编辑器,因为要把数量不少的txt的文本格式化为xml文本,如果手动的话工作量会很大,所以想到了用vim,因为它可以用命令批量操作。

要格式化的文本资料是下面这个样子:


现在要把它变成如下的xml格式。

<scale>
     
<questions>
        
<question>题目一</question>
        
<question>题目二</question>
      
</questions>
      
<answers>
            
<answer score='1'></answer>
            
<answer score='0'></answer>
      
</answers>
      
<description>
          
<item></item>
          
<item></item>
      
</description>
      
<tip>
      
</tip>

</scale> 

 

chapter one:相关vim的基本操作

1, 三种模式

普通模式,命令模式(按冒号:进入命令),插入模式(按i进入) ,在命令模式和普通模式中按ESC退回到普通模式。据我的理解,普通模式就是浏览模式,插入模式能用键盘鼠标编辑,命令模式中能用命令编辑。

2,打开文件,新建文件,保存文件

可以用vim软件自带的菜单打开文件,如果不想这样做的话,打开文件的命令是  :e path。 有个技巧就是可以用tab键,它有进行提示的功能,尤其当文件路径名很长的时候,tab键尤其的方便。

 对于新建文件同样可以用菜单鼠标操作,命令是  :enew path。

保存文件  :w 

3, 浏览文本(普通模式下的操作,不是命令,当做快捷键吧)

 j 下一行   k上一行  h前一个字   l后一个字

这样的命令的确很别扭,但是据说这是为了操作更加快速而设计的。还有,可以这样操作,5j,6k,8h,9l,这样是上下走5行,向上走6行,向前走8个字,向后走9个字。

gg 回到文本的最开头

^  到本行的开头

$  到本行的结尾 

x 删掉当前字符

dd 删除当前行 

o 在当前行的下面插入新的一行

O 在当前行的上面个插入新的一行 

4, 查找(普通模式下)

/string ,可以用正则表达式,所以很强大。

比如上面的文本中,找每题末尾的□□(不是口,在搜狗拼音下打方框两个字就会出现这个图形) 

 键盘输入   /□□  就会如下效果

 

目标字符被高亮显示出来,可以用n移动。 

再来看看每题前面的数字怎么选中,因为它们变化的,所以必须用正则表达式了。

/\d 

 

\d就是选择数字,前面的\是转义字符

\s是一个字符,*同样表示0个或多个,+表示1个或多个

5,替换

命令:s/a/b/ 将a替换为b。可以用字符&代替a。

6,录制宏

qa--录制宏a

q--结束录制

@a 执行a

100@a执行100次 

 

chapter2:操作  把每个测试题目用<question></question>包围。

 执行命令:%s/\d\+\s*/<question>/gc 

%是全文的意思,/gc是一直替换的意思。s\d\+\s*/<question>就是s/a/b命令,把数字和空白用<question>代替

效果如下: 

 

执行命令:%s/□□/<\/question>。也是替换,把行尾的两个方框用</question>代替,因为/是特殊字符所以用\转义了。 

效果如下: 

 


 


 

 

 

 

 

 

 

 

 

 

 

posted @ 2011-07-10 12:10 orchid 阅读(116) 评论(0) 编辑

this,who are you?

这个问题有时很重要。

概括的来讲:this是个引用,永远指向当前代码所处的对象中。

还有个需要注意的技巧:如何动态的改变这个this?也就是说我能规定this是谁吗?

答案是可以的,你可以控制这件事。可以用call()函数和apply()函数。

看代码:

 

输入:

 

apply和call把第一个参数定义为上下文对象,也就是this的指向,其余参数作为函数的参数。不同的是apply的第二个参数是参数数组。 

posted @ 2011-04-19 21:37 orchid 阅读(43) 评论(0) 编辑

对于javascript的闭包只先说一句,其它的以后再研究:

闭包意味着内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止。

这里有一篇文章,看完之后闭包就明白了:http://jibbering.com/faq/notes/closures/ 

posted @ 2011-04-19 21:16 orchid 阅读(30) 评论(0) 编辑

第一句话需要记住的:javascript中的作用域由函数划分而非由块(如 if while)划分。

第二句话需要记住的:所有的全局作用域的变量其实都是window对象的属性。

第三局话需要记住的:如果一个变量不用var声明,那么这个变量不管定义在哪里,它都是全局的。 

posted @ 2011-04-19 20:40 orchid 阅读(21) 评论(0) 编辑

在javascript中进行类型检查,主要有两种方式。一种是利用typeof操作符,一种是利用javascript所有对象都有的一个constructor属性。

一:先来分析typeof

用typeof来进行类型检查的方式: 

代码如下:

 

输出如下:

 

用typeof进行类型检查的缺陷:

用typeof进行类型检查,所有的自定义类型都会返回object,所以不能区分出到底是个对象。 

二:用construtor属性

constructor属性的原理:所有的javascript对象都有一个constructor属性,它引用的是原本用来构造该对象的那个函数。 

用constructor属性进行类型检查的方式:

代码:

输出:

 

 所以,用construcor能够尽心更加准确的类型检测。

对于两种方法还有一个差别,看代码:


它们对待空对象的态度不太一样 

posted @ 2011-04-19 20:31 orchid 阅读(15) 评论(0) 编辑

最近老师留下Linux课的实验题,利用samba实现windows和linux的资源共享,虽然纠结了一个上午才给弄完,但是遇到的问题还是很经典的,记下来吧

1,samba的安装

    安装环境:VMWare redhat 9 windows7

    下面是安装步骤,简单说,网上有很多

    1)把第一张光盘插入光驱,我这里用的是镜像

    2)然后就安装软件包

        #rpm -ivh samba-common-2.2.7a-7.9.0.i386.rpm

        #rpm -ivh samba-2.2.7a-7.9.0.i386.rpm

        #rpm -ivh samba-client-2.2.7a-7.9.0.i386.rpm

        #rpm -ivh redhat-config-samba-1.04-1.noarch.rpm(samba的图形配置工具)

    3)这样就安装好了。开启服务 #service smb start

    到这里一直很顺利,可是当我用#service smb status检查服务开启情况是,令人纠结的事情发生了……

   smbd(pid 2648)正在运行……

       nmbd 停止

      正常情况是两个服务都在运行状态才对!

      这个问题困扰了我大概半个小时,而且在搜索引擎上页找不到答案。直到我打开redhat里火狐,想打开百度时,发现域名无法解析,我才发现问题的可能原因是我没有配置dns服务器,配上dns服务器,果真好了。nmbd这个服务的确是负责把此linux上的共享组和其下的netbios name解析出来的,难道这里也用到了域名解析了吗?

      算是误打误撞吧,虽然不太明白但是毕竟连个服务都能运行了。

 

2,设置共享资源和用户

  在最开始安装的时候不安装了一个图像配置工具吗?在系统设置-服务器设置-samba服务器能找到,用它很方便的你能够进行一些基本的共享设置和用户管理。

3,用windows上访问linux的共享目录

    回到windows,打开“网络”(我用的是win7以前这个东西叫网上邻居),在地址栏输入\\linux ip 比如,\\192.168.100.13 ,根本找不到?!

    有搜索了老半天,好在这个问题还是很普遍的,关闭linux的防火墙:#service iptables stop。

     终于可以找到linux了……

     可是更纠结的问题出现了,总提示用户名和密码总是不对。用户名应该是上面再samba图像配置里面的设置的windows用户,密码也是那里设置的密码。可是就是不对。

     有时一阵狂搜,终于找到了问题的所在。

     下面可以解决的方法:

     

    单击[开始]——[运行] 输入 “secpol.msc”打开管理工具,展开“本地策略”;

    然后,单击“安全选项”。 双击“网络安全:LAN Manager 身份验证级别”;

    最后,单击列表中:发送LM和NTLMv2,如果已协商,则使用NTLMv2协议。

      链接网址:http://blog.chinaunix.net/u3/94191/showart_2228653.html。出现这个问题的原因这篇文章里也给出了答案。


 拜谢互联网和搜索引擎……

posted @ 2010-06-19 15:06 orchid 阅读(3033) 评论(0) 编辑
摘要: 1,setTimeout() 从技术上讲,当setTimeout函数被调用时,浏览器将把该语句添加到待执行的语句列表中,同时程序中的其他语句并不会停止,而是继续运行。只要完成了当前正执行的语句,浏览器就会检测待执行的语句列表,并且执行已经到期的语句。如果指定的延迟时间到了,但是浏览器仍在执行其他任务,那么setTimeout函数指定的任务将会延迟,知道所有其他任务都已经完成。  在看这样一段语句:...阅读全文
posted @ 2010-04-10 11:35 orchid 阅读(259) 评论(0) 编辑
摘要: Prototype程序库对标准的addEventListener和removeEventListener方法提供了浏览器兼容方案,分别成为Event.observe和Event.stopObserving。例如:  Event.observe(element,'event','eventlistener);  Event.stopObserving(element,'event',eventlis...阅读全文
posted @ 2010-04-09 10:35 orchid 阅读(68) 评论(0) 编辑