机器学习

 

 

MATLAB下安装贝叶斯网络工具箱FULLBNT

转载2015-11-12 13:29:22

MATLAB版本:MATLAB 7.10.0 (R2010a)

FULLBNT版本:FullBNT-1.0.7,下载地址http://vdisk.weibo.com/s/aJo2nLguE5QIa/1447305019

操作系统:win7 旗舰版

(1)解压FullBNT-1.0.7.zip压缩包,如解压后的文件夹为“E:FullBNT-1.0.7”​

(2)​打开MATLAB,将E:FullBNT-1.0.7文件夹下的所有目录添加到MATLAB search path里面,具体步骤为:

1)在MATLAB命令行里键入“pathtool”,会出现​set path对话框。

MATLAB里键入pathtool命令

​2)点击对话框中的“Add with Subfolders”,选择FullBNT-1.0.7文件夹,这里是E:FullBNT-1.0.7,然后点击save即可。

FULLBNT路径添加

注意:有可能在点击save按钮的时候会出现“没有写pathdef.m文件夹的权限”的错误,这个时候只要关闭MATLAB,重新以管理员权限打开,按照上述步骤完成就可以了。

(3)​测试:在MATLAB命令行中键入“test_BNT”命令,如果正常执行,则可正常使用了!

 


 

机器学习算法诊断及调优经验

转载2015-11-30 16:20:44

问题:当我们训练出数据后,发现模型有太大误差,怎么办?

既然选了ML这个方向,毕业入职后的工作也无外乎模型训练和调优,大多数的时间将会用来解决上面的问题。于是,写下这篇文章,作为以后解决问题的参考手册,也算是为正式工作做一点点准备。

1)鉴别是过拟合还是欠拟合的问题

当发现训练出来的模型误差太大的时候,首先考虑的就应该是是否存在过拟合或者欠拟合的问题。但是,如何对二者进行有效鉴别呢?最简单的方法就是分别计算cross validation error(Jcv) 跟training error(Jtrain):当Jcv跟Jtrain差不多且Jtrain较大时,当前模型更可能存在欠拟合;当Jcv远远大于Jtrain且Jtrain较小时,当前模型更可能存在过拟合。

我们将整个数据集按照一定比例分为训练集和交叉验证集,假设训练集量为m,交叉验证集量为mcv。首先,我们利用m条训练集训练模型参数,并得到Jtrain;然后,将训练出的模型应用于交叉验证集,得到Jcv。这里附上Jcv和Jtrain的计算方法:

a)Jtrain的计算方法:​

b)Jcv的计算方法:

当然,我们可以对数据集进行多次划分,看看Jcv和Jtrain是否在统计上满足同一大小规律,确认我们的判断结果。

值得提醒的是,很多时候,我们在发现模型结果不理想时,并没有静下心来认真思考究竟是过拟合还是欠拟合,而是胡乱试用各种方法,缺乏针对性,导致调优过程花费了大量的时间。另外,在判断过拟合和欠拟合上有很多其它看似更完美、更理论的方式,但是我觉得没有太大的必要,简单地计算Jcv和Jtrain通常已经能准确定位问题了,性价比显然最高。

————————————————分割线————————————————

2)如果存在欠拟合,怎么办?

我相信,大多数时候,一开始,我们的算法会是欠拟合的。所以,如果你发现你的算法欠拟合后,恭喜你,你的调优工作才刚刚开始,也就是说,你的模型还差得远呢。正是因为如此,每次我的模型出现过拟合后,我都会开心一阵子,说明问题不大了。

解决欠拟合问题有以下几种方法。

a)添加其他特征

一直以来觉有有句话说得很有道理:“在机器学习里,特征决定了准确率的上限,而算法决定了结果趋近于上限的程度”。这句话也可以翻译成:“巧妇难为无米之炊”。特征是米,每个不同的机器学习算法就是做饭的巧妇。很多人在公司(特别是大公司)待一段时间后,不免都会有一点点失望。因为他们发现,公司里的很多“机器学习/数据挖掘工程师”或者“算法工程师”每天的工作,不过都是在不停地发现和调研新的特征来添加进原有的算法框架里,以提升算法的准确率,而不是发明一些更牛逼、高大上的算法来替换掉原有的算法框架。当然,研究高大上的算法的人有,但并不是那么多。我这里只是想说明特征很重要,而且,调研新的更有效的特征是机器学习里永无止境的有效工作。

不同的应用环境有不同的特征,下面是做搜索排序可能用到的一些特征类别,并不全,只是举个例子提供思路参考。​

