Скачиваний:
28
Добавлен:
01.05.2014
Размер:
3.07 Кб
Скачать
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