예제 #1
0
 def kmeans(self):
     try:
         if self.dane.empty:
             self.showDialog('Dane nie zostały wczytane')
             return
         daneKMeans = self.dane.copy()
         daneKMeans = daneKMeans.astype(float64)
         if self.ui.comboBoxKMeansMetryka.currentText() in 'cosine':
             daneKMeans = preprocessing.normalize(daneKMeans, norm='l2')
         KM = kmeans(daneKMeans,
                     n_clusters=self.ui.spinBoxKMeansIloscKlastrow.value(),
                     metric=self.ui.comboBoxKMeansMetryka.currentText(),
                     maxiter=1000,
                     verbose=0)
         labelsKM = KM[1]
         if self.ui.radioButtonMiaraSilhouette.isChecked():
             score_silhouette_KM = silhouette_score(
                 self.dane,
                 labelsKM,
                 metric=self.ui.comboBoxKMeansMetryka.currentText())
             score_silhouette_KM = round(score_silhouette_KM, 4)
             self.ui.txtWynikSprawdzenia.setText(str(score_silhouette_KM))
         elif self.ui.radioButtonMiaraDaviesBoudlin.isChecked():
             score_DaviesBoudlin_KM = davies_bouldin_score(
                 self.dane, labelsKM)
             score_DaviesBoudlin_KM = round(score_DaviesBoudlin_KM, 4)
             self.ui.txtWynikSprawdzenia.setText(
                 str(score_DaviesBoudlin_KM))
         elif self.ui.radioButtonMiaraCelinskiHarabasz.isChecked():
             score_CalinskiHarabasz_KM = calinski_harabasz_score(
                 self.dane, labelsKM)
             score_CalinskiHarabasz_KM = round(score_CalinskiHarabasz_KM, 4)
             self.ui.txtWynikSprawdzenia.setText(
                 str(score_CalinskiHarabasz_KM))
     except Exception as inst:
         self.showDialog(inst)
