首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Weka FileNotFoundException:資料檔案路徑錯誤或類庫未完整引入

     編輯:程式設計綜合問答

錯誤現象

執行 Weka K-Means 叢類程式,拋出 java.io.FileNotFoundException: \iris.2.arff (系統找不到指定的文件。)。堆疊顯示錯誤發生在 ADNode.main,而非主程式 kmeans.main,暗示類路徑或引用混亂。

原因分析

  1. 相對路徑解析錯誤:new File("D://weka//Weka-3-6//data//contact-lenses.arff") 使用雙斜線雖在 Windows 可行,但若工作目錄非預期,會找不到檔案。
  2. 錯誤堆疊指向 ADNode:實際執行的主類別可能非 kmeans,或專案引用了舊版 Weka 類別(ADNode 為貝氏網路節點,非 K-Means 相關)。
  3. 類庫版本衝突:專案可能同時引用 Weka 3.5 與 3.6 jar,導致類別載入混亂。

解決步驟

1. 使用絕對路徑或 ClassLoader 取得資源

// 方式一:絕對路徑(確認檔案存在)
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();

2. 統一 Weka 版本,清理類路徑

  • Maven/Gradle 專案:僅保留一個 Weka 依賴(如 org.nuiton.weka:weka-stable:3.8.6)。
  • Eclipse 專案:Build Path → Libraries 移除重複/舊版 jar,僅保留一個版本。
  • 檢查 Main-Class 設定確為 discuz.kmeans。

3. 正確的 K-Means 程式碼範本(Weka 3.8+)

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);
        }
    }
}

避坑指南

  • 檔案路徑優先用 ClassLoader 資源流,避免工作目錄、打包後路徑失效。
  • 依賴管理用 Maven/Gradle,杜絕手動放 jar 導致的版本地獄。
  • 閱讀堆疊追蹤:錯誤發生在 ADNode.main 表示執行入口非預期,檢查執行配置。
  • Weka 3.6 較舊,建議升級 3.8+,API 更穩定、支援串流輸入。

理清「檔案怎麼讀」與「類別怎麼載入」兩條線,Weka 實驗才能順利跑通。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved