亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mainfu.pas

?? 用Delphi7實現了ID3算法
?? PAS
字號:
{
 Description:ID3算法的簡單實現,使用ClientDataset作為內存表
 Author   : Oneloong
 Datetime     : 2008.03.08 
 Test data : WeatherInfo_EN.txt

}
unit MainFU;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Grids, StdCtrls, ComCtrls,math, DB, DBClient, DBGrids;

const
  NodeInfo = 'AttributeName: %s, Count: %d, Entropy: %8.3f, Gain: %8.3f';
type
  PSubSetInfo = ^TSubSetInfo;
  TSubSetInfo = record
    attriName : string;
    count     : integer;
    entropy   : double;
    gain      : double;
    Splited   : boolean ;
end;

//屬性信息
type
  PAttriInfo = ^TAttriInfo;
  TAttriInfo = record
    Val : TStringList;//值的列表
    Splited : boolean;//以分裂
end;

//值信息
type
  PValInfo = ^TValInfo;
  TValInfo = record
    count : integer;//值的次數
    ConditionCount : integer;//條件次數
end;


type
  TMainF = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Splitter1: TSplitter;
    btnLoadDB: TButton;
    Button2: TButton;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TV: TTreeView;
    Memo: TMemo;
    ledtNodeInfo: TLabeledEdit;
    ClientDataSet: TClientDataSet;
    DBGrid1: TDBGrid;
    DataSource: TDataSource;
    Label1: TLabel;
    cbbSA: TComboBox;
    procedure btnLoadDBClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure TVChange(Sender: TObject; Node: TTreeNode);
  private
    FAttributesList: TStringList;
    FOrgCDS: TClientDataSet;
    FtempCDS: TClientDataSet;
    FSplitedAttriList: TStringList;
    procedure SetAttributesList(const Value: TStringList);
    function isLeafNode(A1, V1: string;cds : TClientDataSet;  var LeafCaption : string): boolean;
    procedure SetOrgCDS(const Value: TClientDataSet);
    procedure SettempCDS(const Value: TClientDataSet);
    procedure SetSplitedAttriList(const Value: TStringList);
    procedure CopyClientData(Src: TClientDataSet;  Des : TClientDataSet);
  private
    FDBName: string;
    FDBInfoList: TStringList;
    FRecList: Tlist;
    FInitState: double;
    SubTreeView : TTreeView;
    CurrentNode : TTreeNode;
    //屬性列表
    property AttributesList : TStringList read FAttributesList write SetAttributesList;
    property SplitedAttriList :TStringList read FSplitedAttriList write SetSplitedAttriList;
    function LoadDB: boolean;
    function GetNodeInfo(attrName : string;Count :integer; Entropy :double; Gain :double) : string;
    procedure SetDBName(const Value: string);
    function FindNodeByText(aText : string) : TTreeNode;
  private
    { Private declarations }

    property DBName : string read FDBName write SetDBName;
    property OrgCDS : TClientDataSet read FOrgCDS write SetOrgCDS;
    property tempCDS : TClientDataSet read FtempCDS write SettempCDS;
    procedure ParseDB(aDBName : string);//解析數據
    procedure ClearAttriList();
    function getValues(attri : string;cds : TClientDataSet) : TStringList;

    function getEntropy(attri : string;cds : TClientDataSet) : double;//計算熵
    
    //Gain(S, A) = Entropy(S) -   ((|S v| / |S|)  *  Entropy(S v))
    function getGain(
                S,//information gain of example set S on attribute A 
                A : string;
                cds : TClientDataSet): double;//信息增益
    function getMaxGain(S : string; cds : TClientDataSet) : string;
    //創建決策樹
    procedure CreateDecisionTree(A, V: string; cds : TClientDataSet;ParNode : TTreeNode);
  public
    { Public declarations }
  end;

var
  MainF: TMainF;

implementation



{$R *.dfm}

function TMainF.LoadDB : boolean;
var
  OpenDlg : TOpenDialog;
