Laskennallisesti Älykkäät Järjestelmät. Sumean kmeans ja kmeans algoritmien vertailu

Samankaltaiset tiedostot
Java UI-komponentit (JTable) Juha Järvensivu 2007

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

RINNAKKAINEN OHJELMOINTI A,

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmointiharjoituksia Arduino-ympäristössä

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Java kahdessa tunnissa. Jyry Suvilehto

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Metodien tekeminen Javalla

Listarakenne (ArrayList-luokka)

20. Javan omat luokat 20.1

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Capacity Utilization

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Rajapinta (interface)

13. Loogiset operaatiot 13.1

Algoritmit 1. Demot Timo Männikkö

Alternative DEA Models

1 Tehtävän kuvaus ja analysointi

Javan GUI Scratchaajalle

Java-API, rajapinnat, poikkeukset, UML,...

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Luokan sisällä on lista

SIMULINK S-funktiot. SIMULINK S-funktiot

13. Loogiset operaatiot 13.1

17. Javan omat luokat 17.1

Mikä yhteyssuhde on?

Java-kielen perusteita

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmointityö 3. Mikko Laamanen

Algoritmit 1. Demot Timo Männikkö

16. Javan omat luokat 16.1

11. Javan valintarakenteet 11.1

Muuttujat ja kontrolli. Ville Sundberg

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

812336A C++ -kielen perusteet,

Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla

Luokan muodostimet (Constructors)

Ohjelmointi 1 C#, kevät 2013, 2. tentti

Olio-ohjelmointi Javalla

TIETORAKENTEET JA ALGORITMIT

The Viking Battle - Part Version: Finnish

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Interaktiivinen tarinankerronta

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

XNA grafiikka laajennus opas. Paavo Räisänen. Tämän oppaan lähdekoodit ovat ladattavissa näiden sivujen Ladattavat osiossa.

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

The CCR Model and Production Correspondence

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Ohjelmointi 1 C#, kevät 2013,

Ohjelmointi 2, välikoe

Tietokannat II -kurssin harjoitustyö

ITKP102 Ohjelmointi 1 (6 op)

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

LUKU 17 MUUTAMIA JAVA FX -SOVELLUKSIA. Tässä dokumentissa esitellään muutamia Java FX -sovelluksia.

17. Javan omat luokat 17.1

Javan semaforit. Joel Rybicki, Aleksi Nur mi, Jara Uitto. Helsingin yliopisto

JavaScript alkeet Esimerkkikoodeja moniste 2 ( Metropolia)

11. Javan toistorakenteet 11.1

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

1. Mitä tehdään ensiksi?

Algoritmit 2. Demot Timo Männikkö

14. Hyvä ohjelmointitapa 14.1

OHJ2k12 välikoe

C++11 seminaari, kevät Johannes Koskinen

Ohjelmointi 2 / 2011 Välikoe / 25.3

Ehto- ja toistolauseet

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Kirjasto Relaatiotietokannat Kevät Auvinen Annemari Niemi Anu Passoja Jonna Pulli Jari Tersa Tiina

Helsingin yliopisto, Tietojenkäsittelytieteen laitos Ohjelmistotuotanto, kurssikoe , H. Laine Arvostelu

Java-kielen perusteet

12. Javan toistorakenteet 12.1

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Toisessa viikkoharjoituksessa on tavoitteena tutustua JUnit:lla testaukseen Eclipse-ympäristössä.

ITKP102 Ohjelmointi 1 (6 op)

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

public static void main (String [] args)

12. Javan toistorakenteet 12.1

Java-kielen perusteet

Metsälamminkankaan tuulivoimapuiston osayleiskaava

Merkkijonon tutkiminen matches-metodilla

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Returns to Scale II. S ysteemianalyysin. Laboratorio. Esitelmä 8 Timo Salminen. Teknillinen korkeakoulu

9. Periytyminen Javassa 9.1

Use of spatial data in the new production environment and in a data warehouse

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

15. Ohjelmoinnin tekniikkaa 15.1

14. Poikkeukset 14.1

Sovellusohjelmointi Matlab-ympäristössä: Vertaisverkon koneiden klusterointi

