В этой статье описывается алгоритм дерева решений, реализованный Java. Поделитесь этим для вашей ссылки, следующим образом:
Алгоритм дерева решений - это метод для приближения значения дискретной функции. Это типичный метод классификации, сначала обрабатывая данные, используя алгоритм индукции для генерации читаемых правил и деревьев решений, а затем с использованием решений для анализа новых данных. По сути, деревья решений - это процесс классификации данных через серию правил.
Конструкция дерева решений может быть выполнена в двух шагах. Первым шагом является генерация дерева решений: процесс генерации дерева решений из набора образцов обучения. Вообще говоря, набор данных обучения является набором данных, который имеет историю и определенную степень комплексности в соответствии с фактическими потребностями и используется для анализа и обработки данных. Вторым шагом является обрезка дерева решений: В основном он использует данные из нового набора данных образца (называемый набором тестовых данных) для проверки предварительных правил, генерируемых в процессе генерации дерева решений, и обрезка тех ветвей, которые влияют на точность предварительного баланса.
Код реализации Java выглядит следующим образом:
Пакет демонстрация; импорт java.util.hashmap; import java.util.linkedlist; import java.util.list; import java.util.map; import java.util.map.entry; импорт java.util.set; public class dicisiontre результат:"); String [] attrnames = new String [] {"age", "доход", "студент", "credit_rating"}; // Читать образцы настройки карты <объект, список <sample >> samples = readsamples (attrname); // генерировать объект дерева решений Deciestree = GeneratedEcisionTree (образцы, аттралы); // Вывод дерева решений } /** * Read the sample set that has been classified and return the Map: Classification-> List of samples belonging to the category*/ static Map<Object, List<Sample>> readSamples(String[] attrNames) { // Sample attributes and their classification (the last element in the array is the classification to which the sample belongs) Object[][] rawData = new Object[][] { { "<30", «Высокий», «нет», «честный», «0»}, {"<30", "High", "no", ",", "0"}, {"30-40", "High", "no", "Fair", "1"}, {"> 40", "Medium", "нет", Fair "," 1 "}", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", "", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", "1", ",", ",", "," 1 ",", ",", ". }, {"> 40", "low", "yes", "," превосходно "," 0 "}, {" 30-40 "," low "," Да "," Отлично "," 1 "}, {" <30 "," Средний "," Нет "," Ярмарка "," 0 "}, {" <30 ",", "Да", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ". «Да», «Fair», «1»}, {"<30", "Medium", "Да", "Отлично", "1"}, {"30-40", "Средний", "Нет", "Отличный", "1"}, {"30-40", "Высокий", «Да», «Справедливость», «1»}, «», «нет», «нет», «нет», «нет», «нет», «нет», «нет», «нет», «нет», «нет», «нет». }; // Читать образцы атрибутов и их классификации, построить образец объекта, представляющего выборку, и разделите выборку, установленную на карту классификации <объект, список <Пример >> ret = new Hashmap <объект, список <Пример >> (); для (Object [] row: rawdata) {sample sample = new Sample (); int i = 0; for (int n = row.length - 1; i <n; i ++) sample.setattribute (attrnames [i], row [i]); Sample.SetCategory (row [i]); Список <Пример> образцы = ret.get (row [i]); if (samples == null) {samples = new LinkedList <samer> (); ret.put (row [i], образцы); } samples.add (образец); } return ret; } / *** Создание дерева решений* / статический объект GeneratedEcisionTree (map <объект, список <sample >> категорийтосамплы, string [] attrname) {// Если есть только одна выборка, используйте классификацию, к которой образец принадлежит как классификация новой выборки if (categorytosamples.size () == 1) returntosamples. // Если нет атрибута для принятия решений, классификация с наибольшим количеством образцов в наборе выборки используется в качестве классификации новой выборки, то есть голосуйте за классификацию if (attrnames.length == 0) {int max = 0; Объект maxcategory = null; Для (intpirt <объект, список <Пример >> intpirt: CategoryTosamples .EntrySet ()) {int cur = intry.getValue (). size (); if (cur> max) {max = cur; maxcategory = entry.getkey (); }} return maxcategory; } // Выберите объект тестового атрибута [] rst = selectBestTestTtribute (CategoryTosamples, attrname); // Корневой узел дерева решений, атрибут ветви - выбранное дерево дерева атрибутов испытаний = новое дерево (аттралы [(целое число) rst [0]]); // Используемые тестовые атрибуты не должны быть выбираются в качестве тестовых атрибутов снова строка [] suba = new String [attrnames.length - 1]; for (int i = 0, j = 0; i <attrnames.length; i ++) if (i! = (integer) rst [0]) suba [j ++] = attrname [i]; // генерировать ветвь на основе атрибутов ветви @suppresswarnings ("uncecked") map <объект, карта <объект, список <sample >>> splits =/ * new Line */(map <объект, карта <объект, список <sample >>>) rst [2]; для (intpirt <объект, карта <объект, список <Пример >>> intpirt: splits.entryset ()) {Object attrvalue = intry.getKey (); Карта <объект, список <пример >> split = entry.getValue (); Object Child = GeneratedEcisionTree (Split, Suba); Tree.setchild (attrvalue, ребенок); } return Tree; } /*** Выберите оптимальный атрибут теста. Оптимальное означает, что если выбранная ветвь атрибута теста основана на выбранной ветви атрибута теста, сумма информации, необходимой для классификации новой выборки*, определяется из каждой ветви, которая эквивалентна максимальному усилению информации, полученной путем определения атрибута тестирования новой выборки* Возвращение к массиву: выбранная атрибута, сумма информации, MAP (Attribute Value-> (Category-> SAMER-SAMPER)*/ ЗАМЕРКА*/ ЗВИНГОВОЙ ЗАПИСКА*/ ЗВИДОВОЙ ATAMESTATIC*/ SITATIC*/ ЗВИДОВОЙ ATTATIC*/ ЗАМЕТА. SelectBestTattTtribute (map <Object, list <Sample >> CategoryTosamples, String [] attrnames) {int minindex = -1; // Оптимальный атрибут suppript double minValue = double.max_value; // Минимальная информационная карта <объект, карта <объект, список <пример >>> minsplits = null; // Оптимальная схема ветвления // Для каждого атрибута вычислите сумму информации, необходимой для определения классификации новой выборки в каждой ветви, когда она используется в качестве атрибута тестирования, и выберите минимальный оптимальный для (int attrindex = 0; attrindex <attrnames.length; attrindex ++) {int allcount = 0; // Счетчик для подсчета общего количества образцов // Создание карты в соответствии с текущим атрибутом: Значение атрибута-> (классификация-> Список примеров) MAP <объект, карта <объект, список <Пример >>> cursplits =/ * Новая строка */new Hashmap <объект, карта <объект, список <sample >>> (); Для (intpirt <объект, список <Пример >> intpirt: CategoryTosamples .EntrySet ()) {объект категория = intry.getKey (); Список <amper> samples = intry.getValue (); Для (образец образца: образцы) {объект attrvalue = sample .getattribute (attrname [attrindex]); Map <объект, список <пример >> split = cursplits.get (attrvalue); if (split == null) {split = new hashmap <объект, список <sample >> (); cursplits.put (attrvalue, split); } List <amper> splitsamples = split.get (категория); if (splitsamples == null) {splitsamples = new LinkedList <samer> (); split.put (категория, Splitsamples); } splitsamples.add (образец); } allcount += samples.size (); } // Рассчитайте сумму информации, необходимой для определения классификации новой выборки в каждой ветви при использовании текущего атрибута в качестве тестового атрибута двойной кривой = 0,0; // Счетчик: накапливать каждую ветвь для (map <объект, список <пример >> splits: cursplits.values ()) {double persplitcount = 0; для (list <amper> list: splits.values ()) persplitcount += list.size (); // Прибытели кумулятивного тока двойной перемешивания = 0,0; // Счетчик: текущий ветвь для (list <Пример> список: splits.values ()) {double p = list.size () / persplitcount; persplitvalue -= p * (math.log (p) / math.log (2)); } curvalue += (persplitcount / allcount) * persplitvalue; } // Выберите минимум к оптимальному if (minvalue> curvalue) {minindex = attrindex; minvalue = curvalue; minsplits = cursplits; }} вернуть новый объект [] {minindex, minvalue, minsplits}; } / *** Вывод дерево решений на стандартный выход* / static void outputDecisionTree (Object obj, int Level, Object от) {for (int i = 0; i <level; i ++) System.out.print ("| ------"); if (from! = null) System.out.printf ("(%s):", от); if (obj ancessionof kee) {дерево дерево = (дерево) obj; String attrname = tree.getAttribute (); System.out.printf ("[%s =?]/N", attrname); for (Object attrvalue: tree.getAttributevalues ()) {Object child = tree.getChild (attrvalue); outputDecisionTree (ребенок, уровень + 1, attrname + "=" + attrvalue); }} else {System.out.printf ("[Category = %s]/n", obj); }} / *** Образец, содержащий несколько атрибутов и классификационное значение, которое указывает классификацию, к которой пример пример* / статический образец класса {private <String, object> attributes = new Hashmap <String, Object> (); категория частных объектов; public Object getAttribute (string name) {return attributes.get (name); } public void setAttribute (string name, значение объекта) {attributes.put (name, value); } public Object getCategory () {return Category; } public void setCategory (объект категория) {this.category = Category; } public String toString () {return attributes.toString (); }} /*** Дерево решений (узел без листа), каждый неличный узел в дереве принятия решений приводит дерево решений* Каждый неличный узел содержит атрибут ветви и несколько ветвей. Каждое значение атрибута ветви соответствует ветви. Ветвь направляет дерево подразделения*/ статическое дерево класса {частная строка атрибут; Частная карта <объект, объект> childres = new Hashmap <Object, Object> (); Public Tree (String Attribute) {this.attribute = attribute; } public String getAttribute () {return attribute; } public Object getChild (Object attrvalue) {return wards.get (attrvalue); } public void setChild (объект attrvalue, object child) {kids.put (attrvalue, ребенок); } public set <Object> getAttributeValues () {return wards.keyset (); }}}Результаты работы:
Для получения дополнительной информации об алгоритмах Java, читатели, которые заинтересованы в этом сайте, могут просмотреть темы: «Учебное пособие по структуре данных Java и алгоритм», «Сводка операции Java Dom Node», «Сводка Java File и каталог
Я надеюсь, что эта статья будет полезна для всех Java Programming.