在这里,特别说明一下,“组合”、“泛化”、“相关性”三类特征是特征添加的重要手段,无论在什么场景,都可以照葫芦画瓢,总会得到意想不到的效果。除上面的特征之外,“上下文特征”、“平台特征”等等,都可以作为特征添加的首选项。

b)添加多项式特征

这句话的意思其实就是提高模型的复杂度,增加模型的表达空间。例如,将原来的线性模型,通过特征添加,变为二次或三次模型。当然,这里并不需要改变本身的训练算法,只需要在原有的特征空间里添加相应的高次项特征即可。例如,原来有个特征x,可以将x^2或者x^3作为一个新的特征放到原来的线性系统里进行训练。

c)减小正则化参数

正则化的目的就是防止模型过拟合,现在模型出现了欠拟合,当然可以通过减小正则化参数的方法来避免欠拟合,不需要多解释。

————————————————分割线————————————————

3)如果存在过拟合,怎么办?

学术界关于过拟合的研究很多,这是因为这个主题会更理论一些,看起来更有技术含量一些。

解决过拟合问题有一下几种方法:

a)训练集选用更多样本

虽然我不同意“对于机器学习,样本数量越大训练出来的分类器正确率越高”这句话,但是如果样本量不足是肯定会有问题的。举个极端的例子,如果我们只有三个训练样本,很容易得到一个训练误差为0的模型,但是实际误差却很大,也就是过拟合问题。所以,选择更多的样本有可能在一定程度上解决过拟合的问题。但是,这种方法不一定每次都会奏效。首先,更多的样本并不一定那么容易得到,很多时候样本的获得是需要很大成本的;其次,即使能够得到,也得考虑时间、空间复杂度的问题,我们的算法平台是否允许这么大的样本量;最后,即使前面两个条件都允许,也不一定增加训练样本就能提高模型准确率,这也是为什么一开始我说我不同意“对于机器学习,样本数量越大训练出来的分类器正确率越高”这句话的原因。一开始,随着样本量的增加,模型准确率肯定会相应增加,但是,当样本量达到一定程度(饱和)后,样本量的增加是没有意义的,这个时候就需要用其他方法实现准确率的提升。

b)采用更小的特征集

不仅特征的次数彰显了模型的复杂度,特征集的维数也一样彰显了模型的复杂度。所以,采用更小的特征集,可以解决过拟合的问题。一般,减小特征集的方法有:特征选择和特征抽取。二者的区别是:特征选择是指在原有的特征中选择一部分特征来用,抛弃不重要的特征,新的特征集是原特征集的子集。详细的特征选择方法介绍可以参考这里:http://www.cnblogs.com/heaad/archive/2011/01/02/1924088.html;特征抽取是指通过原有的高维特征构建新的特征,新的特征维度远远低于原有特征的维度,新的每一维特征都是原有所有特征的加权组合。最常见的特征抽取方法有主成分分析(PCA)和因子分析。

c)增大正则化参数

正则化的目的就是防止模型过拟合,这里不解释。

d)减小模型复杂度,降低模型阶次(不推荐)

 

 

多属性方案决策的权重敏感性可视化

转载2015-11-11 17:12:00
主界面
操作方法介绍
单词最优决策
最优方案与权重分布关系图
技术路线​

源代码:

#coding:gbk

#filename:scheme_decision_making.py

#完成题目:

#        第七题:多属性方案决策的权重敏感性可视化

#方案决策决策模型:TOPSIS

from numpy import *

import math

import wx

import matplotlib

import matplotlib.pyplot as plt

def printArray(array_0):

    '''本函数为调试函数,功能为打印矩阵'''

    for eachRow in array_0:

        for eachData in eachRow:

            print eachData ,

        print ' '

def autoNorm(projects):

    '''用'向量规范法'对用户输入的方案指标信息进行归一化'''

    '''归一化方程为:y=y/qrt(sum(yi^2))'''

    projects_norm=[]

    m=len(projects[0])

    sum2Num=[0]*m

    for eachP in projects:

        i=0

        for eachW in eachP:

            sum2Num[i]=sum2Num[i]+eachW*eachW

            i=i+1

    for eachP in projects:

        project=[]

        i=0

        for eachW in eachP:

            project.append(eachW/math.sqrt(sum2Num[i]))

            i=i+1

        projects_norm.append(project)

    return projects_norm

def referenceSolution(projects_norm_weight):

    '''确定理想和负理想解'''

    m=len(projects_norm_weight[0])

    bestSolution=[0]*m

    worstSolution=[9999999999]*m

    for eachP in projects_norm_weight:

        i=0

        for eachW in eachP:

            if eachW>=bestSolution[i]:

                bestSolution[i]=eachW

            if eachW<=worstSolution[i]:

                worstSolution[i]=eachW

            i=i+1

    return bestSolution,worstSolution