Ohjelmointityö 65 Tekstinmuotoilu ohjelma. Dokumentaatio. Aki Heikkinen (155394)

9. Periytyminen Javassa 9.1

Transkriptio:

Laskennallisesti Älykkäät Järjestelmät Sumean kmeans ja kmeans algoritmien vertailu Annemari Auvinen (annauvi@st.jyu.fi) Anu Niemi (anniemi@st.jyu.fi) 28.5.2002

1 Tehtävän kuvaus Tehtävänämme oli verrata kmeans- ja sumea kmeans algoritmeja toisiinsa. Kieleksi valitsimme Javan, joka tosin ei kovin hyvin sopinut näin jälkikäteen ajatellen tähän tehtävään. Testasimme algoritmit seuraavasti: 1. muodostetaan satunnaisia normaalijakautuneita ryppäitä erilaisilla keskiarvoilla, varianssina 2.5 2. ajetaan k-means ja saadaan keskiarvot 3. ajetaan sumea k-means ja saadaan keskiarvot 4. lasketaan menetelmien tuottamat virheet (kohdassa 1 olevan keskipisteen ja saadun keskipisteen etäisyys) ja talletetaan ne 5. kohtaan 1 Silmukkaa kierretään m kertaa. Lopuksi tulostetaan menetelmien antamat virheet kierroksittain kaikille keskipisteille.

2 Koodit 2.1 Kmeans import java.util.*; import java.lang.*; import java.lang.math; import java.lang.integer; * Title: Kmeans.java * Description: Class for kmeans-algorithm. * Copyright: Annemari Auvinen, Anu Niemi (c) 2002 * Company: * @author Annemari Auvinen, Anu Niemi * @version 1.0 * * @param data Vector for datapoints * @param neww Vector for midpoints. * @param w Vector for the values of midpoints. * @param k Int number of clusters * @param epsilon Double value of epsilon. * @param classeddata Vector for classified data. public class Kmeans private Vector data = new Vector(); private Vector w = new Vector(); private Vector neww = new Vector(); private Vector classeddata = new Vector(); private int k; private double epsilon = 0.1; * Returns vector, which includes the midpoints sorted by descending order based on * value of x. * @return Vector of midpoints public Vector getw() ArrangeVector arranged = new ArrangeVector(); Vector classes = arranged.arrange(w); return classes; * Sets the epsilon.

* @param epsilon Int value of epsilon public void setepsilon(double value) epsilon = value; * Sets the number of clusters. * @param value Int value of clusters public void setk(int value) k = value; * Sets the w vector. public void setwvector() int points = data.size(); int ii; Vector used = new Vector(); Random random = new Random(); Integer index = new Integer(0); for (int i = 0; i<k; i++) do ii = random.nextint(points); index = new Integer(ii); while(used.contains(index)); used.add(index); w.add(data.elementat(ii)); * Creates the datavectors where data will be classed. public void createdatavectors() for (int i = 0; i<k; i++) classeddata.add(new Vector()); * Constructor for Kmeans.

* @param data Vector of datapoints * @param k Int number of clusters public Kmeans(Vector data, int k ) this.data = data; this.k = k; setwvector(); createdatavectors(); classdata(); do avarages(); boolean end =testend(); if (end) break; else w.removeallelements(); for (int i=0; i<k; i++) Observation h = (Observation)newW.elementAt(i); w.add(h); neww.removeallelements(); classeddata.removeallelements(); createdatavectors(); classdata(); while (true); * Classifies the data public void classdata() double x; double y; double wx; double wy; double dist; //distance int index = 0; for (int i=0; i<data.size(); i++) dist = -1; Observation datapoint = (Observation)data.elementAt(i);

x = datapoint.getx(); y = datapoint.gety(); for (int j=0; j<k; j++) Observation ww = (Observation)w.elementAt(j); wx = ww.getx(); wy = ww.gety(); double testdist; testdist = Math.sqrt( (Math.pow( (x-wx), 2.0) + Math.pow( (y-wy), 2.0) ) ); if (dist < 0) dist = testdist; index = j; if (dist > testdist) dist =testdist; index = j; Vector vector = (Vector)classedData.elementAt(index); vector.add(datapoint); * Calculates the avarages. Avarages are stored in the vector neww. public void avarages() double x = 0.0; double y = 0.0; for(int i=0; i<k; i++) x = 0.0; y = 0.0; Vector classedpoints = (Vector)classedData.elementAt(i); int datapoints = classedpoints.size(); //X-value for (int j=0; j<datapoints; j++) Observation point = (Observation)classedPoints.elementAt(j); x = x + point.getx();

