Το Gaussian Discriminant Analysis (GDA) είναι ένας αλγόριθμος ταξινόμησης που βασίζεται στις πιθανότητες. Ανήκει στην κατηγορία των generative models, δηλαδή προσπαθεί να περιγράψει πώς δημιουργούνται τα δεδομένα κάθε κατηγορίας.
Το GDA υποθέτει ότι τα δεδομένα κάθε κατηγορίας ακολουθούν μια κανονική (Gaussian) κατανομή.
Για παράδειγμα, αν μετράμε το pH του εδάφους:
Οι τιμές αυτές δεν είναι σταθερές, αλλά σχηματίζουν gaussian κατανομές. Κάθε κατηγορία έχει τη δική της κατανομή.
Για κάθε κατηγορία, το GDA υπολογίζει:
Με αυτές τις πληροφορίες μπορεί να εκτιμήσει πόσο πιθανό είναι ένα νέο δείγμα να ανήκει σε κάθε κατηγορία.
f(x) = (1 / √(2πσ²)) * e^(-(x - μ)² / (2σ²))
Η παραπάνω συνάρτηση περιγράφει την κανονική κατανομή.
| GDA | Logistic Regression |
|---|---|
| Μοντελοποιεί τα δεδομένα | Μοντελοποιεί το όριο απόφασης |
| Υποθέτει Gaussian κατανομές | Δεν κάνει τέτοια υπόθεση |
| Generative model | Discriminative model |
Για να κατανοήσουμε πώς λειτουργεί το Gaussian Discriminant Analysis (GDA), θα δημιουργήσουμε ένα απλό dataset από τον χώρο της γεωλογίας.
Θα χρησιμοποιήσουμε μία βασική παράμετρο: το pH του εδάφους.
| Κατηγορία | Περιγραφή | Τυπικές τιμές pH |
|---|---|---|
| Όξινο (Acidic) | Έδαφος με χαμηλό pH | ≈ 4.5 – 6 |
| Ουδέτερο (Neutral) | Ισορροπημένο pH | ≈ 6.5 – 7.5 |
| Αλκαλικό (Alkaline) | Έδαφος με υψηλό pH | ≈ 8 – 9.5 |
Αντί να βάλουμε τυχαίες τιμές, δημιουργήσαμε δεδομένα που ακολουθούν Gaussian κατανομές.
Στο παρακάτω γράφημα βλέπουμε τα δεδομένα μας:
Παρατήρησε ότι τα δεδομένα σχηματίζουν "ομάδες" γύρω από συγκεκριμένες τιμές. Αυτό ακριβώς εκμεταλλεύεται το GDA.
Το πρώτο βήμα στο Gaussian Discriminant Analysis είναι να υπολογίσουμε τον μέσο όρο (mean) για κάθε κατηγορία.
Ο μέσος όρος μας δείχνει πού "συγκεντρώνονται" τα δεδομένα κάθε κατηγορίας.
Το GDA υποθέτει ότι κάθε κατηγορία ακολουθεί μια Gaussian κατανομή. Ο μέσος όρος είναι το κέντρο αυτής της κατανομής.
μ = (x₁ + x₂ + ... + xₙ) / n
Η διασπορά μας δείχνει πόσο "απλωμένα" είναι τα δεδομένα γύρω από τον μέσο όρο.
σ² = (1/n) * Σ (xᵢ - μ)²
Το GDA χρησιμοποιεί τη διασπορά για να κατασκευάσει την Gaussian κατανομή κάθε κατηγορίας.
Χωρίς τη διασπορά, δεν μπορούμε να υπολογίσουμε σωστά τις πιθανότητες.
Για κάθε κατηγορία εδάφους υπολογίζουμε:
Αφού έχουμε υπολογίσει τον μέσο όρο (μ) και τη διασπορά (σ²) για κάθε κατηγορία, μπορούμε πλέον να εκτιμήσουμε σε ποια κατηγορία ανήκει ένα νέο δείγμα.
Για μια νέα τιμή pH (π.χ. x = 6.5), το GDA κάνει τα εξής:
Υπολογίζουμε:
f(x) = (1 / √(2πσ²)) * e^(-(x - μ)² / (2σ²))
Κάθε κατηγορία έχει μια αρχική πιθανότητα:
Mean pH values: Acidic: 5.158 Neutral: 7.007 Alkaline: 8.832 Variance values: Acidic: 0.131 Neutral: 0.081 Alkaline: 0.291 Likelihoods P(x | class): Acidic: 0.00113 Neutral: 0.28748 Alkaline: 0.00006
Αφού έχουμε εκπαιδεύσει το μοντέλο και μπορούμε να υπολογίζουμε πιθανότητες, μπορούμε τώρα να δούμε πώς το GDA χωρίζει τις κατηγορίες.
Το decision boundary είναι το σημείο όπου δύο κατηγορίες έχουν την ίδια πιθανότητα.
Για παράδειγμα:
P(x | Acidic) = P(x | Neutral)
Σε αυτό το σημείο, το μοντέλο "δεν είναι σίγουρο" και αλλάζει κατηγορία.
Μπορούμε να σχεδιάσουμε τις κατανομές κάθε κατηγορίας για να δούμε πώς επικαλύπτονται.
Μέχρι τώρα υπολογίζαμε μόνο την πιθανότητα των δεδομένων γνωρίζοντας την κατηγορία:
P(x | class)
Όμως το πραγματικό ζητούμενο είναι:
P(class | x)
Δηλαδή: ποια είναι η πιθανότητα ένα δείγμα να ανήκει σε μια κατηγορία.
Για να το υπολογίσουμε, χρησιμοποιούμε τον κανόνα του Bayes:
P(class | x) = (P(x | class) * P(class)) / P(x)
Είναι η αρχική πιθανότητα (prior) μιας κατηγορίας.
Τελική τιμή:
0.5 * 0.6 = 0.3
# Gaussian Discriminant Analysis - Classification Example
import math
# Mean values
means = {
"Acidic": 5.158,
"Neutral": 7.007,
"Alkaline": 8.832
}
# Variance values
variances = {
"Acidic": 0.131,
"Neutral": 0.081,
"Alkaline": 0.291
}
# Prior probabilities (π.χ.για απλοποίηση ολες οι κατηγορίες εχουν ίδια πιθανότητα)
priors = {
"Acidic": 1/3,
"Neutral": 1/3,
"Alkaline": 1/3
}
# Gaussian likelihood function
def gaussian_likelihood(x, mean, var):
return (1 / math.sqrt(2 * math.pi * var)) * math.exp(-(x - mean)**2 / (2 * var))
# Κύρια συνάρτηση ταξινόμησης
def classify_ph(x):
posteriors = {}
for cls in means:
likelihood = gaussian_likelihood(x, means[cls], variances[cls])
posterior = likelihood * priors[cls] # P(class|x) ~ P(x|class) * P(class)
posteriors[cls] = posterior
# Επιλογή κατηγορίας με τη μεγαλύτερη πιθανότητα
predicted_class = max(posteriors, key=posteriors.get)
return predicted_class, posteriors
# Ζητάμε νέα τιμή pH
new_ph = float(input("Δώσε την τιμή pH του εδάφους: "))
predicted_class, posteriors = classify_ph(new_ph)
print(f"\nΗ κατηγορία του εδάφους είναι: {predicted_class}")
print("Πιθανότητες ανά κατηγορία:")
for cls, prob in posteriors.items():
print(f"{cls}: {prob:.5f}")
Στο παράδειγμα χρησιμοποιήσαμε:
priors = {
"Acidic": 1/3,
"Neutral": 1/3,
"Alkaline": 1/3
}
Αυτό σημαίνει ότι:
def gaussian_likelihood(x, mean, var):
return (1 / math.sqrt(2 * math.pi * var)) * \
math.exp(-(x - mean)**2 / (2 * var))
Αυτή η συνάρτηση υπολογίζει την πιθανότητα μιας τιμής pH να ανήκει σε μια κατηγορία.
posterior = likelihood * prior
Για κάθε κατηγορία:
def classify_ph(x):
posteriors = {}
for cls in means:
likelihood = gaussian_likelihood(x, means[cls], variances[cls])
posterior = likelihood * priors[cls]
posteriors[cls] = posterior
predicted_class = max(posteriors, key=posteriors.get)
return predicted_class, posteriors
Αν έχουμε πραγματικά δεδομένα:
priors = {
"Acidic": 0.5,
"Neutral": 0.3,
"Alkaline": 0.2
}
Τότε το μοντέλο λαμβάνει υπόψη ότι κάποιες κατηγορίες είναι πιο συχνές.
Stanford Online. Stanford CS229: Machine Learning - Perceptron & Generalized Linear Model | Lecture 4 (Autumn 2018) [Video]. YouTube. https://youtu.be/iZTeva0WSTQ?list=PLoROMvodv4rMiGQp3WXShtMGgzqpfVfbU