Fehlermeldung ocal variable 'final_classification' referenced before assignment

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

Code: Alles auswählen

np.random.seed(11111)
max_k_to_try = 20

def robust_kmeans(data, k, howmany=20):
    score = 100000000
    for i in range(howmany):
        point_classification, centroids = konvergenz(data, k, noisy=False)
        total_inner_variance = np.nansum([np.var(data[point_classification == pointclass])
                                          for pointclass in range(k)])
        group_variance = np.var(centroids)
        new_score = group_variance / total_inner_variance
        if(new_score < score):
            final_classification, final_centroids = point_classification, centroids
            score = new_score
    return final_classification, final_centroids, score

elbow_values = [robust_kmeans(feature, k)[2] for k in range(2, max_k_to_try+1)]
fig, ax = plt.subplots()
fig.suptitle("elbow plot")
ax.plot(np.arange(2, max_k_to_try+1), elbow_values)
plt.show()


ich habe im internet nachgeschaut, dort steht dass man global deklarieren muss. Ich habe dies auch versucht aber klappt irgendwie dennoch nicht ganz
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

So wird das nichts. Statt Code aus dem Internet zu kopieren, den du nicht verstehst, und dann hier zu fragen, warum der nicht geht, solltest du erst mal das offizielle Python Tutorial durcharbeiten. Es ist nicht übermäßig lang. Das durchzuarbeiten braucht ein bis zwei Nachmittage.

Bonus: global solltest du nicht verwenden. Das macht dein Programm unübersichtlich und fehleranfällig, weil du sehr bald nicht mehr nachvollziehen kannst, wo und wann der globalen Variable Werte zugewiesen werden.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Ergänzend:

global hat hier nichts mit deinem Problem zu tun.
Die Fehlermeldung ist auch recht eindeutig: Du versuchst auf eine Variable zuzugreifen, die nicht deklariert ist.
MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

Sie wurde nirgendswo deklariert ! der fehler kommt von wo anders
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

`final_classification` wird nur definiert wenn die Bedingung bei `if` erfüllt ist. Ist diese Bedingung nie erfüllt, dann gibt es diese Variable nicht.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

MathGenie123 hat geschrieben: Dienstag 31. Mai 2022, 13:28 Sie wurde nirgendswo deklariert ! der fehler kommt von wo anders
Genau das ist ja dein Problem, dass diese Variable nicht definiert wurde. Wie willst du etwas zurückgeben das es nicht gibt?
MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

okay, ja stimmt. Leider macht der nicht das, was ich möchte

Code: Alles auswählen

np.random.seed(11111)
max_k_to_try = 20

def robust_kmeans(data, k, howmany=20):
    final_classification = None
    final_centroids = None
    score = 100000000
    for i in range(howmany):
        point_classification, centroids = konvergenz(data, k, noisy=False)
        total_inner_variance = np.nansum([np.var(data[point_classification == pointclass])
                                          for pointclass in range(k)])
        group_variance = np.var(centroids)
        new_score = group_variance / total_inner_variance
        if(new_score < score):
            final_classification, final_centroids = point_classification, centroids
            score = new_score
            
    return final_classification, final_centroids, score

elbow_values = [robust_kmeans(feature, k)[2] for k in range(2, max_k_to_try+1)]
fig, ax = plt.subplots()
fig.suptitle("elbow plot")
ax.plot(np.arange(2, max_k_to_try+1), elbow_values)
plt.show()



ich will einen elbow plot printen.

Der code stammt aus der Vl
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann ist das ne schlechte Vorlesung. Offensichtlich ist dein score zu niedrig, so dass das if niemals durchlaufen wird. Wie pillmuncher schon schrieb, das zu erkennen ist Python Grundlage. Ohne die wird's nicht gehen.
Benutzeravatar
__blackjack__
User
Beiträge: 13118
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

An der Stelle würde es sich anbieten `score` mit Unendlich zu initialisieren, denn da ist dann jeder `new_score` kleiner, der im ersten Durchlauf vorkommen könnte.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

wie macht man das genau ?
derElch
User
Beiträge: 33
Registriert: Sonntag 25. Februar 2018, 13:14

So:

Code: Alles auswählen

score = float('inf')
Erklärung hier:
https://www.stechies.com/python-infinit ... 20infinity.
Benutzeravatar
__blackjack__
User
Beiträge: 13118
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Oder falls man `math` oder `numpy` bereits importiert hat, ginge auch `math.inf` oder `numpy.inf`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

wenn ich es so mache wird nichts mehr geprinet. Der Fehler liegt irgendwie woanders
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was machst du wie? Kann hier keiner sehen. Also bitte: Code zeigen.
Antworten