x = x / datapoints; //y-value for (int j=0; j<datapoints; j++) Observation point = (Observation)classedPoints.elementAt(j); y = y + point.gety(); y = y / datapoints; Observation o = new Observation(x,y); neww.add(o); * Tests whether there is enoough iterations. *@return true if the distance between the elements of w and neww vectors is * less than epsilon, otherwise false public boolean testend() for(int i = 0; i<k; i++ ) Observation newwvalue = (Observation)newW.elementAt(i); Observation oldwvalue = (Observation)w.elementAt(i); double testdist; testdist = Math.sqrt( (Math.pow( (oldwvalue.getx()-newwvalue.getx()), 2.0) + Math.pow( (oldwvalue.gety()- newwvalue.gety()), 2.0) ) ); if (testdist > epsilon ) return false; return true;

2.2 Sumea kmeans * Title: FuzzyKmeans.java * Description: Class for fuzzy kmeans-algorithm. * Copyright: Annemari Auvinen, Anu Niemi (c) 2002 * Company: * @author Annemari Auvinen, Anu Niemi * @version 1.0 * * @param datapoints Vector for datapoints * @param midpoints Vector for midpoints. * @param oldmidpoints Vector for the values of old midpoints. * @param membfunctions Hashtable for values of member functions. * @param oldmembfuctions Hashtable for old values of member functions. * @param clusters Int number of clusters * @param b Int width parameter. * @param epsilon Double value of epsilon. * @param change Double value of change between iterations. import java.util.*; import java.lang.*; public class FuzzyKmeans private Vector datapoints= new Vector(); private Vector midpoints = new Vector(); private Vector oldmidpoints = new Vector(); private Hashtable membfunctions = new Hashtable(); private Hashtable oldmembfunctions = new Hashtable(); private int clusters; private int b; private double epsilon; private double change; * Constructor for FuzzyKmeans. * @param datapoints Vector of datapoints * @param k Int number of clusters * @param b Int width parameter * @param epsilon Double value of epsilon public FuzzyKmeans(Vector datapoints, int k, int b, double epsilon) this.datapoints = datapoints; this.clusters = k; this.b = b; this.epsilon = epsilon;

* Returns vector, which includes the midpoints sorted by descending order based on * value of x. * @return vector of midpoints public Vector getmidpoints() ArrangeVector arranged = new ArrangeVector(); Vector classes = arranged.arrange(midpoints); return classes; * Initializes the midpoints and member function values. public void initialize() Random randomvalue = new Random(); //includes the indexes of selected points Vector takenpoints = new Vector(); Observation mp; Integer index; int value, nmb,i,j; nmb = datapoints.size(); //initializes the random selected datapoints to midpoints, same points is selected only once for ( i=0; i<clusters; i++) do value = randomvalue.nextint(nmb); index = new Integer(value); while(takenpoints.contains(index)); mp = (Observation)datapoints.elementAt(value); takenpoints.add(index); midpoints.add(mp); for ( j=0; j<nmb; j++) Membership ms = new Membership(0.0); String place = i+"_"+j; membfunctions.put(place,ms); change = epsilon + 1; //condition for ending Calculates the midpoints. public void calculatemidpoints() double numeratorx;

double numeratory; double denominator; int nmb = datapoints.size(); oldmidpoints.removeallelements(); //puts the old midpoints to vector for (int l=0; l<clusters;l++) Observation o = (Observation)midpoints.elementAt(l); oldmidpoints.add(o); midpoints.removeallelements(); for (int i=0; i<clusters;i++) numeratorx = 0; numeratory = 0; denominator = 0; for (int j=0; j<nmb;j++) String place = i+"_"+j; Membership ms = (Membership)membFunctions.get(place); Observation o= (Observation)datapoints.elementAt(j); double factor = Math.pow(ms.getValue(),b); numeratorx += factor*o.getx(); numeratory += factor* o.gety(); denominator += factor; Observation obs; if(denominator!= 0) obs = new Observation(numeratorX/denominator, numeratory/denominator); else obs = (Observation)oldMidpoints.elementAt(i); midpoints.add(obs); * Calculates the values of member functions public void calculatemembfunctions() int nmb,i; String place; Membership ms; double midx, midy,x,y, distance, numerator, denominator, power,midx2,midy2; nmb = datapoints.size(); //puts the old values of member functions to table for( i=0; i<clusters;i++) for (int l=0;l<nmb;l++)

