Скачиваний:
30
Добавлен:
01.05.2014
Размер:
3 Кб
Скачать
unit NominalToBinary;

interface

  uses
    SysUtils,
    Classes,
    SerializableObject,
    FastVector,

    Filter,
    Instances,
    DmmTypes,
    Attribute;

  type

    TDMNominalToBinary = class(TDMFilter)

    public

   function convertInstance(instance : TDMInstance) : TDMInstance;override;
   function useFilter(instances : TDMInstances) : TDMInstances;override;

  end;

implementation


   //Преобразует множество
function TDMNominalToBinary.useFilter(instances : TDMInstances) : TDMInstances;
var
i,j:integer;
newInstance:TDMInstance;
newInstances:TDMInstances;
attrs:TDMFastVector;
begin

 attrs := TDMFastVector.Create;

 for j := 0 to instances.numAttributes()-1 do
  begin
  if (instances.attribute(j).isNominal())and (instances.attribute(j).numValues() > 2) then
     begin

      for i:=0 to instances.attribute(j).numValues()-1 do
      attrs.addElement( TDMAttribute.Create( instances.attribute(j).name + IntToStr(i)));

     end
   else
     begin
      attrs.addElement( TDMAttribute.Create( instances.attribute(j).name));
     end;
  end;


 newInstances:=TDMInstances.Create('dataset_1', attrs, instances.numInstances);

  for i := 0 to instances.NumInstances-1 do
 begin

  newInstance:=ConvertInstance(instances.instance(i));
  newInstances.add(newInstance);
 end;
 Result:=newInstances;
end;




   //Преобразует вектор, если атрибут номинальный .


function TDMNominalToBinary.ConvertInstance(instance:TDMInstance):TDMInstance;
var
vals:TDMInstanceValues;
attSoFar,j,NewNumAttr:integer;
inst:TDMInstance;
att:TDMAttribute;
k:integer;

begin
  attSoFar := 0;
  NewNumAttr:=0;
  for j := 0 to instance.numAttributes()-1 do
  begin
  if (instance.attribute(j).isNominal())and (instance.attribute(j).numValues() > 2) then
  NewNumAttr := NewNumAttr + instance.attribute(j).numValues()
  else
  NewNumAttr := NewNumAttr+1;
  end;
  SetLength(vals,NewNumAttr);
  for j := 0 to instance.numAttributes()-1 do
  begin
      att:=TDMAttribute.Create();
      att := instance.attribute(j);
      if (not att.isNominal()) then
      begin
      	vals[attSoFar] := instance.value(j);
	      inc(attSoFar);
      end
      else
      begin
	      if (att.numValues() <= 2) then
        begin
        vals[attSoFar] := instance.value(j);
        inc(attSoFar);
        end
	      else
        begin
	       if (instance.isMissing(j)) then

         for k := 0 to att.numValues()-1 do
            vals[attSoFar + k] := instance.value(j)

         else
         begin
	          for k := 0 to att.numValues()-1 do
            begin
	           if (k = trunc(instance.value(j))) then
                vals[attSoFar + k] := 1
	           else
                vals[attSoFar + k] := 0;
      	     end;
         end;
      	  attSoFar := attSoFar + att.numValues();
        end;

      end;
  end;
    inst := nil;

      inst := TDMInstance.Create(instance.weight(), vals,NewNumAttr);

     Result:=inst;

 end;


end.
Соседние файлы в папке FilterModule