def oushijuli(vector1,vector2):

    '''计算两个向量的欧氏距离'''

    n=len(vector1)

    distance=0

    for i in range(0,n):

        distance=distance+(vector1[i]-vector2[i])*

                  (vector1[i]-vector2[i])

    distance=math.sqrt(distance)

    return distance

def schemeDecision(projects,weights):

    '''算法核心程序:根据TOPSIS模型进行方案决策'''

    '''projects为方案指标信息构成的矩阵'''

    '''weights为权重值'''

    #printArray(projects)

    #print weights

    projects_norm=autoNorm(projects)

    #printArray(projects_norm)

    projects_norm_weight=[]

    for eachP in projects_norm:

        project=[]

        i=0

        for eachW in eachP:

            project.append(eachW*weights[i])

            i=i+1

        projects_norm_weight.append(project)

    #printArray(projects_norm_weight)

    bestSolution,worstSolution=referenceSolution(projects_norm_weight)

    #print bestSolution

    #print worstSolution

    tobest=[]

    toworst=[]

    for eachP in projects_norm_weight:

        tobest.append(oushijuli(eachP,bestSolution))

        toworst.append(oushijuli(eachP,worstSolution))

    #print tobest

    #print toworst

    n=len(tobest)

    resultDistance=[]

    for i in range(0,n):

        if tobest[i]==toworst[i]:

            resultDistance.append(0.5)

        else:

            resultDistance.append(toworst[i]/(tobest[i]+toworst[i]))

    #print resultDistance

    projectDecision=0

    for i in range(1,n):

        if resultDistance[i]>resultDistance[projectDecision]:

            projectDecision=i

    #print projectDecision+1

    return projectDecision+1

def drawRelationalGraph(evt):

    '''生成最优方案与权重分布关系图'''

    projects=[]

    try:

        targets_1=[float(w_1_1.GetValue()),float(w_1_2.GetValue()),float(w_1_3.GetValue())]

        targets_2=[float(w_2_1.GetValue()),float(w_2_2.GetValue()),float(w_2_3.GetValue())]

        targets_3=[float(w_3_1.GetValue()),float(w_3_2.GetValue()),float(w_3_3.GetValue())]

    except:

        dlg=wx.MessageDialog(None,"请在方案指标信息录入中输入整数或小数!","错误提示")

        dlg.ShowModal()

        dlg.Destroy()

        return

    projects.append(targets_1)

    projects.append(targets_2)

    projects.append(targets_3)

    step=int(slider.GetValue())

    xList_1=[]

    xList_2=[]

    xList_3=[]

    yList_1=[]

    yList_2=[]

    yList_3=[]

    x_coor=range(0,100,step)

    y_coor=range(0,100,step)

    for eachXNum in x_coor:

        for eachYNum in y_coor:

            x=float(eachXNum)/100

            y=float(eachYNum)/100

            weights=[x,y,1-x-y]

            result=schemeDecision(projects,weights)

            if result==1:

                xList_1.append(x)

                yList_1.append(y)

            elif result==2:

                xList_2.append(x)

                yList_2.append(y)

            elif result==3:

                xList_3.append(x)

                yList_3.append(y)

    if len(xList_1)+len(xList_2)+len(xList_3)>0:

        fig=plt.figure()

        ax=fig.add_subplot(1,1,1)

        ax.set_xlabel('W1')

        ax.set_ylabel('W2')

        plot1=ax.scatter(xList_1,yList_1,color=['r']*len(xList_1))

        plot2=ax.scatter(xList_2,yList_2,color=['g']*len(xList_2))

        plot3=ax.scatter(xList_3,yList_3,color=['y']*len(xList_3))

        plotList=[]

        labelList=[]

        if len(xList_1)>0:

            plotList.append(plot1)

            labelList.append('Project_1')

        if len(xList_2)>0:

            plotList.append(plot2)

            labelList.append('Project_2')

        if len(xList_3)>0:

            plotList.append(plot3)

            labelList.append('Project_3')

        plt.legend(plotList,labelList)

        plt.show()