place = i+"_"+l; Membership member = (Membership)membFunctions.get(place); oldmembfunctions.put(place,member); for( i=0; i<clusters;i++) Observation mp = (Observation)midpoints.elementAt(i); midx = mp.getx(); midy = mp.gety(); //calculates numerator for( int j=0;j<nmb;j++) Observation point = (Observation)datapoints.elementAt(j); X = point.getx(); Y = point.gety(); distance = Math.pow((X-midX),2.0)+Math.pow((Y-midY),2.0); if(distance == 0) distance = 0.000001; power = 1.0/(b-1); numerator = Math.pow((1.0/distance), power); denominator = 0.0; //calculates denominator for (int k=0; k<clusters; k++) Observation o = (Observation)midpoints.elementAt(k); midx2=o.getx(); midy2=o.gety(); distance = Math.pow((X-midX2),2.0)+Math.pow((Y-midY2),2.0); if(distance == 0) distance = 0.000001; denominator += Math.pow((1.0/distance),power); if(denominator!= 0) ms = new Membership(numerator/denominator); else ms = new Membership(0.0); place = i+"_"+j; membfunctions.put(place,ms); * Caluculates the midpoints and values of member functions until the changes of midpoints or * values of member functions are bigger than epsilon public void iterate()

int nmb; String place; double membvalue,oldvalue,biggest,help,distance; biggest = 0.0; help = 0.0; nmb = datapoints.size(); initialize(); while (change > epsilon) biggest = 0.0; calculatemidpoints(); calculatemembfunctions(); for(int i=0; i<clusters;i++) Observation newmp = (Observation)midpoints.elementAt(i); Observation oldmp = (Observation)oldMidpoints.elementAt(i); distance = Math.sqrt(Math.pow((newMp.getX()- oldmp.getx()),2.0)+math.pow((newmp.gety()-oldmp.gety()),2.0)); for (int j=0; j<nmb; j++) place = i+"_"+j; Membership ms = (Membership)membFunctions.get(place); membvalue = ms.getvalue(); Membership ms2 = (Membership)oldMembFunctions.get(place); oldvalue = ms2.getvalue(); help = Math.abs(membValue-oldValue); if(help > biggest) biggest = help; if(distance > biggest) biggest = distance; change = biggest;

3 Testituloksia 3.1 Luokkia 2, pisteitä 2500/rypäs, leveysparametri 2, kierroksia 5 Kierros 1 keskipisteessä 1 tavallisen virhe 0.8328990275329275 ja sumean virhe 0.5728476707706995 Kierros 1 keskipisteessä 2 tavallisen virhe 0.7029763405333377 ja sumean virhe 0.6538848105069173 Kierros 2 keskipisteessä 1 tavallisen virhe 0.16716220673973625 ja sumean virhe 0.21192846059053422 Kierros 2 keskipisteessä 2 tavallisen virhe 0.3728240169397198 ja sumean virhe 0.29401598375787324 Kierros 3 keskipisteessä 1 tavallisen virhe 0.3789161207747754 ja sumean virhe 0.4015364135450447 Kierros 3 keskipisteessä 2 tavallisen virhe 0.47247520787011693 ja sumean virhe 0.283551375925339 Kierros 4 keskipisteessä 1 tavallisen virhe 0.83624956638595 ja sumean virhe 0.6604083683778255 Kierros 4 keskipisteessä 2 tavallisen virhe 1.0720859076965745 ja sumean virhe 0.7656651049863258 Kierros 5 keskipisteessä 1 tavallisen virhe 1.9635608873331691 ja sumean virhe 1.076275477637058 Kierros 5 keskipisteessä 2 tavallisen virhe 1.6697438042399304 ja sumean virhe 1.134964125925128 Toinen testi: Kierros 1 keskipisteessä 1 tavallisen virhe 0.11725511653463881 ja sumean virhe 0.030343451936421104 Kierros 1 keskipisteessä 2 tavallisen virhe 0.0352301214434908 ja sumean virhe 0.05871656103150916 Kierros 2 keskipisteessä 1 tavallisen virhe 0.38424174088299984 ja sumean virhe 0.3995734436282096 Kierros 2 keskipisteessä 2 tavallisen virhe 0.643572402552616 ja sumean virhe 0.4215299588347693 Kierros 3 keskipisteessä 1 tavallisen virhe 0.6197476073367011 ja sumean virhe 0.5920175443326129 Kierros 3 keskipisteessä 2 tavallisen virhe 0.8921807868982677 ja sumean virhe 0.6186333715897095 Kierros 4 keskipisteessä 1 tavallisen virhe 1.3661560082386255 ja sumean virhe 0.9262651693899763

