|
|
pl:miw:miw08_rbs_ml:program [2017/07/17 10:08] |
pl:miw:miw08_rbs_ml:program [2019/06/27 15:50] (aktualna) |
| <code = "java"> |
| package MachineLearning; |
| |
| import java.util.*; |
| |
| /** |
| * Klasa z której program rozpoczyna swoje wykonywanie |
| * @author Angello |
| * |
| */ |
| public class Program { |
| |
| /** |
| * Początek programu |
| * @param args |
| */ |
| public static void main(String[] args) { |
| test(); |
| } |
| |
| /** |
| * Tworzy tablicę zawierająca wszyskie możliwe przypadki |
| * @return |
| */ |
| public static Object[][] create() |
| { |
| |
| Object[][] learning = new Object[2016][]; |
| Integer index = -1; |
| Integer day; |
| Integer oper; |
| Integer month; |
| for (Integer i = 0; i < 7; i++) // Dni |
| { |
| day = i; |
| for (Integer j = 0; j < 24; j++) // Godziny |
| { |
| oper = j; |
| for (Integer k = 0; k < 12; k++) // Miesiące |
| { |
| month = k; |
| learning[++index] = new Object[] { day, oper, month, 0 }; |
| learning[index][3] = CountTemperature(learning[index]); |
| } |
| } |
| } |
| return learning; |
| } |
| |
| /** |
| * Zbudowanie drzewa i sprawdzenie działanie drzewa dla pozostałych przykładów |
| * @param learningLength |
| * @return |
| */ |
| public static int makeOneTest(Integer learningLength, boolean c45) |
| { |
| Integer randValue; |
| Object[][] everything; |
| Object[][] testing; |
| Object[][] learning; |
| DecisionTree decisionTree; |
| Integer goodClassified = 0; |
| |
| everything = create();//= Common.BinaryDeSerialize("Thermostat_2016.bin"); |
| String[] attributeNames = new String[] { "Day", "Hour", "Month" }; |
| |
| Random rand = new Random(); |
| ArrayList<Integer> learningIndexes = new ArrayList<Integer>(); |
| ArrayList<Integer> testingIndexes = new ArrayList<Integer>(); |
| for (Integer i = 0; i < learningLength; i++) |
| { |
| randValue = rand.nextInt(2015); |
| if (!learningIndexes.contains(randValue)) |
| learningIndexes.add(randValue); |
| else |
| --i; |
| } |
| Collections.sort(learningIndexes); |
| |
| for (Integer i = 0; i < 2016; i++) |
| { |
| if (!learningIndexes.contains(i)) |
| testingIndexes.add(i); |
| } |
| |
| testing = indexesToArray(everything, testingIndexes); |
| |
| learning = indexesToArray(everything, learningIndexes); |
| |
| decisionTree = new DecisionTree(); |
| decisionTree.initialize(learning, attributeNames, c45); |
| |
| for (Object[] row : testing) |
| { |
| if (decisionTree.findCategory(row) == (Integer)row[3]) |
| goodClassified++; |
| } |
| System.out.println(goodClassified); |
| return goodClassified; |
| } |
| |
| /** |
| * Tworzy tablicę Przykładów z podanej listy indeksów oraz tablicy wszystkich przykładów |
| * @param everything |
| * @param indexesList |
| * @return |
| */ |
| private static Object[][] indexesToArray(Object[][] everything, ArrayList<Integer> indexesList) |
| { |
| ArrayList<Object[]> testingList = new ArrayList<Object[]>(); |
| for (Integer index : indexesList) |
| { |
| testingList.add(everything[index]); |
| } |
| Object[][] returnTable = new Object[indexesList.size()][everything[0].length]; |
| testingList.toArray(returnTable); |
| return returnTable; |
| } |
| |
| /** |
| * Oblicza jaka powinna być nastawa termostatu przy przedstawionych atrybutach (example) |
| * @param example Zbiór atrybutów |
| * @return |
| */ |
| public static int CountTemperature(Object[] example) |
| { |
| boolean workday = true; |
| if (Days.saturday.ordinal() == (Integer)example[0] || Days.sunday.ordinal() == (Integer)example[0]) |
| workday = false; |
| |
| boolean oper = false; |
| if ((Integer)example[1] >= 9 && (Integer)example[1] < 17) |
| oper = true; |
| boolean business = false; |
| if (workday && oper) |
| business = true; |
| |
| Thermostat temperature = Thermostat.t14; |
| switch ((Integer)example[2]) |
| { |
| case 11: |
| case 0: |
| case 1: |
| if (business) |
| temperature = Thermostat.t18; |
| else |
| temperature = Thermostat.t14; |
| break; |
| case 2: |
| case 3: |
| case 4: |
| if (business) |
| temperature = Thermostat.t20; |
| else |
| temperature = Thermostat.t15; |
| |
| break; |
| case 5: |
| case 6: |
| case 7: |
| if (business) |
| temperature = Thermostat.t24; |
| else |
| temperature = Thermostat.t27; |
| break; |
| case 8: |
| case 9: |
| case 10: |
| if (business) |
| temperature = Thermostat.t20; |
| else |
| temperature = Thermostat.t16; |
| break; |
| } |
| |
| return temperature.ordinal(); |
| } |
| |
| /** |
| * Wykonuje 20 testów i wypisuje statystyki |
| */ |
| private static void test() |
| { |
| int learningLength = 150; |
| ArrayList<Integer> list = new ArrayList<Integer>(); |
| Integer sum = 0; |
| for (int i = 0; i < 20; i++) { |
| list.add(makeOneTest(learningLength, false)); |
| } |
| for (Integer var : list) |
| { |
| sum += var; |
| } |
| double percent = (double) sum / (double)(2016 - 150) / (double)list.size(); |
| Collections.sort(list); |
| |
| ArrayList<Integer> listc45 = new ArrayList<Integer>(); |
| Integer sumc45 = 0; |
| for (int i = 0; i < 20; i++) { |
| listc45.add(makeOneTest(learningLength, true)); |
| } |
| for (Integer var : listc45) |
| { |
| sumc45 += var; |
| } |
| double percentc45 = (double) sumc45 / (double)(2016 - 150) / (double)listc45.size(); |
| Collections.sort(listc45); |
| |
| System.out.println("Średnia skuteczność dla ID3: "+percent); |
| System.out.println("Najgorsza: "+list.get(0)); |
| System.out.println("Najlepsza: "+list.get(listc45.size()-1)); |
| |
| System.out.println("Średnia skuteczność dla C4.5: "+percentc45); |
| System.out.println("Najgorsza: "+listc45.get(0)); |
| System.out.println("Najlepsza: "+listc45.get(listc45.size()-1)); |
| |
| } |
| } |
| |
| </code> |