def szukanieCH(dane, daneoryginalne, maxIter, ileKlastrow):
    dane = dane.astype(float64)
    distance = ['euclidean', 'cityblock', 'cosine']
    if dane.shape[1] < 2:
        return -1
    najlepszyWynikCHDBScan = 0
    najlepszaMetrykaDBSCAN = ""
    najlepszyParametrSilhouetteDBScan = 0

    najlepszyWynikCHKMeans = 0
    najlepszaMetrykaCHKMeans = ""
    optymalnaLiczbaKlastrowCHKMeans = 0

    najlepszyWynikCHAC = 0
    najlepszaMetrykaCHAC = ""
    optymalnaLiczbaKlastrowCHAC = 0

    for i in distance:
        print("Test dla " + i)
        try:
            daneDB = dane.copy()
            dbscanKNN = DB_SCAN("Wariant" + str(dane))
            eps = dbscanKNN.KNNdist_plot(dane, 3, i)
            if eps > 10:
                eps = round(eps)
            elif eps <= 10 and eps > 3:
                eps = round(eps, 1)
            elif eps <= 3:
                eps = round(eps, 2)
            elif eps <= 1:
                eps = round(eps, 4)
            elif eps <= 0.5:
                eps = round(eps, 6)
            elif eps <= 0.2:
                eps = eps
            db = DBSCAN(eps=eps, metric=i).fit(dane)
            core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
            core_samples_mask[db.core_sample_indices_] = True
            if len(unique(db.labels_)) > 1:
                score_CH_DB = calinski_harabasz_score(daneoryginalne,
                                                      db.labels_)
                if score_CH_DB > najlepszyWynikCHDBScan:
                    najlepszyWynikCHDBScan = score_CH_DB
                    najlepszaMetrykaDBSCAN = i
                    najlepszyParametrSilhouetteDBScan = eps
        except Exception as inst:
            print(inst)

        for k in tqdm(range(2, ileKlastrow + 1, 1),
                      desc="Test ilosci klastrow",
                      dynamic_ncols=True):
            try:
                daneKM = dane.copy()
                KM = kmeans(dane,
                            n_clusters=k,
                            metric=i,
                            maxiter=maxIter,
                            verbose=0)
                labelsKM = KM[1]
                score_CH_KM = calinski_harabasz_score(daneoryginalne, labelsKM)

                if score_CH_KM > najlepszyWynikCHKMeans:
                    najlepszyWynikCHKMeans = score_CH_KM
                    najlepszaMetrykaCHKMeans = i
                    optymalnaLiczbaKlastrowCHKMeans = k
            except Exception as inst:
                print(inst)

            try:
                daneAC = dane.copy()
                ac = AgglomerativeClustering(n_clusters=k,
                                             affinity=i,
                                             linkage="average").fit(dane)
                labelsAC = ac.labels_
                score_CH_AC = calinski_harabasz_score(daneoryginalne, labelsAC)

                if score_CH_AC > najlepszyWynikCHAC:
                    najlepszyWynikCHAC = score_CH_AC
                    najlepszaMetrykaCHAC = i
                    optymalnaLiczbaKlastrowCHAC = k
            except Exception as inst:
                print(inst)

    najlepszyWynikCH = maximum(najlepszyWynikCHDBScan, najlepszyWynikCHKMeans,
                               najlepszyWynikCHAC)

    if najlepszyWynikCH == najlepszyWynikCHDBScan:
        return {
            "Metoda": "DBScan",
            "Metryka": najlepszaMetrykaDBSCAN,
            "eps/k": najlepszyParametrSilhouetteDBScan,
            "Wynik CelinskiHarabasz": round(najlepszyWynikCHDBScan, 2),
            "Liczba koniecznych wymiarów": dane.shape[1]
        }
    if najlepszyWynikCH == najlepszyWynikCHKMeans:
        return {
            "Metoda": "KMeans",
            "Metryka": najlepszaMetrykaCHKMeans,
            "eps/k": optymalnaLiczbaKlastrowCHKMeans,
            "Wynik CelinskiHarabasz": round(najlepszyWynikCHKMeans, 2),
            "Liczba koniecznych wymiarów": dane.shape[1]
        }
    if najlepszyWynikCH == najlepszyWynikCHAC:
        return {
            "Metoda": "Agglomerative",
            "Metryka": najlepszaMetrykaCHAC,
            "eps/k": optymalnaLiczbaKlastrowCHAC,
            "Wynik CelinskiHarabasz": round(najlepszyWynikCHAC, 2),
            "Liczba koniecznych wymiarów": dane.shape[1]
        }