Kierros 4 keskipisteessä 2 tavallisen virhe 1.18329980227418 ja sumean virhe 1.042081640712577 Kierros 5 keskipisteessä 1 tavallisen virhe 2.0190765293601256 ja sumean virhe 2.3477621659350425 Kierros 5 keskipisteessä 2 tavallisen virhe 2.607813582292546 ja sumean virhe 2.403322185134944 3.2 Luokkia 4, pisteitä 2500/rypäs, leveysparametri 2, kierroksia 5 Kierros 1 keskipisteessä 1 tavallisen virhe 2.7568506883984703 ja sumean virhe 2.663553834196809 Kierros 1 keskipisteessä 2 tavallisen virhe 3.3528814844441492 ja sumean virhe 3.0827368270487385 Kierros 1 keskipisteessä 3 tavallisen virhe 5.533338118183551 ja sumean virhe 5.0562785042656415 Kierros 1 keskipisteessä 4 tavallisen virhe 3.1659013692975666 ja sumean virhe 3.9135720486300203 Kierros 2 keskipisteessä 1 tavallisen virhe 3.410411198945593 ja sumean virhe 0.8234522559629306 Kierros 2 keskipisteessä 2 tavallisen virhe 4.784796678835296 ja sumean virhe 0.8620077921347632 Kierros 2 keskipisteessä 3 tavallisen virhe 2.0268642715473058 ja sumean virhe 0.6931095916801053 Kierros 2 keskipisteessä 4 tavallisen virhe 0.36821172465115426 ja sumean virhe 0.6497784912113534 Kierros 3 keskipisteessä 1 tavallisen virhe 5.250867152613417 ja sumean virhe 0.5695661280396731 Kierros 3 keskipisteessä 2 tavallisen virhe 6.026159109270971 ja sumean virhe 0.36153761824100566 Kierros 3 keskipisteessä 3 tavallisen virhe 3.417438775285456 ja sumean virhe 0.5176160608290125 Kierros 3 keskipisteessä 4 tavallisen virhe 0.9970051660104776 ja sumean virhe 0.6105892375322048 Kierros 4 keskipisteessä 1 tavallisen virhe 1.8700753486145032 ja sumean virhe 0.7595388449335759 Kierros 4 keskipisteessä 2 tavallisen virhe 7.138074237880796 ja sumean virhe 1.7655985818341426 Kierros 4 keskipisteessä 3 tavallisen virhe 0.8194750386568503 ja sumean virhe 6.054028259799661 Kierros 4 keskipisteessä 4 tavallisen virhe 1.5383548758552597 ja sumean virhe 6.325420409870378 Kierros 5 keskipisteessä 1 tavallisen virhe 1.8099635423800982 ja sumean virhe 2.500793804681536

Kierros 5 keskipisteessä 2 tavallisen virhe 5.515305578215164 ja sumean virhe 4.485554640283862 Kierros 5 keskipisteessä 3 tavallisen virhe 5.199031128062355 ja sumean virhe 4.365444467775055 Kierros 5 keskipisteessä 4 tavallisen virhe 2.1904047123771897 ja sumean virhe 2.531930826632833