begin
  result := False;
  OpenDlg := TOpenDialog.Create(self);
  try
    if OpenDlg.Execute then
    begin
      DBName := OpenDlg.FileName;
      result := True;
    end
    else
    begin

    end;
  finally
    OpenDlg.Free;
  end;

end;



procedure TMainF.btnLoadDBClick(Sender: TObject);
begin
  if LoadDB then
  begin
    tv.Items.BeginUpdate;
    ParseDB(DBName) ;
    tv.Items.EndUpdate;
  end;
  tempCDS.Active := true;
end;

procedure TMainF.ParseDB(aDBName : string);
var
  i, j : integer;
  tmpStr : string;
  AttributeName : string;//屬性名
  tmpStrList, attristrList : TStringList;
  aField : TStringField;
  pAttInfo : PAttriInfo;
begin
  tmpStrList := TstringList.Create;
  attristrList := TstringList.Create;
  try
    tmpStrList.LoadFromFile(aDBName);
    //取得屬性值
    AttributesList.CommaText := tmpStrList.Strings[0];
    cbbSA.Items.CommaText := AttributesList.CommaText;
    ClientDataSet.Active := False;
    ClientDataSet.FieldDefs.Clear;
    //創建內存表
    for i := 0 to AttributesList.Count -1 do
    begin
      aField := TStringField.Create(Self);
      
      with aField do
      begin
        FieldName := Trim(AttributesList.Strings[i]);
        Name := FieldName;
        Size := 10;
        Index := i//按創建的字段順序累加
      end;
      aField.DataSet := ClientDataSet;
    end;
    ClientDataSet.CreateDataSet;
    tempCDS.Active := False;
    tempCDS.FieldDefs.Clear;
    tempCDS.FieldDefs := ClientDataSet.FieldDefs;

    for i := 1 to tmpStrList.Count -1 do
    begin
      attristrList.CommaText := tmpStrList.Strings[i];
      ClientDataSet.Append;
      for j := 0 to attristrList.Count -1 do
        ClientDataSet.Fields.Fields[j].AsString  := attristrList.Strings[j];
      ClientDataSet.Post;
    end;
    ClientDataSet.Active := true;
    tempCDS.Data := ClientDataSet.Data;
    OrgCDS.Data := ClientDataSet.Data;

  finally
    tmpStrList.Free;
    attriStrList.Free;
  end;
end;



procedure TMainF.FormCreate(Sender: TObject);
begin
  AttributesList := TStringList.Create;
  SplitedAttriList := TStringList.Create;
  OrgCDS := TClientDataSet.Create(self);
  tempCDS := TClientDataSet.Create(self);

end;

procedure TMainF.FormDestroy(Sender: TObject);
begin
  SubTreeView.Free;
  AttributesList.Free;
  SplitedAttriList.Free;
  OrgCDS.Free;
  tempCDS.Free;
end;

function TMainF.GetNodeInfo(attrName: string; Count: integer; Entropy,
  Gain: double): string;
begin
  result := Format(NodeInfo,[attrName,Count,Entropy,Gain]);
end;



procedure TMainF.SetDBName(const Value: string);
begin
  FDBName := Value;
end;


procedure TMainF.Button2Click(Sender: TObject);
var
  i : integer;
begin
  tv.Items.Clear;
  SplitedAttriList.Clear;
  clientDataset.Filter := '';
  ClientDataSet.Filtered := False;
  clientdataset.DisableControls;
  for i := 0 to AttributesList.Count - 1 do
  begin
    if AttributesList.Strings[i] = cbbSA.Text then
      continue;
    CreateDecisionTree(AttributesList.Strings[i],'',clientDataSet,nil);
  end;
  clientdataset.Filtered := False;
  clientdataset.EnableControls;
end;

function TMainF.FindNodeByText(aText: string): TTreeNode;
var
  i : integer;
begin
  result := nil;
  for i := 0 to SubTreeView.Items.Count - 1 do
  begin
    if SubTreeView.Items.Item[i].Text <> aText then
      continue
    else
    begin
      result := SubTreeView.Items.Item[i];
      break;
    end;
  end;
end;


procedure TMainF.TVChange(Sender: TObject; Node: TTreeNode);
begin
  if Node.Data = nil then
    exit;
  ledtNodeInfo.Text := GetNodeInfo(
        PSubSetInfo(Node.Data).attriName,
        PSubSetInfo(Node.Data).count,
        PSubSetInfo(Node.Data).entropy,
        PSubSetInfo(Node.Data).gain
  );

end;



procedure TMainF.SetAttributesList(const Value: TStringList);
begin
  FAttributesList := Value;
end;




function TMainF.getEntropy(attri: string; cds: TClientDataSet) : double;
var
  i, j, atrIndex : integer;
  vList : TStringList;
  pv : PValInfo;
  tEntropy : double;
begin
  vList := TStringList.Create;
  tEntropy := 0.0;
  try
    //各值出現的次數
    cds.First;
    for i := 0 to cds.RecordCount - 1 do
    begin
      atrIndex := vList.IndexOf(cds.FieldByName(attri).AsString);
      if atrIndex <> -1 then
      begin
        PValInfo(vList.Objects[atrIndex]).count :=
          PValInfo(vList.Objects[atrIndex]).count + 1;

      end
      else
      begin
        pv := new(PValInfo);
        pv.count := 1;
        vList.AddObject(cds.FieldByName(attri).AsString,TObject(pv));
      end;
      cds.Next;
    end;

    //計算熵
    for i := 0 to vList.Count - 1 do
    begin
      tEntropy := tEntropy -((PValInfo(vList.Objects[i]).count/cds.RecordCount))*log2(PValInfo(vList.Objects[i]).count/cds.RecordCount)

    end;
    result := tEntropy;
  finally
    for i := 0 to vList.Count - 1 do
    begin
      if vList.Objects[i] <> nil then
        dispose(PValInfo(vList.Objects[i]));
    end;
    vList.Free;
  end;
end;


procedure TMainF.ClearAttriList;
begin

end;

function TMainF.isLeafNode(A1, V1: string;cds : TClientDataSet; var LeafCaption : string) : boolean;
var
  sFilter : string;
  i : integer;
  tStr : string;
begin
  result := true;
  sFilter := A1+'='+quotedstr(v1);//+' and '+A2+'='+quotedstr(v2);
  cds.Filtered := false;
  cds.Filter := sFilter;
  cds.Filtered := true;
  cds.First;
  tStr := cds.FieldByName(cbbsa.Text).AsString;
  LeafCaption := tStr;
  for i := 0 to cds.RecordCount -1 do
  begin
    if cds.FieldByName(cbbsa.Text).AsString <> tStr then
    begin
      result := False;
      break;
    end;
    cds.Next;
  end;
end;

procedure TmainF.CopyClientData(Src : TClientDataSet; Des : TClientDataSet);
var
  i, j : integer;
begin
  tempCDS.Filtered := False;
  for i := 0 to tempCDS.RecordCount -1  do
  begin
    tempCDS.First;
    tempCDS.Delete;

  end;
  for i := 0 to src.RecordCount -1 do
  begin
    tempCDS.Append;
    for j := 0 to src.FieldCount -1 do
      tempCDS.Fields.Fields[j].AsVariant := Src.Fields.Fields[j].AsVariant;
    tempCDS.Post;
    src.Next;
  end;

end;
procedure TMainF.CreateDecisionTree(A, V: string; cds: TClientDataSet;ParNode : TTreeNode);
var
  splitedAttribute : string;
  tNode : TTreeNode;
  i, j : integer;
  vList : TStringList;
  sLeafCaption,sFilter, tStr : string;
