[英]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.