2016-12-14 46 views
0

我有這樣定義的決策樹節點類:寫入和負載決策樹文件C++

class dt_node 
{ 
public:  
    dt_node* child[2]; //two child nodes 
    int feature; 
    double value; // feature and value this node splits on 
    bool leaf; 
    double pred; // what this node predicts if leaf node 
} 

有沒有,如果需要一種方法,我可以這樣寫一個文件,並重建該文件中的樹?

+0

你看過boost序列化嗎? – UKMonkey

+2

是的。首先你需要設計你的文件。那麼你需要以這種格式編寫它。之後,閱讀該格式。 – AndyG

+0

此問題可能會幫助您:http://stackoverflow.com/questions/2046829/write-and-read-object-of-class-into-and-from-binary-file – pingul

回答

1

你可以做到這一點無論如何你想...

而真正的答案是:這真的是隻有你。如果我是你,並且不得不將這種對象保存在一個.txt文件中,那麼我只是想出一些方法來保存這個結構,例如0*0*0.0*0*0.0。用第一個0表示子節點的數量,第二個0表示feature的值等,而*字符是值之間的分隔符。空格可以更好地工作,但我不喜歡它們作爲我的文件中的分隔符......文本文件將在每個分隔的對象之間具有其他字符(例如,|)。示例看起來像3*22*31.11*1*1.0|2*2*1.0*0*33.3

顯然我可能誤解了你的問題。如果你問有沒有辦法保存這個特定的代碼,並通過在沒有dt_node的課程中打開該文件來執行它,不幸的是,我覺得我的知識還不足以回答。

希望它有助於無論如何。

1

如果你想自己編寫這個格式,我只需要從文件根節點開始寫入其他節點的參數(兩個雙精度,bool和一個整數),然後循環遍歷樹。正如我所看到的,你擁有的布爾控制節點是否有孩子,這將有助於閱讀文件過程。

文件讀取將比文件寫入複雜一點。對於讀取的每個節點,再次循環讀取下一個節點,直到任何節點的級別等於或小於當前節點的級別。這聽起來很複雜,但實際上並非如此。

當然,你不應該寫文件的note *指針,因爲它們包含無用的信息,因爲在讀取文件時你將不得不重新創建完整的樹。

1

爲您的項目添加提升可能有點痛苦,但是那裏有不少圖書館,包括數學和圖形,所以這可能是值得的。

升壓序列化文檔是與here教程here

序列化庫允許你哪怕只是1功能添加到您的類然後定義如何保存和加載類的狀態。數據實際保存的方式是由boost庫完成的,例如你可以用二進制文件保存xml &文本。

唯一需要注意的是二進制序列化不是機器可轉換的。

+0

dt_node類有兩個相同類型的子項。使用boost :: serialization時,我必須考慮遞歸嗎? @UKMonkey – ascetic652

+0

仔細看看,這也是它的一些部分也進入了std庫,https://isocpp.org/wiki/faq/serialization 無論如何,是的,你必須考慮遞歸,可能是最簡單的方法做到這一點是執行2次傳球;一個是用一個唯一的id(它們的指針?)生成一個所有節點都變平的結構,然後一個保存該結構。 – UKMonkey