发现两个问题:
一、关于libsvm的移植
本章移植libsvm的时候提到,Python版本在变化,2.4和2.5操作已经很不一样,更别说Python3了。当时在Python2和Python3之间犹豫了一下。最后决定跟着书上程序一步一步来,所以选择了Python2。
其实libsvm版本变化也是巨大。。。操作如下:
1.作者源码中提供的svmc.pyd和svm.py在Python2.6上尝试不成功。
2.上libsvm官网下载最新的libsvm3.0,发现变动太大,接口的操作格式都不一样了,果决放弃。
3.网上有人用libsvm2.89在Python2.6成功,于是仿效。两步:将libsvm-2.89/windows/python目录下的svmc.pyd文件复制到C:/Python26/DLLs;将libsvm-2.89/python目录下的svm.py放到C:/Python26/Lib目录里。from svm import * 成功。
PS:libsvm-2.89跟原作者使用的libsvm接口还是有点点不同。比如:m.save(test.model) -> m.save('test.model')。其他的暂时还没深究,有问题出现再总结。
rm: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px;">二、数据的缩放处理
由于上不了国外网,索性将milesdistance定义为空函数,返回0。作者也说了,如果用不了Yahoo!API的话,可以这么做。
但是接下来在缩放的时候出现的问题作者就没考虑了。这让我着实费了些功夫。
如果返回的距离都为0的话,那最后一列的最大值和最小值都为0 & high-low=0,作为分子被除的话会立马报错。主要也是我太相信作者的那句话,以至于没有觉得会是这个原因,还以为是数据的原因,里面出现了high=low的情况,调试了半天才发现是这个原因。
类似chapter7那个问题的解决方法,我就索性不处理最后一列。红色为修改了的地方:
for i in range(len(d)-1):
if d[i]<low[i]: low[i]=d[i]
if d[i]>high[i]: high[i]=d[i]
##############################
def scaleinput(d):
newd = [0.0]*len(low)
for i in range(len(low)-1):
newd[i] = (d[i]-low[i])/(high[i]-low[i])
return newd
初步看了下数据,应该是没有问题,只是将距离的因素去掉了。