簡體   English   中英

嘗試索引零值

[英]Attempt to index a nil value

我正在編寫一個lua腳本來實現決策樹。但是在創建決策樹時,它總是在函數中引發異常。即使“斷言”,我也找不到錯誤的地方。對不起我的英語:P。

DTree.lua:

-- Decision Tree (ID3)
-- by Darksun2010

function calcShannonEnt(dataSet)
    local labelScore={};
    for _,v in pairs(dataSet) do
        local curLabel=v[#v];
        if (labelScore[curLabel]) then
            labelScore[curLabel]=labelScore[curLabel]+1;
        else
            labelScore[curLabel]=1;
        end
    end
    local result=0.0;
    for _,v in pairs(labelScore) do
        local prob=v/#dataSet;
        result=result-prob*math.log(prob,2);
    end
    return result;
end

function splitDataSet(dataSet,axis,value)
    local reDataSet={};
    for _,v in pairs(dataSet) do 
        if v[axis]==value then
            local reSet=table.pack(table.unpack(v,1,axis-1),
                                   table.unpack(v,axis+1,#v));
            if (reSet[1]==nil) then
                table.remove(reSet,1);
            end
            if (reSet[#reSet]==nil) then
                table.remove(reSet);
            end
            table.insert(reDataSet,reSet);
        end
    end
    return reDataSet;
end

function chooseBest(dataSet)
    local numFeaures=#dataSet[1]-1;
    local baseEnt=calcShannonEnt(dataSet);
    local maxGain,bestFeature=0,-1;
    for i=1,numFeaures do
        local featSet={};
        local newGain=0;
        for _,v in pairs(dataSet) do
            featSet[v[i]]=1;
        end
        for k,_ in pairs(featSet) do
            local subDataSet=splitDataSet(dataSet,i,k);
            local prob=#subDataSet/#dataSet;
            newGain=newGain+prob*calcShannonEnt(subDataSet);
        end
        local infoGain=baseEnt-newGain;
        if (infoGain>maxGain) then
            maxGain=infoGain;
            bestFeature=i;
        end
    end
    return bestFeature;
end

function majorityCnt(classList)
    local classCount={};
    for _,v in pairs(classList) do
        if (classCount[v]) then
            classCount[v]=classCount[v]+1;
        else
            classCount[v]=1;
        end
    end
    local maxN,maxK=0,nil;
    for k,v in pairs(classCount) do
        if (v>maxN) then
            maxN,maxK=v,k;
        end
    end
    return maxK;
end

function makeDTree(dataSet,labels)
    local classList={};
    for _,v in pairs(dataSet) do
        table.insert(classList,v[#v]);
    end
    local endFlag=true;
    for _v in pairs(classList) do
        if (not endFlag) then
            break;
        end
        endFlag=endFlag and (v==classList[1]);
    end
    if (#dataSet[1]==1) then
        return majorityCnt(classList);
    end
    local bestFeat=chooseBest(dataSet);
    local bestFeatLabel=labels[bestFeat];
    local myTree,featSet={},{};
    for _,v in pairs(dataSet) do 
        featSet[v[bestFeat]]=1;
    end
    for k,_ in pairs(featSet) do
        local subLabels=labels;
        local subTree=makeDTree(splitDataSet(dataSet,bestFeat,k),subLabels);
        myTree[bestFeatLabel][k]=subTree;
    end
    return myTree;
end

我這樣稱呼它:

> labels = {'no表面處理','flippers'}

> dataSet = {{1,1,'yes'},{1,1,'yes'},{1,0,'no'},{0,1,'no'},{0,1,'沒有'}}

> makeDTree(數據集,標簽)

DTree.lua:106:嘗試索引一個零值(字段“?”)

堆棧回溯:

DTree.lua:106:在函數'makeDTree'中

DTree.lua:105:在函數'makeDTree'中

(...尾聲...)

[C]:在?

第106行是myTree[bestFeatLabel][k]=subTree; 但是myTree為空,因此myTree[bestFeatLabel]為零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM