⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c45.pas

📁 以从医院病案室获得的3022例数据为样本
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit c45;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, DB, ADODB,Math;

type
    Tbing = array[0..5] of string;        //定义单个病种的数组类
  TN4=array[0..3,0..1]of string;    //以下定义二进制计数的数组类
  TN8=array[0..7,0..2]of string;
  TN16=array[0..15,0..3]of string;
  TForm1 = class(TForm)
    ListView1: TListView;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ADOTable1: TADOTable;
    ADOTable1gxy: TBooleanField;
    ADOTable1xlsc: TBooleanField;
    ADOTable1dmyh2: TBooleanField;
    ADOTable1gxb: TBooleanField;
    ADOTable1gxz: TBooleanField;
    ADOTable1nxg: TBooleanField;
    ADOTable1wy: TBooleanField;
    ADOTable1wky: TBooleanField;
    ADOTable1chy: TBooleanField;
    ADOTable1jxgy: TBooleanField;
    ADOTable1yxgy: TBooleanField;
    ADOTable1gyh: TBooleanField;
    ADOTable1szjb: TBooleanField;
    ADOTable1mxzqg: TBooleanField;
    ADOTable1fxb: TBooleanField;
    ADOTable1fjh: TBooleanField;
    ADOTable1jzb: TBooleanField;
    ADOTable1ggj: TBooleanField;
    ADOTable1jzy: TBooleanField;
    ADOTable1dsz: TBooleanField;
    ADOTable1dny: TBooleanField;
    ADOTable1qlx: TBooleanField;
    ADOTable1fgg: TBooleanField;
    ADOTable1zhi: TBooleanField;
    ADOTable1pfb: TBooleanField;
    ADOTable1yany: TBooleanField;
    ADOTable1quchi: TBooleanField;
    ADOTable1bnz: TBooleanField;
    ADOTable1qgy: TBooleanField;
    ADOTable1swm: TBooleanField;
    ADOTable1erl: TBooleanField;
    ADOTable1bdy: TBooleanField;
    ADOTable1feiy: TBooleanField;
    ADOTable1jzcy: TBooleanField;
    ADOTable1weiy: TBooleanField;
    ADOTable1shiy: TBooleanField;
    ADOTable1gany: TBooleanField;
    ADOTable1ruxy: TBooleanField;
    ADOTable1gjy: TBooleanField;
    ADOTable1biyy: TBooleanField;
    ADOTable1bgy: TBooleanField;
    ADOTable1tnb: TBooleanField;
    ADOQuery1: TADOQuery;
    ADOQuery1gxy: TBooleanField;
    ADOQuery1xlsc: TBooleanField;
    ADOQuery1dmyh2: TBooleanField;
    ADOQuery1gxb: TBooleanField;
    ADOQuery1gxz: TBooleanField;
    ADOQuery1nxg: TBooleanField;
    ADOQuery1wy: TBooleanField;
    ADOQuery1wky: TBooleanField;
    ADOQuery1chy: TBooleanField;
    ADOQuery1jxgy: TBooleanField;
    ADOQuery1yxgy: TBooleanField;
    ADOQuery1gyh: TBooleanField;
    ADOQuery1szjb: TBooleanField;
    ADOQuery1mxzqg: TBooleanField;
    ADOQuery1fxb: TBooleanField;
    ADOQuery1fjh: TBooleanField;
    ADOQuery1jzb: TBooleanField;
    ADOQuery1ggj: TBooleanField;
    ADOQuery1jzy: TBooleanField;
    ADOQuery1dsz: TBooleanField;
    ADOQuery1dny: TBooleanField;
    ADOQuery1qlx: TBooleanField;
    ADOQuery1fgg: TBooleanField;
    ADOQuery1zhi: TBooleanField;
    ADOQuery1pfb: TBooleanField;
    ADOQuery1yany: TBooleanField;
    ADOQuery1quchi: TBooleanField;
    ADOQuery1bnz: TBooleanField;
    ADOQuery1qgy: TBooleanField;
    ADOQuery1swm: TBooleanField;
    ADOQuery1erl: TBooleanField;
    ADOQuery1bdy: TBooleanField;
    ADOQuery1feiy: TBooleanField;
    ADOQuery1jzcy: TBooleanField;
    ADOQuery1weiy: TBooleanField;
    ADOQuery1shiy: TBooleanField;
    ADOQuery1gany: TBooleanField;
    ADOQuery1ruxy: TBooleanField;
    ADOQuery1gjy: TBooleanField;
    ADOQuery1biyy: TBooleanField;
    ADOQuery1bgy: TBooleanField;
    ADOQuery1tnb: TBooleanField;
    DataSource1: TDataSource;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
