首先关于语言的选择,个人认为还是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是一个非常强大的模式识别库。
而且这时再看,机器学习也就不麻烦且不抽象了吧~~
机器学习方向的博士生,个人有几点体会。
1. 尽最大可能复用别人的代码。哪怕编译等等很麻烦,也可以在调试上省很多很多时间。血的教训。
2. 多把数据可视化出来,很多问题你看数字很难有直观感受,但往往一画出来就会发现哪里错了。这在高维数据下尤其明显。
3. 调试的时候和普通程序一样,看到结果不对就逆推,找到问题是从哪个地方开始引入,从哪句话开始实际数值和你的期待不一样的。定位问题就成功了一大半。可以用非常简单的数据代入验证,这样你也知道正确的结果是什么。
4. 关于工具的选择,原则实是先确认算法是对的,再调优实现。具体说先用matlab/python之类方便可视化的工具快速迭代找到一个能得到正确结果的算法。然后再用c++/mex优化速度。否则一个跑的很快的屎还是一坨屎。