def onceJuece(evt):

    '''进行单次方案决策'''

    projects=[]

    try:

        targets_1=[float(w_1_1.GetValue()),float(w_1_2.GetValue()),float(w_1_3.GetValue())]

        targets_2=[float(w_2_1.GetValue()),float(w_2_2.GetValue()),float(w_2_3.GetValue())]

        targets_3=[float(w_3_1.GetValue()),float(w_3_2.GetValue()),float(w_3_3.GetValue())]

    except:

        dlg=wx.MessageDialog(None,"请在方案指标信息录入中输入整数或小数!","错误提示")

        dlg.ShowModal()

        dlg.Destroy()

        return

    projects.append(targets_1)

    projects.append(targets_2)

    projects.append(targets_3)

    try:

        x=float(quanzhong1.GetValue())

        y=float(quanzhong2.GetValue())

    except:

        dlg=wx.MessageDialog(None,"请在特定权重决策中输入0-1的小数!","错误提示")

        dlg.ShowModal()

        dlg.Destroy()

        return

    if x>1 or x<0 or y>1 or y<0 or x+y>1:

        dlg=wx.MessageDialog(None,"W1和W2必须处于0-1之间并且满足和小于1!","错误提示")

        dlg.ShowModal()

        dlg.Destroy()

        return

    weights=[x,y,1-x-y]

    result=schemeDecision(projects,weights)

    dlg=wx.MessageDialog(None,"当W1="+str(x)+",W2="+str(y)+

                         "时,最优决策为方案"+str(result),"最优决策结果")

    dlg.ShowModal()

    dlg.Destroy()

if __name__=="__main__":

    '''主程序,主要是界面代码'''

    app=wx.App()

    winlong=435

    winwidth=455

    win=wx.Frame(None,title='多属性方案决策的权重敏感性可视化',size=(winwidth,winlong))

    win.SetMaxSize((winwidth,winlong))

    win.SetMinSize((winwidth,winlong))

    panel=wx.Panel(win)

    

    sb = wx.StaticBox(panel, label="方案指标信息录入")

    boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL)

    

    kongbai=wx.StaticText(panel,label='')

    shuxing1=wx.StaticText(panel,label='指标1')

    shuxing2=wx.StaticText(panel,label='指标2')

    shuxing3=wx.StaticText(panel,label='指标3')

    fangan1=wx.StaticText(panel,label='方案1')

    fangan2=wx.StaticText(panel,label='方案2')

    fangan3=wx.StaticText(panel,label='方案3')

    w_1_1=wx.TextCtrl(panel,value='1')

    w_1_2=wx.TextCtrl(panel,value='1')

    w_1_3=wx.TextCtrl(panel,value='1')

    w_2_1=wx.TextCtrl(panel,value='1')

    w_2_2=wx.TextCtrl(panel,value='1')

    w_2_3=wx.TextCtrl(panel,value='1')

    w_3_1=wx.TextCtrl(panel,value='1')

    w_3_2=wx.TextCtrl(panel,value='1')

    w_3_3=wx.TextCtrl(panel,value='1')

    fgs = wx.FlexGridSizer(4,4,5,5)

    fgs.AddMany([(kongbai),(shuxing1),(shuxing2),(shuxing3),

                 (fangan1),(w_1_1),(w_1_2),(w_1_3),

                 (fangan2),(w_2_1),(w_2_2),(w_2_3),

                 (fangan3),(w_3_1),(w_3_2),(w_3_3)])

    boxsizer.Add(fgs,flag=wx.ALL|wx.EXPAND, border=10)

    buttonbox=wx.BoxSizer()

    kongbai2=wx.StaticText(panel,label='',size=((winwidth-250)/2,-1))

    kongbai3=wx.StaticText(panel,label='',size=((winwidth-250)/2,-1))

    buttonbox.Add(kongbai2)

    fenxibutton=wx.Button(panel,label='最优方案与权重分布关系图',size=(250,-1))

    fenxibutton.Bind(wx.EVT_BUTTON,drawRelationalGraph)

    buttonbox.Add(fenxibutton)

    buttonbox.Add(kongbai3)

    

    hbox = wx.BoxSizer(wx.VERTICAL)

    hbox.Add(boxsizer,flag=wx.ALL|wx.EXPAND, border=15)

    sb2 = wx.StaticBox(panel, label="特定权重决策")

    boxsizer2 = wx.StaticBoxSizer(sb2, wx.VERTICAL)

    tedingquanzhong1=wx.StaticText(panel,label='W1:')

    tedingquanzhong2=wx.StaticText(panel,label='W2:')

    quanzhong1=wx.TextCtrl(panel,value='0.3')

    quanzhong2=wx.TextCtrl(panel,value='0.3')

    juecebutton=wx.Button(panel,label='最优决策',size=(80,25))

    juecebutton.Bind(wx.EVT_BUTTON,onceJuece)

    fgs2 = wx.FlexGridSizer(1,5,5,5)

    fgs2.AddMany([(tedingquanzhong1),(quanzhong1),

                  (tedingquanzhong2),(quanzhong2),(juecebutton)])

    boxsizer2.Add(fgs2,flag=wx.ALL|wx.EXPAND, border=10)

    hbox.Add(boxsizer2,flag=wx.LEFT|wx.RIGHT|wx.EXPAND, border=15)

    

    hengbox=wx.BoxSizer()

    quanzhongstep=wx.StaticText(panel,label='权重变化步长(%)',size=(110,45),

                                style=wx.ALIGN_CENTER)

    slider = wx.Slider(panel, 100, 5, 1, 100,size=(250, -1),

                       style=wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS )

    slider.SetTickFreq(5, 1)

    hengbox.Add(quanzhongstep)

    hengbox.Add(slider)

    hbox.Add(hengbox,flag=wx.ALL|wx.EXPAND,border=10)

    line = wx.StaticLine(panel)

    hbox.Add(line,flag=wx.EXPAND|wx.BOTTOM,border=10)

    hbox.Add(buttonbox,flag=wx.ALL|wx.EXPAND)

    

    panel.SetSizer(hbox)

    

    win.Center()

    win.Show()

    app.MainLoop()

 
 

