百科问答小站 logo
百科问答小站 font logo



编写基于机器学习的程序,有哪些编写和调试的经验和窍门? 第1页

  

user avatar   wdwind 网友的相关建议: 
      

首先关于语言的选择,个人认为还是Matlab比较合适,因为目前在学术领域,用Matlab的人感觉还是相对多一点的。题主如果在写代码的过程中遇到了问题,也比较方便向别人请教。目测开源的机器学习库也是Matlab更多。当然如果对程序速度有严格要求,就可以考虑C++。

其次对于题主你来讲,最重要的问题是要明确自己的目的

说实话,如果只是一个课程作业的话,完全没必要深入到很多算法的细节,只要了解了算法的大体流程即可,再选择别人实现好的算法,多次测试,一般结果是可以让人满意的。

但如果题主是想继续在机器学习领域深入研究的话,了解算法细节就是必不可少的了。不过即便这样,还是要从简单入手逐渐加深难度。否则学习曲线太陡,一般人都hold不住。

(另外自己感觉机器学习还算是入门容易精通难的,深入研究充满了大量细节和数学,研究者们也在一直outperform其他人……)

所以,综上,题主最好从简单入手

先了解基本算法思路,再使用现成代码进行实验!

在此,我强烈推荐一个模式识别库 PRTools5!在这里下载:

Software - Pattern Recognition Tools

,作者叫

R.P.W. Duin

这个库最大的优点就是简单方便,而且实现了大量大量常用算法,对于初学者,完全可以上手就用,避免陷入细节的泥潭。而且都经过大量测试,基本没有严重bug。简单举几个栗子:

首先,需要构造两个数据集:

       A = prdataset(X1, Y1) B = prdataset(X2, Y2)     

其中,prdataset是PRTools5中的函数,目的就是构造数据集……

X是训练数据矩阵,每一行是一个数据点(一个object),每列是一个特征(feature)。Y是一个列向量,代表数据X的标签。怎么样,简单吧……

之后,就可以进行分类(classification)了!

       w1 = knnc(A); w2 = qdc(A); w3 = svc(A); w4 = naivebc(A); % ......     

其中,w1, w2, w3, w4 就是训练好的分类器了。knnc是knn…qdc是Quadratic Bayes Normal Classifier,svc是Linear Support Vector Machine……naivebc是Naive Bayes。

至于各种参数呢?函数都已经自动选择了,当然题主根据自己要处理的具体问题,也完全可以手动指定。

之后就可以测试结果了,我们选择B作为测试集。

       e1 = testd(B*w1); e2 = testd(B*w2); e3 = testd(B*w3); e4 = testd(B*w4); % ......     

这里的e就是classification error……当然也可以选择其他函数,使用其他判断标准。

但鉴于题主的数据是二维的,因此可视化是一个很好很强大的手段。(二维的!这年头哪还有这么好的事└(T_T;)┘……)。以下举例:

       A = gendatb([50 50]); B = gendatb([400 400]);     

此处使用了PRTools5自带的数据生成函数,A、B都是二维数据,2 classes,每类中有50(400)个objects。

       w1 = knnc(A); w2 = qdc(A); w3 = svc(A); w4 = naivebc(A); % ......     

……不用解释。

       scatterd(B); % 做测试数据散点图 hold on h1 = plotc(w1); % 做出分类器边界图,以下类似 h2 = plotc(w2, 'b'); h3 = plotc(w3, 'g'); h4 = plotc(w4, 'y'); legend([h1, h2, h3, h4], 'knnc', 'qdc', 'svc', 'naivebc')      

结果如下:

这时真相大白,原来gendatb是生成banana形状的数据…………而且显然,对于这种数据,knn的效果最好。

总之PRTools5是一个非常强大的模式识别库。

而且这时再看,机器学习也就不麻烦且不抽象了吧~~


user avatar    网友的相关建议: 
      

机器学习方向的博士生,个人有几点体会。

1. 尽最大可能复用别人的代码。哪怕编译等等很麻烦,也可以在调试上省很多很多时间。血的教训。

2. 多把数据可视化出来,很多问题你看数字很难有直观感受,但往往一画出来就会发现哪里错了。这在高维数据下尤其明显。

3. 调试的时候和普通程序一样,看到结果不对就逆推,找到问题是从哪个地方开始引入,从哪句话开始实际数值和你的期待不一样的。定位问题就成功了一大半。可以用非常简单的数据代入验证,这样你也知道正确的结果是什么。

4. 关于工具的选择,原则实是先确认算法是对的,再调优实现。具体说先用matlab/python之类方便可视化的工具快速迭代找到一个能得到正确结果的算法。然后再用c++/mex优化速度。否则一个跑的很快的屎还是一坨屎。




  

相关话题

  为什么机器学习解决网络安全问题总是失败? 
  如何向完全不懂编程的小伙伴解释「程序写死」? 
  面向对象中接口应该更抽象还是更具象? 
  就节省编译时间来说,Precompiled Header和Pimpl范式哪个更好? 
  为什么有人在学习初段效率惊人,而在过了入门阶段之后兴趣与学习能力都迅速下降? 
  你在阅读源代码或设计文档时,看到哪些惊艳的技巧? 
  如果用机器学习的理论来理解人的行为,会有什么发现? 
  以下我关于虚拟地址与物理地址的理解是正确的吗? 
  什么是 hash? 
  为什么说用了10年C++的程序员也不敢说自己精通C++? 

前一个讨论
浙江公务员年薪30万,是否意味着开始高薪养廉,这种模式在当下的中国合适吗?
下一个讨论
「资本回报率太高,劳动回报率太低」的说法是正确的吗?为何出现这样的现象?





© 2024-11-08 - tinynew.org. All Rights Reserved.
© 2024-11-08 - tinynew.org. 保留所有权利