예제 #3
0
def klasyfikacja(dane, cechy, klasyfikatorMetodaMetryka, klasyfikatorParametr,
                 miara):

    cechyDoKlasyfikacji = pd.DataFrame.from_dict([cechy], orient='columns')

    klasyfikacjaMetodaMetryka = klasyfikatorMetodaMetryka.predict(
        cechyDoKlasyfikacji)[0]
    cechyDoKlasyfikacji['Metoda_metryka'] = int(klasyfikacjaMetodaMetryka)
    cechyDoKlasyfikacji['Parametr'] = klasyfikatorParametr.predict(
        cechyDoKlasyfikacji)[0]

    metoda_metryka = cechyDoKlasyfikacji.iloc[
        0, cechyDoKlasyfikacji.columns.get_loc('Metoda_metryka')]
    parametr = cechyDoKlasyfikacji.iloc[
        0, cechyDoKlasyfikacji.columns.get_loc('Parametr')]

    daneKlasyfikacja = dane.copy()
    daneKlasyfikacja = daneKlasyfikacja.astype(float64)

    if metoda_metryka == 11:
        db = DBSCAN(eps=parametr, metric='euclidean').fit(daneKlasyfikacja)
        core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
        core_samples_mask[db.core_sample_indices_] = True
        if miara in 'silhouette':
            if len(unique(db.labels_)) > 1:
                score = silhouette_score(dane, db.labels_, metric='euclidean')
        elif miara in 'daviesBoudlin':
            if len(unique(db.labels_)) > 1:
                score = davies_bouldin_score(dane, db.labels)
        elif miara in 'calinskiHarabasz':
            if len(unique(db.labels_)) > 1:
                score = calinski_harabasz_score(dane, db.labels)
        return 'DBScan', 'euclidean', parametr, score

    elif metoda_metryka == 12:
        db = DBSCAN(eps=parametr, metric='cityblock').fit(daneKlasyfikacja)
        core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
        core_samples_mask[db.core_sample_indices_] = True
        if miara in 'silhouette':
            if len(unique(db.labels_)) > 1:
                score = silhouette_score(dane, db.labels_, metric='cityblock')
        elif miara in 'daviesBoudlin':
            if len(unique(db.labels_)) > 1:
                score = davies_bouldin_score(dane, db.labels)
        elif miara in 'calinskiHarabasz':
            if len(unique(db.labels_)) > 1:
                score = calinski_harabasz_score(dane, db.labels)

        return 'DBScan', 'cityblock', parametr, score

    elif metoda_metryka == 13:
        db = DBSCAN(eps=parametr, metric='cosine').fit(daneKlasyfikacja)
        core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
        core_samples_mask[db.core_sample_indices_] = True
        if miara in 'silhouette':
            if len(unique(db.labels_)) > 1:
                score = silhouette_score(dane, db.labels_, metric='cosine')
        elif miara in 'daviesBoudlin':
            if len(unique(db.labels_)) > 1:
                score = davies_bouldin_score(dane, db.labels)
        elif miara in 'calinskiHarabasz':
            if len(unique(db.labels_)) > 1:
                score = calinski_harabasz_score(dane, db.labels)

        return 'DBScan', 'cosine', parametr, score

    elif metoda_metryka == 21:
        KM = kmeans(daneKlasyfikacja,
                    n_clusters=int(round(parametr)),
                    metric='euclidean',
                    maxiter=1000,
                    verbose=0)
        labelsKM = KM[1]
        if miara in 'silhouette':
            score = silhouette_score(dane, labelsKM, metric='euclidean')
        elif miara in 'daviesBoudlin':
            score = davies_bouldin_score(dane, labelsKM)
        elif miara in 'calinskiHarabasz':
            score = calinski_harabasz_score(dane, labelsKM)

        return 'KMeans', 'euclidean', int(round(parametr)), score

    elif metoda_metryka == 22:
        KM = kmeans(daneKlasyfikacja,
                    n_clusters=int(round(parametr)),
                    metric='cityblock',
                    maxiter=1000,
                    verbose=0)
        labelsKM = KM[1]
        if miara in 'silhouette':
            score = silhouette_score(dane, labelsKM, metric='cityblock')
        elif miara in 'daviesBoudlin':
            score = davies_bouldin_score(dane, labelsKM)
        elif miara in 'calinskiHarabasz':
            score = calinski_harabasz_score(dane, labelsKM)

        return 'KMeans', 'cityblock', int(round(parametr)), score

    elif metoda_metryka == 23:
        KM = kmeans(daneKlasyfikacja,
                    n_clusters=int(round(parametr)),
                    metric='cosine',
                    maxiter=1000,
                    verbose=0)
        labelsKM = KM[1]
        if miara in 'silhouette':
            score = silhouette_score(dane, labelsKM, metric='cosine')
        elif miara in 'daviesBoudlin':
            score = davies_bouldin_score(dane, labelsKM)
        elif miara in 'calinskiHarabasz':
            score = calinski_harabasz_score(dane, labelsKM)

        return 'KMeans', 'cosine', int(round(parametr)), score

    elif metoda_metryka == 31:
        ac = AgglomerativeClustering(n_clusters=int(round(parametr)),
                                     affinity='euclidean',
                                     linkage="average").fit(daneKlasyfikacja)
        labelsAC = ac.labels_
        if miara in 'silhouette':
            score = silhouette_score(dane, labelsAC, metric='euclidean')
        elif miara in 'daviesBoudlin':
            score = davies_bouldin_score(dane, labelsAC)
        elif miara in 'calinskiHarabasz':
            score = calinski_harabasz_score(dane, labelsAC)

        return 'Agglomerative', 'euclidean', int(round(parametr)), score

    elif metoda_metryka == 32:
        ac = AgglomerativeClustering(n_clusters=int(round(parametr)),
                                     affinity='cityblock',
                                     linkage="average").fit(daneKlasyfikacja)
        labelsAC = ac.labels_
        if miara in 'silhouette':
            score = silhouette_score(dane, labelsAC, metric='cityblock')
        elif miara in 'daviesBoudlin':
            score = davies_bouldin_score(dane, labelsAC)
        elif miara in 'calinskiHarabasz':
            score = calinski_harabasz_score(dane, labelsAC)

        return 'Agglomerative', 'cityblock', int(round(parametr)), score

    elif metoda_metryka == 33:
        ac = AgglomerativeClustering(n_clusters=int(round(parametr)),
                                     affinity='cosine',
                                     linkage="average").fit(daneKlasyfikacja)
        labelsAC = ac.labels_
        if miara in 'silhouette':
            score = silhouette_score(dane, labelsAC, metric='cosine')
        elif miara in 'daviesBoudlin':
            score = davies_bouldin_score(dane, labelsAC)
        elif miara in 'calinskiHarabasz':
            score = calinski_harabasz_score(dane, labelsAC)

        return 'Agglomerative', 'cosine', int(round(parametr)), score