begin
  //根據最大信息增益得到分裂屬性
  splitedAttribute := getMaxGain(cbbsa.Text,cds);
  if splitedAttribute = '' then
    exit;
  //加入分裂屬性列表
  if SplitedAttriList.IndexOf(splitedAttribute) = -1 then
    SplitedAttriList.Add(splitedAttribute);
  if A = splitedAttribute then
    tStr := A
  else
    tStr := A+'----'+splitedAttribute;

  tNode := TV.Items.AddChild(ParNode,tStr);

  vList := TStringlist.Create;

  try
    vList := getValues(splitedAttribute,cds);
    for i := 0 to vList.Count - 1 do
    begin

      if isLeafNode(splitedAttribute, vList.Strings[i], cds, sLeafCaption) then
      begin
        //葉節點
        TV.Items.AddChild(tNode,vList.Strings[i]+'-----'+sLeafCaption);
      end
      else
      begin
        sFilter := splitedAttribute+'='+quotedstr(vList.Strings[i]);
        ClientDataSet.Filtered := False;
        ClientDataSet.Filter := sFilter;
        ClientDataSet.Filtered := True;
        CopyClientData(ClientDataSet,tempCDS);
        CreateDecisionTree(vList.Strings[i],'',tempCDS,tNode);
      end;
    end;


  finally
    vList.Free;
  end;


end;



  {*

  *}
function TMainF.getGain(S, A: string; cds : TClientDataSet): double;
var
  i, j, atrIndex, recCount : integer;
  vList,SList : TStringList;
  pv : PValInfo;
  strFilter : string;
  d1, d2 : double;
begin
  result := 0.0;
  d1 := 0.0;
  d2 := 0.0;
  vList := TStringList.Create;
  sList := TStringList.Create;
  try
    //A各值出現的次數
    cds.First;
    for i := 0 to cds.RecordCount - 1 do
    begin
      atrIndex := vList.IndexOf(cds.FieldByName(A).AsString);
      if atrIndex <> -1 then
      begin
        PValInfo(vList.Objects[atrIndex]).count :=
          PValInfo(vList.Objects[atrIndex]).count + 1;
      end
      else
      begin
        pv := new(PValInfo);
        pv.count := 1;
        vList.AddObject(cds.FieldByName(A).AsString,TObject(pv));
      end;
      cds.Next;
    end;
    //S各值出現的次數
    cds.First;
    for i := 0 to cds.RecordCount - 1 do
    begin
      atrIndex := sList.IndexOf(cds.FieldByName(S).AsString);
      if atrIndex <> -1 then
      begin
        PValInfo(sList.Objects[atrIndex]).count :=
          PValInfo(sList.Objects[atrIndex]).count + 1;
      end
      else
      begin
        pv := new(PValInfo);
        pv.count := 1;
        sList.AddObject(cds.FieldByName(S).AsString,TObject(pv));
      end;
      cds.Next;
    end;

    recCount := cds.RecordCount;

    for i := 0 to vList.Count - 1 do
    begin
        strFilter := A+' = '+ Quotedstr(vList.Strings[i]) ;
        cds.Filtered := false;
        cds.Filter := strFilter;
        cds.Filtered := true;
        d1 := d1 -   (PValInfo(vList.Objects[i]).count/recCount)*getEntropy(S,cds);
    end;
    cds.Filtered := false;
    result := getEntropy(S,cds) + d1;
  finally
    for i := 0 to vList.Count - 1 do
    begin
      if vList.Objects[i] <> nil then
        dispose(PValInfo(vList.Objects[i]));
    end;
    for i := 0 to sList.Count - 1 do
    begin
      if sList.Objects[i] <> nil then
        dispose(PValInfo(sList.Objects[i]));
    end;
    vList.Free;
    sList.Free;
  end;
  cds.Filtered := false;
end;
  {*

  *}
function TMainF.getMaxGain(S: string; cds : TClientDataSet): string;
var
  i, j : integer;
  tmpStr : string;
  tmpD,tmpGain : Double;
