2012-05-07 58 views
0

我正在使用Java來讀取和處理來自UCI Machine Learning Repository的一些數據集。 我開始爲每個數據集創建一個類並使用特定的類文件。數據集中的每個屬性都由所需類型的類中的相應數據成員表示。這種方法運行良好,直到沒有。屬於< 10-15。我只是增加或減少了該類的數據成員,並將其類型更改爲對新數據集建模。我還對功能進行了必要的更改。在Java中讀取大量數據

問題: 現在我必須使用很多大型數據集。擁有20-30個屬性的人對這種方式的工作非常乏味。我不需要查詢。我的數據離散化算法只需要對數據進行4次掃描即可將其離散化。我的工作在離散化後立即結束。這將是一個有效的策略?

我希望我能夠清楚地陳述我的問題。

+0

有些問題:1)您如何計劃使用數據?如果你想查詢或做類似的事情,可能數據庫是你最好的選擇。 2)你如何從存儲庫中獲取數據? – javydreamercsw

+0

當你說大型數據集時,你是什麼意思?數據的問題究竟是什麼?你能提供一個例子嗎? – Behe

+0

我正在測試一種新的數據離散化算法。爲此,我需要讀取數據並在Java中處理它 –

回答

1

創建一個包含類似下面的成員一個簡單的DataSet類:

public class DataSet { 
    private List<Column> columns = new ArrayList<Column>(); 
    private List<Row> rows = new ArrayList<Row>(); 

    public void parse(File file) { 
     // routines to read CSV data into this class 
    } 
} 

public class Row { 
    private Object[] data; 

    public void parse(String row, List<Column> columns) { 
     String[] row = data.split(","); 
     data = new Object[row.length]; 

     int i = 0; 
     for(Column column : columns) { 
      data[i] = column.convert(row[i]); 
      i++; 
     } 
    } 
} 

public class Column { 
    private String name; 
    private int index; 
    private DataType type; 

    public Object convert(String data) { 
     if(type == DataType.NUMERIC) { 
      return Double.parseDouble(data); 
     } else { 
      return data; 
     } 
    } 
} 

public enum DataType { 
    CATEGORICAL, NUMERIC 
} 

這會處理任何數據集要使用。唯一的問題是用戶必須定義​​數據集,方法是將數據列及其各自的數據類型定義到數據集。您可以在代碼中執行此操作,也可以從文件中讀取任何您認爲更簡單的內容。你可能能夠默認很多配置數據(比如說CATEGORICAL),或者試圖解析字段,如果失敗它必須是CATEGORICAL,否則它的數字。通常情況下,該文件包含一個您可以解析的標題以查找列的名稱,然後您只需查看該列中的數據即可確定數據類型。猜測數據類型的簡單算法對於幫助您有很大的幫助。基本上,這是每隔一個包使用這種數據的完全相同的數據結構(例如R,Weka等)。

+0

非常感謝。這與我正在執行的實現最接近。似乎並非來自UCI Repo的所有文件都包含標題中的信息。我正在將我的離散數據集提供給Weka。這是一個很大的幫助! –

+0

並非UCI Repo中的所有數據集都有一個標題,但這可以是您爲解析器提供的可配置參數。它是否有一個頭文件,或者不是真正的只是你的解析器查找與否的參數。最後,標題只是簡單的用戶友好標籤,用戶可以使用它來引用列和配置數據集。如果它在那裏解析人類友好的標籤。如果不是F1,F2,F3等可以使用。你的用戶必須提供信息,比如哪一列是預測,可能是數據類型(字符串,浮點數)等等。 – chubbsondubs

+0

謝謝。上面的代碼只是一些小的更正 '公共無效解析(字符串行,列表列){ String [] cols = row.split(「,」); data = new Object [cols.length]; int i = 0; (列col:列){ data [i] = col.convert(cols [i]); i ++; } }' –

3

一些選項:

  1. 寫代碼生成器來讀取文件的元數據,並生成等價類文件。
  2. 不要打擾類;將數據保存在ObjectString的數組中,並根據需要進行轉換。
  3. 創建包含的DataElements和子DataElements您需要和使用元數據在運行時創建正確的類所有類型的集合類。
+0

謝謝。這爲我開闢了新的學習途徑。我從來沒有像你正在談論的代碼生成器那樣做。你能否提供一些指導我可以開始瞭解它的地方? –

+0

在這種情況下,您只需編寫一個輸出Java類文件的程序。有很多方法可以做到這一點,但基本上只是基於元數據打印出類骨架和成員變量,就像手動操作一樣。 – dfb

0

我在我的一個項目中做過類似的事情;大量的可變數據,在我的情況下,我從互聯網上獲取數據。由於我需要查詢,排序等,我花了一些時間設計數據庫以適應數據的所有變化(並非所有條目都具有相同數量的屬性)。它需要一段時間,但最終我使用相同的代碼來獲取任何條目的數據(在我的情況下使用JPA)。我的IDE(NetBeans)直接使用數據庫模式創建了大部分代碼。

從你的問題,目前還不清楚你打算如何使用數據,所以我回答基於個人經驗。