From 89d4de7d97f56bbc7ebd132a731c014ed76b791e Mon Sep 17 00:00:00 2001 From: Krzysztof Nowak Date: Mon, 21 May 2012 14:34:15 +0200 Subject: [PATCH] szukanie K --- SWD.py | 36 +++++++++++++++++++++++++++++++++--- main.py | 17 ++++++++++++++++- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/SWD.py b/SWD.py index ed75b55..b91926c 100755 --- a/SWD.py +++ b/SWD.py @@ -310,6 +310,35 @@ def _srednia(self, obiekty): sr[zm] = float(suma)/len(obiekty) return sr + def sklasyfikuj_k(self, k, klasy_tmp, indeksy, srednie): + rozrzuty_suma = 0.0; + wartosci = [] + for wektor in self.lista: + wartosci.append([wektor[i] for i in indeksy]) + for t in range(k): + #TODO BUG, + osobniki = [wartosci[i] for i in range(len(wartosci)) if klasy_tmp[i]==t] + srednia = self._srednia(osobniki) + #srednia = srednie[t] + max_rozrzut = max([self.metrykaEuklidesowa(osobniki[i], srednia) for i in range(len(osobniki))]) + rozrzuty_suma += max_rozrzut + return rozrzuty_suma + + + def znajdz_k_srednich(self, metryka, klasa_decyzyjna, indeksy, N=None): + k_max = 10; #do ilu klas maksymalnie szukac + k_min = 2 + rozrzuty = [] + for k in range(k_min, k_max+1): + klasy_tmp, srednie = self.licz_k_srednich(k,metryka,klasa_decyzyjna, indeksy, N, False) + rozrzuty.append([self.sklasyfikuj_k(k,klasy_tmp,indeksy,srednie), k, klasy_tmp]) + wynik = sorted(rozrzuty, key=lambda a: a[0])[0] + for w in range(len(self.lista)): + self.lista[w].append(wynik[2][w]) + self.kolumny.append('Metoda %d-srednich'%(wynik[1])) + self.typy.append(int) + return wynik + def licz_k_srednich(self, k, metryka, klasa_decyzyjna, indeksy, N=None, dopasuj=True): """ @@ -440,9 +469,10 @@ def DBG_k_srednich(): z = Zbior() z.wczytaj('dane/irisdat2.txt', '\t', 0, 1,1) z.rzutuj_dane() - output = z.licz_k_srednich(3,z.metrykaEuklidesowa,4,[0,1,2,3], None) - if output['result'] == 'OK': - print output['val'] + #output = z.licz_k_srednich(3,z.metrykaEuklidesowa,4,[0,1,2,3], None) + #if output['result'] == 'OK': + #print output['val'] + print z.znajdz_k_srednich(z.metrykaEuklidesowa,4,[0,1,2,3]) if(__name__ == "__main__"): DBG_k_srednich() diff --git a/main.py b/main.py index 95004ec..cfc2dac 100755 --- a/main.py +++ b/main.py @@ -397,7 +397,22 @@ def Metoda_K_Srednich(self): self.populate_from_set() def Metoda_K_Srednich_search(self): - pass #TODO + + indeksy, ok = QtGui.QInputDialog.getText(self, 'Indeksy Zmiennych', 'Podaj indeksy kolumn oddzielone ",":') + if not ok: + return + + klasa, ok = QtGui.QInputDialog.getText(self, 'Klasa decyzyjna', 'Podaj indeks klasy decyzyjnej:') + if not ok: + return + + indeksy = [int(i) for i in indeksy.split(',')] + klasa = int(klasa) + + wynik = self.zb.znajdz_k_srednich(self.zb.metrykaEuklidesowa,klasa, indeksy) + self.populate_from_set() + self.PopupMessage("Podsumowanie szukania K", "Optymalne K: %d, Suma odchylen: %.3f" %(wynik[1],wynik[0])) + def __init__(self): QtGui.QMainWindow.__init__(self)