begin
  tmpD := 0.0;
  tmpGain := 0.0;
  for i := 0 to AttributesList.Count - 1 do
  begin
    if cbbsa.Text = AttributesList.Strings[i] then
      continue;
    if SplitedAttriList.IndexOf(AttributesList.Strings[i]) <> -1  then
      continue;
    tmpGain := getGain(S,AttributesList.Strings[i],cds);
    if tmpGain > tmpD then
    begin
      tmpStr := AttributesList.Strings[i];
      tmpD := tmpGain;
    end;
  end;
  result := tmpStr;
end;


function TMainF.getValues(attri : string;cds : TClientDataSet) : TStringList;
var
  i, atrIndex : integer;
begin
  cds.First;
  result := TStringList.Create;
  for i := 0 to cds.RecordCount - 1 do
  begin
    atrIndex := result.IndexOf(cds.FieldByName(attri).AsString);
    if atrIndex = -1 then
    begin
      result.Add(cds.FieldByName(attri).AsString);
    end;
    cds.Next;
  end;
end;

procedure TMainF.SetOrgCDS(const Value: TClientDataSet);
begin
  FOrgCDS := Value;
end;

procedure TMainF.SettempCDS(const Value: TClientDataSet);
begin
  FtempCDS := Value;
end;

procedure TMainF.SetSplitedAttriList(const Value: TStringList);
begin
  FSplitedAttriList := Value;
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
制服丝袜日韩国产| 日韩不卡一二三区| 日韩成人精品在线| 成人av片在线观看| 日韩欧美国产一区在线观看| 亚洲精品国产视频| 国产精品亚洲成人| 精品成人佐山爱一区二区| 亚洲一区免费视频| av电影在线观看一区| 精品久久人人做人人爰| 日韩黄色一级片| 91麻豆高清视频| 国产精品妹子av| 国产一区二区三区免费看| 日韩一区二区免费视频| 一区二区三区在线视频观看58| 国产精品99久久久久久宅男| 日韩一区二区三区免费看| 夜夜嗨av一区二区三区网页 | 亚洲一区中文日韩| 成人av免费网站| 国产喷白浆一区二区三区| 麻豆freexxxx性91精品| 欧美一区二区三区成人| 婷婷综合久久一区二区三区| 在线精品视频一区二区三四| 亚洲精品成人悠悠色影视| 成人黄色国产精品网站大全在线免费观看 | 精品夜夜嗨av一区二区三区| 欧美精品日日鲁夜夜添| 肉肉av福利一精品导航| 制服丝袜在线91| 久久超级碰视频| 久久久综合网站| 岛国一区二区在线观看| 国产精品欧美一级免费| 成人美女视频在线观看| 中文字幕在线观看一区二区| 91麻豆免费观看| 亚洲高清免费视频| 欧美一级爆毛片| 国产福利精品一区二区| 中文字幕巨乱亚洲| 色综合天天做天天爱| 一区二区欧美国产| 制服丝袜中文字幕亚洲| 国产乱码字幕精品高清av| 日本一区二区视频在线观看| 色综合久久中文字幕| 水蜜桃久久夜色精品一区的特点| 91精品国产综合久久福利| 看电视剧不卡顿的网站| 国产欧美一区二区三区沐欲| 成人毛片老司机大片| 亚洲综合av网| 精品免费日韩av| 99精品一区二区三区| 五月激情综合婷婷| 国产亚洲成av人在线观看导航 | 欧美日韩中文字幕一区| 麻豆91精品视频| 国产欧美一区二区精品性色| 91黄视频在线| 激情综合网最新| 亚洲精品欧美激情| 欧美r级在线观看| 色成年激情久久综合| 另类小说图片综合网| 国产精品久久久久久久久久久免费看 | 日韩免费在线观看| 色呦呦国产精品| 久久99精品国产.久久久久久| 综合精品久久久| 亚洲精品一区二区三区影院 | 国产白丝网站精品污在线入口| 一区二区在线观看av| 久久综合色一综合色88| 色素色在线综合| 国产电影精品久久禁18| 日日夜夜免费精品| 亚洲色图丝袜美腿| 久久久美女毛片| 日韩一区二区视频在线观看| 在线观看免费一区| 国产69精品久久99不卡| 日韩国产一二三区| 亚洲天堂免费看| 国产亚洲精品福利| 欧美电视剧免费观看| 欧美私人免费视频| 不卡视频免费播放| 国产一区二区三区在线观看精品 | 风间由美一区二区av101 | 久久99热99| 天天色图综合网| 亚洲猫色日本管| **网站欧美大片在线观看| 国产亚洲精品免费| 久久综合中文字幕| 欧美sm极限捆绑bd| 91精品啪在线观看国产60岁| 欧美日韩一区三区四区| 成人app在线观看| 成人黄色片在线观看| 国产成人av一区二区三区在线观看| 视频在线观看91| 日韩av电影天堂| 图片区日韩欧美亚洲| 亚洲一卡二卡三卡四卡五卡| 亚洲乱码国产乱码精品精98午夜 | 欧美videos大乳护士334| 欧美精品 日韩| 91精品久久久久久久91蜜桃| 欧美亚洲日本一区| 欧美视频在线一区二区三区 | 亚洲视频电影在线| 国产精品福利电影一区二区三区四区| 久久色.com| 国产调教视频一区| 中文字幕日韩精品一区| 亚洲天堂免费在线观看视频| 一区二区三区四区激情 | 18成人在线视频| 亚洲欧美日韩在线播放| 亚洲一区国产视频| 蜜臀va亚洲va欧美va天堂| 久久不见久久见免费视频1| 国产一区二区精品久久| 成人中文字幕在线| 91视频.com| 91麻豆精品国产无毒不卡在线观看 | 色视频成人在线观看免| 欧美精品丝袜久久久中文字幕| 91精品综合久久久久久| 国产网红主播福利一区二区| 中文字幕一区二区三区在线观看 | 国产乱子轮精品视频| 国产999精品久久久久久| 色综合天天综合网天天狠天天 | 国产精品无遮挡| 一区二区三区欧美视频| 青青草精品视频| 国产91精品一区二区麻豆网站| av色综合久久天堂av综合| 欧美日韩国产首页在线观看| 久久夜色精品一区| 亚洲免费观看视频| 久久99精品久久久久久国产越南| 成人一区二区三区视频在线观看 | 日韩欧美一级二级三级久久久 | 久久久久9999亚洲精品| 亚洲另类在线一区| 久久精品国产**网站演员| 成人免费高清在线| 欧美一区二区视频免费观看| 国产精品短视频| 免费观看在线色综合| av一本久道久久综合久久鬼色| 欧美日韩大陆一区二区| 中文av一区二区| 免费观看久久久4p| 91久久奴性调教| 国产日韩欧美a| 日韩av中文在线观看| 91蜜桃免费观看视频| 久久综合狠狠综合久久激情| 亚洲图片有声小说| 99re6这里只有精品视频在线观看| 欧美一区二区黄| 亚洲线精品一区二区三区八戒| 风间由美性色一区二区三区| 欧美一级一级性生活免费录像| 亚洲精品v日韩精品| 国产不卡视频在线观看| 精品久久人人做人人爱| 日本成人在线网站| 欧美三级乱人伦电影| 亚洲精品少妇30p| 91亚洲大成网污www| 国产丝袜美腿一区二区三区| 蜜桃久久久久久| 91麻豆精品国产91久久久更新时间| 一区二区三区在线视频免费| 不卡高清视频专区| 中文字幕精品三区| 国产精品一区二区三区网站| 精品久久久久久久人人人人传媒| 视频精品一区二区| 67194成人在线观看| 偷拍自拍另类欧美| 8x8x8国产精品| 视频一区二区欧美| 欧美一区二区三区精品| 日韩高清一级片| 日韩手机在线导航| 久久99精品国产.久久久久久| 日韩美女在线视频| 精品亚洲成a人| 久久综合色8888|