|
|
pl:miw:miw08_rbs_ml:program [2008/06/16 11:48] miw |
pl:miw:miw08_rbs_ml:program [2017/07/17 10:08] |
<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, true)); | |
} | |
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, false)); | |
} | |
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> | |