예제 #4
0
def szukanieSilhouette(dane, daneoryginalne, maxIter, ileKlastrow):
    dane = dane.astype(float64)
    distance = ['euclidean', 'cityblock', 'cosine']
    if dane.shape[1] < 2:
        return -1
    najlepszyWynikSilhouetteDBScan = -1
    najlepszaMetrykaSilhouetteDBSCAN = ""
    najlepszyParametrSilhouetteDBScan = 0

    najlepszyWynikSilhouetteKMeans = -1
    najlepszaMetrykaSilhouetteKMeans = ""
    optymalnaLiczbaKlastrowSilhouetteKMeans = 0

    najlepszyWynikSilhouetteAC = -1
    najlepszaMetrykaSilhouetteAC = ""
    optymalnaLiczbaKlastrowSilhouetteAC = 0


    for i in distance:
        print("Test dla " + i)
        try:
            dbscanKNN = DB_SCAN("Wariant" + str(dane))
            eps = dbscanKNN.KNNdist_plot(dane, 3, i)
            if eps > 10:
                eps = round(eps)
            elif eps <= 10 and eps > 3:
                eps = round(eps, 1)
            elif eps <= 3:
                eps = round(eps, 2)
            elif eps <= 1:
                eps = round(eps, 4)
            elif eps <= 0.5:
                eps = round(eps, 6)
            elif eps <= 0.2:
                eps = eps
            db = DBSCAN(eps=eps, metric=i).fit(dane)
            core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
            core_samples_mask[db.core_sample_indices_] = True
            if len(unique(db.labels_)) > 1:
                score_silhouette_DB = silhouette_score(daneoryginalne, db.labels_, metric=i)
                if score_silhouette_DB > najlepszyWynikSilhouetteDBScan:
                    najlepszyWynikSilhouetteDBScan = score_silhouette_DB
                    najlepszaMetrykaSilhouetteDBSCAN = i
                    najlepszyParametrSilhouetteDBScan = eps
        except Exception as inst:
            print(inst)

        silhouette_kmeans = []
        silhouette_ac = []
        silhouette_kmeans_klastry = []
        silhouette_ac_klastry = []
        for k in tqdm(range(2, ileKlastrow+1, 1), desc= "Test ilosci klastrow", dynamic_ncols=True):
            try:
                if i is 'cosine':
                    daneNormalized = pd.DataFrame(dane)
                    daneNormalized = preprocessing.normalize(daneNormalized, norm='l2')

                    KM = kmeans(daneNormalized, n_clusters=k, metric=i, maxiter=maxIter, verbose=0)
                    labelsKM = KM[1]
                    score_silhouette_KM = silhouette_score(daneoryginalne, labelsKM, metric=i)
                    silhouette_kmeans.append(score_silhouette_KM)
                    silhouette_kmeans_klastry.append(k)
                else:
                    KM = kmeans(dane, n_clusters=k, metric=i, maxiter=maxIter, verbose=0)
                    labelsKM = KM[1]
                    score_silhouette_KM = silhouette_score(daneoryginalne, labelsKM, metric=i)
                    silhouette_kmeans.append(score_silhouette_KM)
                    silhouette_kmeans_klastry.append(k)
            except Exception as inst:
                print(inst)

            try:
                ac = AgglomerativeClustering(n_clusters=k, affinity=i, linkage="average").fit(dane)
                labelsAC = ac.labels_
                score_silhouette_AC = silhouette_score(daneoryginalne, labelsAC, metric=i)
                silhouette_ac.append(score_silhouette_AC)
                silhouette_ac_klastry.append(k)
            except Exception as inst:
                print(inst)
        try:
            if len(silhouette_kmeans) > 0:
                kneedleKM = KneeLocator(silhouette_kmeans_klastry, silhouette_kmeans, S=1.0, curve='convex',
                                        direction='decreasing',
                                        interp_method='polynomial')
                if kneedleKM.knee_y > najlepszyWynikSilhouetteKMeans:
                    najlepszyWynikSilhouetteKMeans = kneedleKM.knee_y
                    optymalnaLiczbaKlastrowSilhouetteKMeans = kneedleKM.knee
                    najlepszaMetrykaSilhouetteKMeans = i
        except Exception as inst:
            print(inst)
            pass
        try:
            kneedleAC = KneeLocator(silhouette_ac_klastry, silhouette_ac, S=1.0, curve='convex', direction='decreasing',
                                    interp_method='polynomial')

            if kneedleAC.knee_y > najlepszyWynikSilhouetteAC:
                najlepszyWynikSilhouetteAC = kneedleAC.knee_y
                optymalnaLiczbaKlastrowSilhouetteAC = kneedleAC.knee
                najlepszaMetrykaSilhouetteAC = i
        except Exception as inst:
            print(inst)
            pass

    najlepszyWynikSilhouette = maximum(najlepszyWynikSilhouetteDBScan, najlepszyWynikSilhouetteKMeans, najlepszyWynikSilhouetteAC)


    if najlepszyWynikSilhouette == najlepszyWynikSilhouetteDBScan:
        return {"Metoda":"DBScan", "Metryka": najlepszaMetrykaSilhouetteDBSCAN,"eps/k":najlepszyParametrSilhouetteDBScan, "Wynik Silhouette" : round(najlepszyWynikSilhouetteDBScan,2),
                "Liczba koniecznych wymiarów" : dane.shape[1]}
    if najlepszyWynikSilhouette == najlepszyWynikSilhouetteKMeans:
        return {"Metoda": "KMeans", "Metryka": najlepszaMetrykaSilhouetteKMeans, "eps/k": optymalnaLiczbaKlastrowSilhouetteKMeans,
                "Wynik Silhouette": round(najlepszyWynikSilhouetteKMeans,2), "Liczba koniecznych wymiarów" : dane.shape[1]}
    if najlepszyWynikSilhouette == najlepszyWynikSilhouetteAC:
        return {"Metoda": "Agglomerative", "Metryka": najlepszaMetrykaSilhouetteAC,
                "eps/k": optymalnaLiczbaKlastrowSilhouetteAC,
                "Wynik Silhouette": round(najlepszyWynikSilhouetteAC,2), "Liczba koniecznych wymiarów" : dane.shape[1]}