lie1array:Tbing=('gxy','gxb','gxz','qlx','bnz','swm');       // 赋值数组
N4:TN4=(('1','1'),('1','0'),('0','1'),('0','0'));
N8:TN8=(('1','1','1'),('1','1','0'),('1','0','1'),('1','0','0'),('0','1','1'),('0','1','0'),('0','0','1'),('0','0','0'));
N16:TN16=(('1','1','1','1'),('1','1','1','0'),('1','1','0','1'),('1','1','0','0'),
           ('1','0','1','1'),('1','0','1','0'),('1','0','0','1'),('1','0','0','0'),
           ('0','1','1','1'),('0','1','1','0'),('0','1','0','1'),('0','1','0','0'),
           ('0','0','1','1'),('0','0','1','0'),('0','0','0','1'),('0','0','0','0'));   
var
node:array of string;                                  //节点的字符串数组
n,m_2,m_4,m_8,m_16:integer;                                             //二进制数组计数器
Ent_node,Ent_positive,Ent_negative,newEnt:real;                //熵值
gain:real;                                                     //熵值的增益率
i1,i2,j1,j2,k1,k2:integer;                                   //计数器   1:正例,2:反例
E:array of Extended;                                         //gain的数组
v,vh:integer;                                                  //数组指针
max:real;                                                   //gain的最大值
H:array[0..62,0..5] of string;                   //候选数组(2维)
judge:Boolean;                                       //判断的布尔数
//judge:array of Boolean;                                       //判断的布尔数的字数组
item: TListItem;                                              // 动态item

procedure selectint(re:real;var i:integer);                   //取整的过程,得到整型值
var
v:integer       ;
begin
for  v:=0 to 40 do
if   (re>=v) and (re<(v+1))
then
i:=v
end;

procedure oneEnt(x1,x2,y1,y2,z1,z2:integer;liename:string;var i1,i2,j1,j2,k1,k2:integer); //扫描一列的子过程
  begin
   with adoquery1 do
      if (fieldbyname('tnb').AsVariant='1')
         then
           i1:=x1+1
         else
            i1:=x1;
            with adoquery1 do
      if (fieldbyname('tnb').AsVariant='0')
         then
           i2:=x2+1
         else
            i2:=x2;                      
   with adoquery1 do
      if (fieldbyname(liename).AsVariant='1')and(fieldbyname('tnb').AsVariant='1')
         then
           j1:=y1+1
         else
            j1:=y1;
   with adoquery1 do
    if  (fieldbyname(liename).AsVariant='1')and(fieldbyname('tnb').AsVariant='0')
         then
         j2:=y2+1
        else
         j2:=y2;
   with adoquery1 do
      if (fieldbyname(liename).AsVariant='0')and(fieldbyname('tnb').AsVariant='1')
         then
           k1:=z1+1
         else
            k1:=z1;
   with adoquery1 do
    if  (fieldbyname(liename).AsVariant='0')and(fieldbyname('tnb').AsVariant='0')
         then
         k2:=z2+1
        else
         k2:=z2;
end;

procedure twoEnt(x1,x2,y1,y2,z1,z2:integer;liename:string;judge_N:Boolean;var i1,i2,j1,j2,k1,k2:integer);
                                                                                 //扫描两列的子过程
  begin
   with adoquery1 do
      if judge_N and (fieldbyname('tnb').AsVariant='1')
         then
           i1:=x1+1
         else
            i1:=x1;
            with adoquery1 do
      if judge_N and (fieldbyname('tnb').AsVariant='0')
         then
           i2:=x2+1
         else
            i2:=x2;                      
   with adoquery1 do
      if judge_N and (fieldbyname(liename).AsVariant='1')and(fieldbyname('tnb').AsVariant='1')
         then
           j1:=y1+1
         else
            j1:=y1;
   with adoquery1 do
    if  judge_N and (fieldbyname(liename).AsVariant='1')and(fieldbyname('tnb').AsVariant='0')
         then
         j2:=y2+1
        else
         j2:=y2;
   with adoquery1 do
      if judge_N and (fieldbyname(liename).AsVariant='0')and(fieldbyname('tnb').AsVariant='1')
         then
           k1:=z1+1
         else
            k1:=z1;
   with adoquery1 do
    if  judge_N and (fieldbyname(liename).AsVariant='0')and(fieldbyname('tnb').AsVariant='0')
         then
         k2:=z2+1
        else
         k2:=z2;
