【绩效管理 源码】【动漫社区app源码】【linux 2.6.32源码分析】–91源码

时间:2024-12-28 16:49:10 来源:响应式网页源码 分类:时尚

1.如何做好python自动化运维
2.如何安全地存储密码
3.如何利用python使用libsvm

–91源码

如何做好python自动化运维

       éšç€ç§»åŠ¨äº’联网的普及,服务器运维所面临的挑战也随之越来越大。当规模增长到一定程度,手动管理方式已经无法应对,自动化运维成为解决问题的银弹。Python凭借其灵活性,在自动化运维方面已经被广泛使用,能够大大提高运维效率,服务器集群的规模越大,优势越明显。现在不论是Linux运维工程师还是Unix运维工程师都需要掌握Python,以提高运维效率。

       ç¬¬ä¸€ä¸ªé˜¶æ®µï¼šåˆçº§ï¼ŒæŽŒæ¡Python的语法和一些常用库的使用

       æŽŒæ¡ä¸€é—¨è¯­è¨€æœ€å¥½çš„方法就是用它,所以我觉得边学语法边刷Leetcode是掌握Python最快的方式之一。

       å¾ˆå¤šåªéœ€è¦å°†Python作为脚本或者就是写一些小程序处理处理文本的话,到这一个阶段就足够了,这个阶段已经可以帮我们完成很多很多的事情了。但是如果是一个专业学习Python的,恐怕还需要努力的升级:首先,国内的大多数人都是学习了其他语言(C,C++,–源码绩效管理 源码Java等)之后来学习Python的,所以Python和这些语言的不同,也就是pythonic的东西需要一些时间去学习了解和掌握;另外,对于自己领域的领域的库构架的掌握也需要很长的时间去掌握;最后,如果想独立完成一个Python的项目,项目的布局,发布,开源等都是需要考虑的问题。

       ç¬¬äºŒä¸ªé˜¶æ®µï¼šä¸­çº§ï¼ŒæŽŒæ¡è‡ªå·±ç‰¹å®šé¢†åŸŸçš„库,掌握pythonic写法,非常熟悉Python的特性

       æŽ¨èçš„第一本书是《编写高质量代码–改善python程序的个建议》,这本书大概的提了下Python工程的文件布局,更多的总结了如何写出pythonic的代码,另外,也介绍了一些常用的库。

       è¿™é‡Œé¦–先推荐在腾讯官方课程渠道上进行直播学习,有号就能无偿一直学,每天晚上都是高清直播(企鹅球球:中间是最后加上这个连在一起就能够了),除此之外基于python2.7在网上的书籍适合于重头开始一直读完,作为一个开发人员,除了基本的语法,这本书里面提到了一些其他的常用的库,看了廖老师写的很多东西,感觉他的思路,以及写博客写书的高度,概括性,原理性都十分好,这本书读完之后,相信就能够动手写很多东西了,能够尽情的玩转Python解说器了。

       è¦æƒ³æ·±å…¥çš„了解Python,有的时候看看Python的源码也是很重要的,自己通过读懂源码,来彻底的了解Python的核心机制,这里推荐《Python源码剖析——深度探索动态语言核心技术》,这本书并没有看完,只是在需要深入了解Python某个功能或者数据结构的时候看看相关章节,也觉得受益匪浅。

       è‡ªå·±é¢†åŸŸçš„书籍和资料也肯定很多,比如web开发的构架都有很多,只有了解熟悉了所有构架,在选择的时候才能衡量利弊,然后深入掌握某些构架。

如何安全地存储密码

       ã€€ä¿æŠ¤å¯†ç æœ€å¥½çš„的方式就是使用带盐的密码hash(salted password hashing).对密码进行hash操作是一件很简单的事情,但是很多人都犯了错。接下来我希望可以详细的阐述如何恰当的对密码进行hash,以及为什么要这样做。

       ã€€ã€€é‡è¦æé†’

       ã€€ã€€å¦‚果你打算自己写一段代码来进行密码hash,那么赶紧停下吧。这样太容易犯错了。这个提醒适用于每一个人,不要自己写密码的hash算法 !关于保存密码的问题已经有了成熟的方案,那就是使用phpass或者本文提供的源码。

       ã€€ã€€ä»€ä¹ˆæ˜¯hash

       ã€€ã€€hash("hello") = 2cfdba5fb0aeeb2ac5b9ee1be5c1faeb

       hash("hbllo") = ccdfacfad6affaafe7ddf

       hash("waltz") = c0efcbc6bd9ecfbfda8ef

       ã€€ã€€Hash算法是一种单向的函数。它可以把任意数量的数据转换成固定长度的“指纹”,这个过程是不可逆的。而且只要输入发生改变,哪怕只有一个bit,输出的hash值也会有很大不同。这种特性恰好合适用来用来保存密码。因为我们希望使用一种不可逆的算法来加密保存的密码,同时又需要在用户登陆的时候验证密码是否正确。

       ã€€ã€€åœ¨ä¸€ä¸ªä½¿ç”¨hash的账号系统中,用户注册和认证的大致流程如下:

       ã€€ã€€1, 用户创建自己的账号

       2, 用户密码经过hash操作之后存储在数据库中。没有任何明文的密码存储在服务器的硬盘上。

       3, 用户登陆的时候,将用户输入的密码进行hash操作后与数据库里保存的密码hash值进行对比。

       4, 如果hash值完全一样,则认为用户输入的密码是正确的。否则就认为用户输入了无效的密码。

       5, 每次用户尝试登陆的时候就重复步骤3和步骤4。

       ã€€ã€€åœ¨æ­¥éª¤4的时候不要告诉用户是账号还是密码错了。只需要显示一个通用的提示,比如账号或密码不正确就可以了。这样可以防止攻击者枚举有效的用户名。

       ã€€ã€€è¿˜éœ€è¦æ³¨æ„çš„是用来保护密码的hash函数跟数据结构课上见过的hash函数不完全一样。比如实现hash表的hash函数设计的目的是快速,但是不够安全。只有加密hash函数(cryptographic hash functions)可以用来进行密码的hash。这样的函数有SHA, SHA, RipeMD, WHIRLPOOL等。

       ã€€ã€€ä¸€ä¸ªå¸¸è§çš„观念就是密码经过hash之后存储就安全了。这显然是不正确的。有很多方式可以快速的从hash恢复明文的密码。还记得那些md5破解网站吧,只需要提交一个hash,不到一秒钟就能知道结果。显然,单纯的对密码进行hash还是远远达不到我们的安全需求。下一部分先讨论一下破解密码hash,获取明文常见的手段。

       ã€€ã€€å¦‚何破解hash

       ã€€ã€€å­—典和暴力破解攻击(Dictionary and Brute Force Attacks)

       ã€€ã€€æœ€å¸¸è§çš„破解hash手段就是猜测密码。然后对每一个可能的密码进行hash,对比需要破解的hash和猜测的密码hash值,如果两个值一样,那么之前猜测的密码就是正确的密码明文。猜测密码攻击常用的方式就是字典攻击和暴力攻击。

       ã€€ã€€Dictionary Attack

       Trying apple : failed

       Trying blueberry : failed

       Trying justinbeiber : failed

       ...

       Trying letmein : failed

       Trying s3cr3t : success!

       ã€€ã€€å­—典攻击是将常用的密码,单词,短语和其他可能用来做密码的字符串放到一个文件中,然后对文件中的每一个词进行hash,将这些hash与需要破解的密码hash比较。这种方式的成功率取决于密码字典的大小以及字典的是否合适。

       ã€€ã€€Brute Force Attack

       Trying aaaa : failed

       Trying aaab : failed

       Trying aaac : failed

       ...

       Trying acdb : failed

       Trying acdc : success!

       ã€€ã€€æš´åŠ›æ”»å‡»å°±æ˜¯å¯¹äºŽç»™å®šçš„密码长度,尝试每一种可能的字符组合。这种方式需要花费大量的计算机时间。但是理论上只要时间足够,最后密码一定能够破解出来。只是如果密码太长,破解花费的时间就会大到无法承受。

       ã€€ã€€ç›®å‰æ²¡æœ‰æ–¹å¼å¯ä»¥é˜»æ­¢å­—典攻击和暴力攻击。只能想办法让它们变的低效。如果你的密码hash系统设计的是安全的,那么破解hash唯一的方式就是进行字典或者暴力攻击了。

       ã€€ã€€æŸ¥è¡¨ç ´è§£(Lookup Tables)

       ã€€ã€€å¯¹äºŽç‰¹å®šçš„hash类型,如果需要破解大量hash的话,查表是一种非常有效而且快速的方式。它的理念就是预先计算(pre-compute)出密码字典中每一个密码的hash。然后把hash和对应的密码保存在一个表里。一个设计良好的查询表结构,即使存储了数十亿个hash,每秒钟仍然可以查询成百上千个hash。

       ã€€ã€€å¦‚果你想感受下查表破解hash的话可以尝试一下在CraskStation上破解下下面的sha hash。

       ã€€ã€€cb4b0aafcddfee9fbb8bcf3a7f0dbaadfc

       eacbadcdc7d8fbeb7c7bd3a2cbdbfcbbbae7

       e4ba5cbdce6cd1cfa3bd8dabcb3ef9f

       b8b8acfcbcac7bfba9fefeebbdcbd

       ã€€ã€€åå‘查表破解(Reverse Lookup Tables)

       ã€€ã€€Searching for hash(apple) in users' hash list... : Matches [alice3, 0bob0, charles8]

       Searching for hash(blueberry) in users' hash list... : Matches [usr, timmy, john]

       Searching for hash(letmein) in users' hash list... : Matches [wilson, dragonslayerX, joe]

       Searching for hash(s3cr3t) in users' hash list... : Matches [bruce, knuth, john]

       Searching for hash(z@hjja) in users' hash list... : No users used this password

       ã€€ã€€è¿™ç§æ–¹å¼å¯ä»¥è®©æ”»å‡»è€…不预先计算一个查询表的情况下同时对大量hash进行字典和暴力破解攻击。

       ã€€ã€€é¦–先,攻击者会根据获取到的数据库数据制作一个用户名和对应的hash表。然后将常见的字典密码进行hash之后,跟这个表的hash进行对比,就可以知道用哪些用户使用了这个密码。这种攻击方式很有效果,因为通常情况下很多用户都会有使用相同的密码。

       ã€€ã€€å½©è™¹è¡¨ (Rainbow Tables)

       ã€€ã€€å½©è™¹è¡¨æ˜¯ä¸€ç§ä½¿ç”¨ç©ºé—´æ¢å–时间的技术。跟查表破解很相似。只是它牺牲了一些破解时间来达到更小的存储空间的目的。因为彩虹表使用的存储空间更小,所以单位空间就可以存储更多的hash。彩虹表已经能够破解8位长度的任意md5hash。彩虹表具体的原理可以参考/

       ã€€ã€€ä¸‹ä¸€ç« èŠ‚我们会讨论一种叫做“盐”(salting)的技术。通过这种技术可以让查表和彩虹表的方式无法破解hash。

       ã€€ã€€åŠ ç›(Adding Salt)

       ã€€ã€€hash("hello") = 2cfdba5fb0aeeb2ac5b9ee1be5c1faeb

       hash("hello" + "QxLUF1bgIAdeQX") = 9ecfaebfe5ed3bacffed1

       hash("hello" + "bv5PehSMfVCd") = d1d3ec2e6ffddedab8eac9eaaefab

       hash("hello" + "YYLmfY6IehjZMQ") = ac3cb9eb9cfaffdc8aedb2c4adf1bf

       ã€€ã€€æŸ¥è¡¨å’Œå½©è™¹è¡¨çš„方式之所以有效是因为每一个密码的都是通过同样的方式来进行hash的。如果两个用户使用了同样的密码,那么一定他们的密码hash也一定相同。我们可以通过让每一个hash随机化,同一个密码hash两次,得到的不同的hash来避免这种攻击。

       ã€€ã€€å…·ä½“的操作就是给密码加一个随即的前缀或者后缀,然后再进行hash。这个随即的后缀或者前缀成为“盐”。正如上面给出的例子一样,通过加盐,相同的密码每次hash都是完全不一样的字符串了。检查用户输入的密码是否正确的时候,我们也还需要这个盐,所以盐一般都是跟hash一起保存在数据库里,或者作为hash字符串的一部分。

       ã€€ã€€ç›ä¸éœ€è¦ä¿å¯†ï¼Œåªè¦ç›æ˜¯éšæœºçš„话,查表,彩虹表都会失效。因为攻击者无法事先知道盐是什么,也就没有办法预先计算出查询表和彩虹表。如果每个用户都是使用了不同的盐,那么反向查表攻击也没法成功。

       ã€€ã€€ä¸‹ä¸€èŠ‚,我们会介绍一些盐的常见的错误实现。

       ã€€ã€€é”™è¯¯çš„方式:短的盐和盐的复用

       ã€€ã€€æœ€å¸¸è§çš„错误实现就是一个盐在多个hash中使用或者使用的盐很短。

       ã€€ã€€ç›çš„复用(Salt Reuse)

       ã€€ã€€ä¸ç®¡æ˜¯å°†ç›ç¡¬ç¼–码在程序里还是随机一次生成的,在每一个密码hash里使用相同的盐会使这种防御方法失效。因为相同的密码hash两次得到的结果还是相同的。攻击者就可以使用反向查表的方式进行字典和暴力攻击。只要在对字典中每一个密码进行hash之前加上这个固定的盐就可以了。如果是流行的程序的使用了硬编码的盐,那么也可能出现针对这种程序的这个盐的查询表和彩虹表,从而实现快速破解hash。

       ã€€ã€€ç”¨æˆ·æ¯æ¬¡åˆ›å»ºæˆ–者修改密码一定要使用一个新的随机的盐

       ã€€ã€€çŸ­çš„盐

       ã€€ã€€å¦‚果盐的位数太短的话,攻击者也可以预先制作针对所有可能的盐的查询表。比如,3位ASCII字符的盐,一共有xx = ,种可能性。看起来好像很多。假如每一个盐制作一个1MB的包含常见密码的查询表,,个盐才是GB。现在买个1TB的硬盘都只要几百块而已。

       ã€€ã€€åŸºäºŽåŒæ ·çš„理由,千万不要用用户名做为盐。虽然对于每一个用户来说用户名可能是不同的,但是用户名是可预测的,并不是完全随机的。攻击者完全可以用常见的用户名作为盐来制作查询表和彩虹表破解hash。

       ã€€ã€€æ ¹æ®ä¸€äº›ç»éªŒå¾—出来的规则就是盐的大小要跟hash函数的输出一致。比如,SHA的输出是bits(bytes),盐的长度也应该是个字节的随机数据。

       ã€€ã€€é”™è¯¯çš„方式:双重hash和古怪的hash函数

       ã€€ã€€è¿™ä¸€èŠ‚讨论另外一个常见的hash密码的误解:古怪的hash算法组合。人们可能解决的将不同的hash函数组合在一起用可以让数据更安全。但实际上,这种方式带来的效果很微小。反而可能带来一些互通性的问题,甚至有时候会让hash更加的不安全。本文一开始就提到过,永远不要尝试自己写hash算法,要使用专家们设计的标准算法。有些人会觉得通过使用多个hash函数可以降低计算hash的速度,从而增加破解的难度。通过减慢hash计算速度来防御攻击有更好的方法,这个下文会详细介绍。

       ã€€ã€€ä¸‹é¢æ˜¯ä¸€äº›ç½‘上找到的古怪的hash函数组合的样例。

       ã€€ã€€md5(sha1(password))

       md5(md5(salt) + md5(password))

       sha1(sha1(password))

       sha1(str_rot(password + salt))

       md5(sha1(md5(md5(password) + sha1(password)) + md5(password)))

       ã€€ã€€ä¸è¦ä½¿ç”¨ä»–们!

       ã€€ã€€æ³¨æ„ï¼šè¿™éƒ¨åˆ†çš„内容其实是存在争议的!我收到过大量邮件说组合hash函数是有意义的。因为如果攻击者不知道我们用了哪个函数,就不可能事先计算出彩虹表,并且组合hash函数需要更多的计算时间。

       ã€€ã€€æ”»å‡»è€…如果不知道hash算法的话自然是无法破解hash的。但是考虑到Kerckhoffs’s principle,攻击者通常都是能够接触到源码的(尤其是免费软件和开源软件)。通过一些目标系统的密码–hash对应关系来逆向出算法也不是非常困难。

       ã€€ã€€å¦‚果你想使用一个标准的”古怪”的hash函数,比如HMAC,是可以的。但是如果你的目的是想减慢hash的计算速度,那么可以读一下后面讨论的慢速hash函数部分。基于上面讨论的因素,最好的做法是使用标准的经过严格测试的hash算法。

       ã€€ã€€hash碰撞(Hash Collisions)

       ã€€ã€€å› ä¸ºhash函数是将任意数量的数据映射成一个固定长度的字符串,所以一定存在不同的输入经过hash之后变成相同的字符串的情况。加密hash函数(Cryptographic hash function)在设计的时候希望使这种碰撞攻击实现起来成本难以置信的高。但时不时的就有密码学家发现快速实现hash碰撞的方法。最近的一个例子就是MD5,它的碰撞攻击已经实现了。

       ã€€ã€€ç¢°æ’žæ”»å‡»æ˜¯æ‰¾åˆ°å¦å¤–一个跟原密码不一样,但是具有相同hash的字符串。但是,即使在相对弱的hash算法,比如MD5,要实现碰撞攻击也需要大量的算力(computing power),所以在实际使用中偶然出现hash碰撞的情况几乎不太可能。一个使用加盐MD5的密码hash在实际使用中跟使用其他算法比如SHA一样安全。不过如果可以的话,使用更安全的hash函数,比如SHA, SHA, RipeMD, WHIRLPOOL等是更好的选择。

       ã€€ã€€æ­£ç¡®çš„方式:如何恰当的进行hash

       ã€€ã€€è¿™éƒ¨åˆ†ä¼šè¯¦ç»†è®¨è®ºå¦‚何恰当的进行密码hash。第一个章节是最基础的,这章节的内容是必须的。后面一个章节是阐述如何继续增强安全性,让hash破解变得异常困难。

       ã€€ã€€åŸºç¡€ï¼šä½¿ç”¨åŠ ç›hash

       ã€€ã€€æˆ‘们已经知道恶意黑客可以通过查表和彩虹表的方式快速的获得hash对应的明文密码,我们也知道了通过使用随机的盐可以解决这个问题。但是我们怎么生成盐,怎么在hash的过程中使用盐呢?

       ã€€ã€€ç›è¦ä½¿ç”¨å¯†ç å­¦ä¸Šå¯é å®‰å…¨çš„伪随机数生成器(Cryptographically Secure Pseudo-Random Number Generator (CSPRNG))来产生。CSPRNG跟普通的伪随机数生成器比如C语言中的rand(),有很大不同。正如它的名字说明的那样,CSPRNG提供一个高标准的随机数,是完全无法预测的。我们不希望我们的盐能够被预测到,所以一定要使用CSPRNG。

如何利用python使用libsvm

       ä¸€ï¼šlibsvm包下载与使用:

       LIBSVM是台湾大学林智仁(Lin Chih-Jen)副教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进.

       æŠŠåŒ…解压在C盘之中,如:C:\libsvm-3.

       2.

       å› ä¸ºè¦ç”¨libsvm自带的脚本grid.py和easy.py,需要去官网下载绘图工具gnuplot,解压到c盘

       3.

       è¿›å…¥c:\libsvm\tools目录下,用文本编辑器(记事本,edit都可以)修改grid.py和easy.py两个文件,找到其中关于gnuplot路径的那项,根据实际路径进行修改,并保存

       4python与libsvm的连接(参考SVM学习笔记(2)LIBSVM在python下的使用 )

       a.打开IDLE(python GUI),输入

       >>>import sys

       >>>sys.version

       å¦‚果你的python是位,将出现如下字符:

       â€˜2.7.3 (default, Apr , ::) [MSC v. bit (Intel)]’

       è¿™ä¸ªæ—¶å€™LIBSVM的python接口设置将非常简单。在libsvm-3.文件夹下的windows文件夹中找到动态链接库libsvm.dll,将其添加到系统目录,如`C:\WINDOWS\system\’,即可在python中使用libsvm

       b.如果你是位的请参考文献,请参考上述连接。

       5.执行一个小例子

       import os

       os.chdir('C:\libsvm-3.\python')#请根据实际路径修改

       from svmutil import

*

       y, x = svm_read_problem('../heart_scale')#读取自带数据

       m = svm_train(y[:], x[:], '-c 4')

       p_label, p_acc, p_val = svm_predict(y[:], x[:], m)

       ##出现如下结果,应该是正确安装了

       optimization finished, #iter =

       nu = 0.

       obj = -., rho = 0.

       nSV = , nBSV =

       Total nSV =

       Accuracy = .% (/) (classification)

       äºŒå‡ ä¸ªç®€å•çš„例子

       ä»Žä¸‹è½½å®žéªŒæ•°æ®é›†ã€‚并且将数据集拷贝到C:\libsvm-3.\windows下(因为之后我们需要利用该文件夹下的其他文件,这样比较方便,当然之后你用绝对地址也可以了)

       å»ºç«‹ä¸€ä¸ªpy文件,写下如下代码:

       ä¾‹1:

       import os

       os.chdir('C:\libsvm-3.\windows')#设定路径

       from svmutil import

*

       y, x = svm_read_problem('train.1.txt')#读入训练数据

       yt, xt = svm_read_problem('test.1.txt')#训练测试数据

       m = svm_train(y, x )#训练

       svm_predict(yt,xt,m)#测试

       æ‰§è¡Œä¸Šè¿°ä»£ç ï¼Œç²¾åº¦ä¸ºï¼šAccuracy = .% (/) (classification)

       å¸¸ç”¨æŽ¥å£

       svm_train() : train an SVM model#训练

       svm_predict() : predict testing data#预测

       svm_read_problem() : read the data from a LIBSVM-format file.#读取libsvm格式的数据

       svm_load_model() : load a LIBSVM model.

       svm_save_model() : save model to a file.

       evaluations() : evaluate prediction results.

       - Function: svm_train#三种训练写法

       There are three ways to call svm_train()

       >>> model = svm_train(y, x [, 'training_options'])

       >>> model = svm_train(prob [, 'training_options'])

       >>> model = svm_train(prob, param)

       æœ‰å…³å‚数的设置(read me 文件夹中有详细说明):

       Usage: svm-train [options] training_set_file [model_file]

       options:

       -s svm_type : set type of SVM (default 0)#选择哪一种svm

       0 -- C-SVC (multi-class classification)

       1 -- nu-SVC (multi-class classification)

       2 -- one-class SVM

       3 -- epsilon-SVR (regression)

       4 -- nu-SVR (regression)

       -t kernel_type : set type of kernel function (default 2)#是否用kernel trick

       0 -- linear: u'*v

       1 -- polynomial: (gamma*u'*v + coef0)^degree

       2 -- radial basis function: exp(-gamma*|u-v|^2)

       3 -- sigmoid: tanh(gamma*u'*v + coef0)

       4 -- precomputed kernel (kernel values in training_set_file)

       -d degree : set degree in kernel function (default 3)

       -g gamma : set gamma in kernel function (default 1/num_features)

       -r coef0 : set coef0 in kernel function (default 0)

       -c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)

       -n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)

       -p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)

       -m cachesize : set cache memory size in MB (default )

       -e epsilon : set tolerance of termination criterion (default 0.)

       -h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1)

       -b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)

       -wi weight : set the parameter C of class i to weight*C, for C-SVC (default 1)

       -v n: n-fold cross validation mode

       -q : quiet mode (no outputs)

       ä¸‰æé«˜é¢„测的准确率:

       é€šè¿‡ä¸€å®šçš„过程,可以提高预测的准确率(在文献2中有详细介绍):

       a.转换数据为libsvm可用形式.(可以通过下载的数据了解格式)

       b.进行一个简单的尺度变换

       c.利用RBF kernel,利用cross-validation来查找最佳的参数 C 和 r

       d.利用最佳参数C 和 r ,来训练整个数据集

       e.测试

       å†çœ‹ä¾‹å­1:

       1.进入cmd模式下,输入如下代码,将现有数据进行适度变换,生成变换后的数据文件train.1.scale.txt

       å‚数说明:

       -l 变换后的下限

       -u 变换后的上限

       -s 参考上文

       2执行以下代码

       import os

       os.chdir('C:\libsvm-3.\windows')#设定路径

       from svmutil import

*

       y, x = svm_read_problem('train.1.scale.txt')#读入训练数据

       yt, xt = svm_read_problem('test.1.scale.txt')#训练测试数据

       m = svm_train(y, x )#训练

       svm_predict(yt,xt,m)#测试

       ç²¾ç¡®åº¦ä¸ºAccuracy = .6% (/) (classification)。

       å¯è§æˆ‘们只是做了简单的尺度变换后,预测的正确率大大提升了。

       3通过选择最优参数,再次提高预测的准确率:(需要把tools文件下的grid.py拷贝到'C:\libsvm-3.\windows'下)

       import os

       os.chdir('C:\libsvm-3.\windows')#设定路径

       from svmutil import

*

       from grid import

*

       rate, param = find_parameters('train.1.scale.txt', '-log2c -3,3,1 -log2g -3,3,1')

       y, x = svm_read_problem('train.1.scale.txt')#读入训练数据

       yt, xt = svm_read_problem('test.1.scale.txt')#训练测试数据

       m = svm_train(y, x ,'-c 2 -g 4')#训练

       p_label,p_acc,p_vals=svm_predict(yt,xt,m)#测试

       æ‰§è¡Œä¸Šé¢çš„程序,find_parmaters函数,可以找到对应训练数据较好的参数。后面的log2c,log2g分别设置C和r的搜索范围。搜索机制是以2为底指数搜索,如 –log2c –3 , 3,1 就是参数C,从2^-3,2^-2,2^-1…搜索到2^3.

       æœç´¢åˆ°è¾ƒå¥½å‚数后,在训练的时候加上参数的设置。

       å¦å¤–,读者可以自己试试数据集2,3.