评论

重要提示:警惕虚假中奖信息
 
 
 
 
 
 
 
  
 

http://blog.sina.com.cn/s/blog_818f5fde0102vvnh.html

在利用支持向量机进行分类的时候怎么选择合适的核函数?

转载2015-11-11 16:27:03

之前在面试某公司的时候,提到曾经在项目中利用SVM进行分类。面试官提的其中一个问题就是当时是怎么选择核函数的。之前在做项目时,其实并没有想过这个问题,直接默认用的RBF核,效果也不错,所以就实话实说了。但是明显感觉面试官对我的回答不是很满意,多半觉得我做事情不够精益求精。于是,过后在知乎上面专门问了这个问题(http://www.zhihu.com/question/33268516),非常开心很多人都分享了自己的想法和经验。下面的总结多半来自知乎上的回答,页面中的图片也非原创,只为省事儿,如有侵权,求原谅。

(1)先介绍一下常见核函数的类别​

​常见核函数也就几种,线性核、径向基核(高斯核函数)、多项式核函数、sigmoid核函数

常见核函数公式
常见核函数参数

​(2)实际应用中对于核函数选择的态度

​1)获赞最多的答案是Andrew Ng的理论,由“邱霸气”在知乎上回答。

Andrew Ng理论1:当数据量足够庞大时,feature足够多时,所有的分类算法最终的效果都差不多。也就是说,不管你选用什么样的核,在训练集够大的情况下都是然并卵。当然,就分类效果来说,非线性的比线性的核好一些。但线性的也能够有很不错的分类效果,而且计算量比非线性小,所以需要具体情况具体分析。 

Andrew Ng理论2:老实人Andrew教你如何选择合适的SVM核。

情况1:当训练集不大,feature比较多的时候,用线性的核。因为多feature的情况下就已经可以给线性的核提供不错的variance去fit训练集。

情况2:当训练集相对可观,而feature比较少,用非线性的核。因为需要算法提供更多的variance去fit训练集。情况3:feature少,训练集非常大,用线性的核。因为非线性的核需要的计算量太大了。而庞大的训练集,本身就可以给非线性的核提供很好的分类效果。

LR与SVM的选择

2)对每种核函数进行交叉验证,取效果最好的核函数

感觉这种方法应该是最好的,但是实施起来,你懂得……​

3)​跟我一样的消极党:认为rbf核是最通用的核函数,如果是用SVM做应用,一般不需要在核函数上下功夫,线性情况就用线性核,非线性的时候用rbf核就可以了。甚至有时候会发现非线性的情况下用线性核效果也会很好^O^ 

4)比我还消极的党:随便选一个就行了,不行就换一个,这根本就没啥可说。而且一般也不会用svm,因为速度慢,线性svm的话被logistic完爆

(3)学术上关于核函数选择的方法​

1)《A Practical Guide to Support Vector Classification》​,网址:http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf

2)mutiple kernel learning,一堆kernel放一起,让模型自己学出个最好的kernel,论文《Multiple Kernel Learning Algorithms》​,网址:http://users.ics.aalto.fi/gonen/files/gonen_jmlr11_paper.pdf

反正我没看过这些论文,感兴趣的可以看看

原文地址:https://www.cnblogs.com/zhizhan/p/5039052.html