end;



procedure EntMath(i1,i2,j1,j2,k1,k2:integer;var Ent_node,Ent_positive,Ent_negative,newEnt,gain:real);
var                                                  //计算熵值的过程
fenshu_i1:real;                                      //各分数
fenshu_i2:real;
fenshu_j1:real;
fenshu_j2:real;
fenshu_k1:real;
fenshu_k2:real;
gain_shu:real;
split1,split2,split:real;
begin
if  i1=0
  then
  fenshu_i1:=1
  else
  fenshu_i1:=(i1+i2)/i1;
if  i2=0
  then
  fenshu_i2:=1
  else
  fenshu_i2:=(i1+i2)/i2;
if  j1=0
  then
  fenshu_j1:=1
  else
  fenshu_j1:=(j1+j2)/j1;
if  j2=0
  then
  fenshu_j2:=1
  else
  fenshu_j2:=(j1+j2)/j2;
if  k1=0
  then
  fenshu_k1:=1
  else
  fenshu_k1:=(k1+k2)/k1;
if  k2=0
  then
  fenshu_k2:=1
   else
   fenshu_k2:=(k1+k2)/k2;
{if ((i1=0)and(i2=0))or((j1=0)and(j2=0))or((k1=0)and(k2=0))
   then
   gain:=0
   else
   begin
   Ent_node:=(i1/(i1+i2))* (Ln(fenshu_i1)/Ln(2))+(i2/(i1+i2))* (Ln(fenshu_i2)/Ln(2));
   Ent_positive:=(j1/(j1+j2))* (Ln(fenshu_j1)/Ln(2))+(j2/(j1+j2))* (Ln(fenshu_j2)/Ln(2));
   Ent_negative:=(k1/(k1+k2))* (Ln(fenshu_k1)/Ln(2))+(k2/(k1+k2))* (Ln(fenshu_k2)/Ln(2));
   newEnt:=((j1+j2)/(j1+j2+k1+k2))*Ent_positive+((k1+k2)/(j1+j2+k1+k2))*Ent_negative;
   gain:=Ent_node-newEnt;
   end   }
   if    (i1=0)and(i2=0)
   then
   Ent_node:=0
   else
   Ent_node:=(i1/(i1+i2))* (Ln(fenshu_i1)/Ln(2))+(i2/(i1+i2))* (Ln(fenshu_i2)/Ln(2));
   if   (j1=0)and(j2=0)
   then
   begin
   Ent_positive:=0;
   split1:=0;
   end
   else
   begin
   Ent_positive:=(j1/(j1+j2))* (Ln(fenshu_j1)/Ln(2))+(j2/(j1+j2))* (Ln(fenshu_j2)/Ln(2));
   split1:=-((j1+j2)/(j1+j2+k1+k2))* (Ln((j1+j2)/(j1+j2+k1+k2))/Ln(2));
   end;
   if    (k1=0)and(k2=0)
   then
   begin
   Ent_negative:=0  ;
   split2:=0;
   end
   else
   begin
   Ent_negative:=(k1/(k1+k2))* (Ln(fenshu_k1)/Ln(2))+(k2/(k1+k2))* (Ln(fenshu_k2)/Ln(2));
   split2:=-((k1+k2)/(j1+j2+k1+k2))* (Ln((k1+k2)/(j1+j2+k1+k2))/Ln(2));
   end;
   if  (j1=0)and(j2=0)and(k1=0)and(k2=0)
   then
   newEnt:=0
   else
   newEnt:=((j1+j2)/(j1+j2+k1+k2))*Ent_positive+((k1+k2)/(j1+j2+k1+k2))*Ent_negative;
   gain_shu:=Ent_node-newEnt;
   split:=split1+split2;
   if split<>0
   then
   gain:=gain_shu/split
   else
   gain:=0;
end;


procedure setvalue(var i1,i2,j1,j2,k1,k2:integer);
begin                                                       //置零,初始化各值
i1:=0;
i2:=0;
j1:=0;
j2:=0;
k1:=0;
k2:=0;
end;



begin                                                     //main begin
setlength(node,63);                                        //初始化用于产生候选的数组
Setlength(E,6);
//Setlength(judge,63) ;
try
   with adoquery1 do
   begin
     sql.clear;
     sql.add('select * from tjE_g ');
     open;
     listview1.Items.BeginUpdate;                 //开始更新
     try

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -