Python’da Sıfırdan Doğrusal Ayrım Analizi

Giriş: Doğrusal Ayrım Analizi Nedir?

Doğrusal ayrım analizi (Linear Discriminant Analysis – LDA), istatistiksel ve makine öğrenmesi alanlarında yaygın olarak kullanılan bir teknik olup, sınıflandırma problemlerinde özellikle veriler arasındaki ayrımı artırmak için kullanılır. LDA, belirli bir sınıfı temsil eden veri noktalarının öz niteliklerini ve bu sınıflar arasındaki farklılıkları analiz ederek, yeni veri noktalarının hangi sınıfa ait olduğunu belirlemek için doğrusal bir yüzey oluşturur.

LDA, genellikle denetimli öğrenme yöntemleri arasında yer alır. Bununla birlikte, LDA’nın temel amacı yalnızca sınıflandırma yapmak değil; aynı zamanda veriler arasındaki ilişkilerin ve farklılıkların daha iyi anlaşılmasını sağlamaktır. Bu makalede, Python’da sıfırdan doğrusal ayrım analizi uygulaması yaparak konuyu derinlemesine inceleyeceğiz.

Python, veri analizi ve makine öğrenmesi için güçlü kütüphaneler sunar. Bunlar arasında NumPy, Pandas ve scikit-learn yer alır. Ancak, burada LDA’yı sıfırdan koda yazarak, algoritmanın arka planını daha iyi anlamayı hedefliyoruz.

LDA Nasıl Çalışır?

LDA’nın temel prensibi, sınıflar arasındaki ayrımın maksimize edilmesi ve sınıf içi değişkenliğin minimize edilmesi üzerine kuruludur. Bu bağlamda, her bir sınıfın ortalaması ve sınıf içindeki noktalardan elde edilen kovaryans matrisleri hesaplanır. Bu işlemler sonucunda, farklı sınıflar arasındaki mesafe ve benzerlikler belirlenir.

Sınıf ortalamalarını ve genel ortalamayı hesapladıktan sonra, LDA, doğrusal ayırıcıları belirleyen matrisleri oluşturur. Bu matrisler, yüksek boyutlu verilere sahip verilerde, yeni bir doğrusal ayırıcı yüzey oluşturmak için kullanılır. Daha sonra bu yüzey, sınıflar arasında ayrım sağlamak için kullanılır.

Bu işlem sırasında, verilerin belirli bir uzayda nasıl yerleştiği ve hangi noktaların birbirine yakın veya uzak olduğu gibi faktörler de dikkate alınır. Sonuç olarak, LDA, verileri daha iyi sınıflandırmak için karmaşık bir doğrusal model yaratır.

Doğrusal Ayrım Analizini Python’da Sıfırdan Yazmak

Şimdi, Python kullanarak LDA algoritmasını sıfırdan yazmaya başlayalım. İlk olarak, gerekli kütüphaneleri içe aktarmamız gerekiyor. Veri seti olarak iris çiçeği verisini kullanacağız.

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris

İris veri setini yükledikten sonra, veri setini verimli bir şekilde önişlemden geçirmemiz gerekecek. Aşağıdaki kod, iris veri setini alır ve bu verilerle çalışmak için uygun bir biçime dönüştürür.

iris = load_iris()
X = iris.data
y = iris.target

Burada, X değişkeni bağımsız değişkenleri (özellikleri) temsil ederken, y değişkeni sınıf etiketlerini temsil ediyor. Şimdi bu veriler üzerinden LDA uygulamasına geçebiliriz.

LDA Uygulaması İçin Adım Adım Kodlama

Şimdi, LDA algoritmasının temel adımlarını kodlayalım. İlk olarak, sınıf ortalamalarını bulmalıyız. Bunun için her bir sınıf için ayrı ayrı ortalama vektörlerini hesaplayacağız:

def calculate_class_means(X, y):
    classes = np.unique(y)
    means = np.zeros((len(classes), X.shape[1]))
    for cls in classes:
        means[cls] = np.mean(X[y == cls], axis=0)
    return means

class_means = calculate_class_means(X, y)

Şimdi, sınıf içi ve sınıflar arası kovaryans matrislerini hesaplayalım. İlk olarak, sınıf içi kovaryans matrisini hesaplayacağız:

def calculate_within_class_scatter(X, y, class_means):
    S_W = np.zeros((X.shape[1], X.shape[1]))
    for cls, mean in enumerate(class_means):
        class_scatter = np.zeros((X.shape[1], X.shape[1]))
        for row in X[y == cls]:
            row, mean = row.reshape(X.shape[1], 1), mean.reshape(X.shape[1], 1)
            class_scatter += (row - mean).dot((row - mean).T)
        S_W += class_scatter
    return S_W

S_W = calculate_within_class_scatter(X, y, class_means)

Daha sonra, sınıflar arası kovaryans matrisini hesaplayacağız:

def calculate_between_class_scatter(X, y, class_means):
    S_B = np.zeros((X.shape[1], X.shape[1]))
    overall_mean = np.mean(X, axis=0)
    for cls, mean in enumerate(class_means):
        n_cls = X[y == cls].shape[0]
        mean = mean.reshape(X.shape[1], 1)
        overall_mean = overall_mean.reshape(X.shape[1], 1)
        S_B += n_cls * (mean - overall_mean).dot((mean - overall_mean).T)
    return S_B

S_B = calculate_between_class_scatter(X, y, class_means)

Şimdi, bu iki matris kullanılarak en iyi doğrusal ayırıcılar belirlenecektir. Burada, özdeğerler ve özvektörleri hesaplayarak doğrusal ayrım analizi modelimizi oluşturalım:

def lda_model(S_W, S_B):
    eigvals, eigvecs = np.linalg.eig(np.linalg.inv(S_W).dot(S_B))
    sorted_indices = np.argsort(eigvals)[::-1]  
    return eigvecs[:, sorted_indices]

lda_vectors = lda_model(S_W, S_B)

Tahmin Yapma ve Sonuçları Görselleştirme

Şimdi, yukarıdaki kod ile oluşturduğumuz LDA modelini kullanarak yeni verilerin hangi sınıfa ait olduğunu tahmin edeceğiz. Bu adımda, özellikle görselleştirme yaparak sonuçların anlaşılmasını kolaylaştıracağız.

def project_data(X, lda_vectors):
    return X.dot(lda_vectors)

X_lda = project_data(X, lda_vectors)

Veri noktalarını LDA ile projekte ettikten sonra, bu sonuçları görselleştirebiliriz. Aşağıdaki kod ile verileri iki boyutta grafik üzerinde göstereceğiz:

import matplotlib.pyplot as plt

plt.scatter(X_lda[:, 0], X_lda[:, 1], c=y, s=30, cmap='viridis')
plt.xlabel('LD1')
plt.ylabel('LD2')
plt.title('LDA Projeksiyonu')
plt.show()

Burada, her bir renkte farklı bir sınıfı temsil eden veri noktalarını görebiliyoruz. Böylece, LDA’nın ne kadar başarılı bir şekilde veri noktalarını ayırdığını ve sınıf içindeki benzerlikleri gözlemleyebiliriz.

Sonuç: LDA’nın Gücü ve Kullanım Alanları

Doğrusal ayrım analizi, makine öğrenmesinde önemli bir yer tutar ve birçok farklı alan için uygulanabilir. Özellikle, finans, biyomedikal alanlarında ve pazar araştırmalarında, LDA kullanılarak veri sınıflandırılması ve analizi yapılmaktadır. Bu nedenle, LDA’nın pratikteki önemi büyüktür ve veri analizi süreçlerinde güçlü bir araçtır.

Bu makalede, LDA’nın matematiksel altyapısını ve Python ile nasıl sıfırdan uygulanabileceğini inceledik. Matematiksel kavramlarla yazılım geliştirme arasındaki köprüyü kurmak, yazılım geliştiricilerin ve veri bilimcilerin veri setleriyle daha etkili bir şekilde çalışmasını sağlar.

Unutulmamalıdır ki, LDA, sadece doğrusal sınıflama sorunları için en iyi sonuçları sağlar. Verilerin doğrusal olarak ayrılabilir olması gerektiği için, bu yaklaşımda bazı kısıtlamalar bulunmaktadır. Dolayısıyla, LDA’nın kullanımı için verilere dikkatli bir şekilde yaklaşmak ve öncelikle verileri analiz etmek gerekmektedir.

Scroll to Top