예제 #1
0
        static void Main(string[] args)
        {
            Atributo risco = new Atributo("risco", new ArrayList {
                "alto", "moderado", "baixo"
            });
            Atributo historico_credito = new Atributo("historico_credito", new ArrayList {
                "ruim", "desconhecida", "boa"
            });
            Atributo divida = new Atributo("divida", new ArrayList {
                "alta", "baixa"
            });
            Atributo garantia = new Atributo("garantia", new ArrayList {
                "nenhuma", "adequada"
            });
            Atributo renda = new Atributo("renda", new ArrayList {
                "$0 a $15 mil", "$15 a $35 mil", "acima de $35 mil"
            });


            Atributo[] atributos = new Atributo[] { historico_credito, divida, garantia, renda };

            DataTable amostras = GetDataTable();

            ArvoreDecisao id3  = new ArvoreDecisao();
            No            raiz = id3.montarArvore(amostras, "risco", atributos);

            print(raiz, "");
            Console.ReadKey();
        }
예제 #2
0
        private No montarArvoreInterna(DataTable amostras, string rotulo, Atributo[] atributos)
        {
            if (verificaSeTodosPertecemAMesmaClasse(amostras, rotulo).Count == 1)
            {
                return(new No(new Atributo(amostras.Rows[0])));
            }

            if (atributos.Length == 0)
            {
                return(new No(new Atributo(getValorMaisComum(amostras, rotulo))));
            }

            this.Total          = amostras.Rows.Count;
            this.RotuloAtributo = rotulo;
            this.TotalAltos     = totalRisco(amostras, "alto");
            this.TotalBaixos    = totalRisco(amostras, "baixo");
            this.TotalModerados = totalRisco(amostras, "moderado");

            this.Entropia = calcularEntropia(this.TotalAltos, this.TotalBaixos, this.TotalModerados);
            Atributo melhorAtributo = getMelhorAtributo(amostras, atributos);

            No raiz = new No(melhorAtributo);

            DataTable amostra = amostras.Clone();

            foreach (var item in melhorAtributo.Valores)
            {
                #region Seleciona todas os elementos com o valor deste atributo
                amostra.Rows.Clear();
                DataRow[] rows = amostras.Select(melhorAtributo.Nome + " = " + "'" + item.ToString() + "'");

                foreach (DataRow row in rows)
                {
                    amostra.Rows.Add(row.ItemArray);
                }
                #endregion

                #region Cria uma nova lista de atributos menos o atributo corrente que é o melhor atributo
                ArrayList atrbts = new ArrayList(atributos.Length - 1);
                for (int i = 0; i < atributos.Length; i++)
                {
                    if (atributos[i].Nome != melhorAtributo.Nome)
                    {
                        atrbts.Add(atributos[i]);
                    }
                }
                #endregion

                if (amostra.Rows.Count == 0)
                {
                    return(new No(new Atributo(getValorMaisComum(amostra, rotulo))));
                }
                else
                {
                    ArvoreDecisao id3     = new ArvoreDecisao();
                    No            noFilho = id3.montarArvore(amostra, rotulo, (Atributo[])atrbts.ToArray(typeof(Atributo)));
                    raiz.AdicionarNo(noFilho, item.ToString());
                }
            }

            return(raiz);
        }