起因
在看老師KNN代碼時,對下面疑惑不解:
int classVal = (int) data.instance(i).classValue();
其中,data是instances(資料集)執行個體。分的類明明是yes/no,怎麼還能強制轉換?
經過
資料集取自weka安裝目錄data
@relation weather
@attribute outlook {sunny, overcast, rainy}
@attribute temperature real
@attribute humidity real
@attribute windy {TRUE, FALSE}
@attribute play {yes, no}
@data
sunny,85,85,FALSE,no
sunny,80,90,TRUE,no
overcast,83,86,FALSE,yes
rainy,70,96,FALSE,yes
rainy,68,80,FALSE,yes
rainy,65,70,TRUE,no
overcast,64,65,TRUE,yes
sunny,72,95,FALSE,no
sunny,69,70,FALSE,yes
rainy,75,80,FALSE,yes
sunny,75,70,TRUE,yes
overcast,72,90,TRUE,yes
overcast,81,75,FALSE,yes
rainy,71,91,TRUE,no
此處省略N個字
結果
weka處理離散屬性時,根據arff檔案的聲明順序做了個 0.0−>n.0
outlook {sunny=0.0, overcast=1.0, rainy=2.0}
classValue()傳回的是對應的double數值。
測試代碼
.read("E:/DataLearing/data/weather.numeric.arff");
instances.setClassIndex(instances.numAttributes()-1);
System.out.println(instances.numClasses());//輸出分類類别數,即yes/no
System.out.println(instances.attribute(0).value(0));//輸出第一個屬性值,與上面結合可輸出對應關系
System.out.println(instances.instance(0).classValue());//輸出執行個體屬性對應數值
System.out.println(instances.classAttribute().value((int) instances.instance(0).classValue()));//輸出執行個體屬性值