執行 Weka K-Means 叢類程式,拋出 java.io.FileNotFoundException: \iris.2.arff (系統找不到指定的文件。)。堆疊顯示錯誤發生在 ADNode.main,而非主程式 kmeans.main,暗示類路徑或引用混亂。
new File("D://weka//Weka-3-6//data//contact-lenses.arff") 使用雙斜線雖在 Windows 可行,但若工作目錄非預期,會找不到檔案。kmeans,或專案引用了舊版 Weka 類別(ADNode 為貝氏網路節點,非 K-Means 相關)。// 方式一:絕對路徑(確認檔案存在)
File file = new File("D:/weka/Weka-3-6/data/contact-lenses.arff");
if (!file.exists()) throw new FileNotFoundException(file.getAbsolutePath());
// 方式二:將 .arff 放入 resources 目錄,用 ClassLoader 載入(打包後也可用)
InputStream is = getClass().getResourceAsStream("/data/contact-lenses.arff");
ArffLoader loader = new ArffLoader();
loader.setSource(is); // Weka 3.8+ 支援 setSource(InputStream)
Instances data = loader.getDataSet();
org.nuiton.weka:weka-stable:3.8.6)。Main-Class 設定確為 discuz.kmeans。public class KMeansDemo {
public static void main(String[] args) throws Exception {
// 載入資料
ArffLoader loader = new ArffLoader();
loader.setSource(KMeansDemo.class.getResourceAsStream("/data/iris.arff"));
Instances data = loader.getDataSet();
data.setClassIndex(data.numAttributes() - 1); // 若有類別欄位
// 建立叢類器
SimpleKMeans kmeans = new SimpleKMeans();
kmeans.setNumClusters(3);
kmeans.setSeed(42);
kmeans.buildClusterer(data);
// 輸出結果
Instances centroids = kmeans.getClusterCentroids();
System.out.println("Centroids:\n" + centroids);
for (int i = 0; i < data.numInstances(); i++) {
int cluster = kmeans.clusterInstance(data.instance(i));
System.out.printf("Instance %d -> Cluster %d%n", i, cluster);
}
}
}
ADNode.main 表示執行入口非預期,檢查執行配置。理清「檔案怎麼讀」與「類別怎麼載入」兩條線,Weka 實驗才能順利跑通。