Sıradaki

Sütunları merkezle

Zorluk: Kolay

numpy

Bir veri matrisinin sütunlarını merkezlemek (centering), her sütundan o sütunun ortalamasını çıkarmaktır. Sonuçta her sütunun ortalaması 00 olur.

Bunu yayınlama (broadcasting) ile yaparsın. NumPy, şekilleri (shape) farklı iki diziyi (array) birlikte işler. Küçük diziyi elle çoğaltmana gerek kalmaz.

center_columns(X) fonksiyonunu yaz. X, shape’i (n, d) olan bir array’dir:

  • Her satırı bir örnektir (sample).
  • Her sütunu bir özniteliktir (feature).

Hesap iki adımdır:

  1. Her sütunun ortalamasını hesapla.
  2. Ortalamayı o sütunun her elemanından çıkar.

Formülü şudur:

X~ij=Xij−μj,μj=1N∑k=1NXkj\tilde{X}_{ij} = X_{ij} - \mu_j, \qquad \mu_j = \frac{1}{N}\sum_{k=1}^{N} X_{kj}

Burada μj\mu_j, jj. özniteliğin NN örnek üzerindeki ortalamasıdır. Her eleman, kendi sütununun ortalamasından uzaklığına dönüşür.

Örneğin [[1, 4], [3, 8]] için sütun ortalamaları 22 ve 66 olur. Sonuç [[-1, -2], [1, 2]]’dir. X ile aynı (n, d) shape’inde yeni bir NumPy array’i döndür.

Örnekler

Girdi: X = [[1.0, 2.0, 3.0], [4.0, 6.0, 9.0]]
Çıktı: array([[-1.5, -2. , -3. ], [ 1.5, 2. , 3. ]])

Girdi: X = [[5.0, 1.0], [5.0, 3.0], [5.0, 2.0]]
Çıktı: array([[ 0., -1.], [ 0., 1.], [ 0., 0.]])

Girdi: X = [[-2.0, 4.0, 1.0], [3.0, -2.0, 2.0], [-4.0, 1.0, 9.0]]
Çıktı: array([[-1., 3., -3.], [ 4., -3., -2.], [-3., 0., 5.]])

İpucu 1

Önce sütun başına bir ortalama içeren, (d,) shape’inde bir array hesapla. NumPy’ın ortalama fonksiyonu, hangi eksen (axis) boyunca ortalama alacağını bir argüman olarak ister. Sütun ortalamaları için satırlar boyunca, yani axis 0 boyunca ortalama al.

İpucu 2

Ortalamaları elle çoğaltmana gerek yok. X’in shape’i (n, d), ortalamaların shape’i (d,)’dir. Broadcasting iki shape’i sağdan sola hizalar:

  • Boyutlar eşitse olduğu gibi kalır.
  • Biri 1 ya da eksikse diğerinin boyutuna uzatılır.

(d,) shape’i (1, d) gibi okunur ve n satırın hepsine uygulanır.

İpucu 3

İki array’in shape’leri bu kurala uyduğunda - işlemi broadcasting’i kendisi yapar. Ortalamaları X’ten çıkarmak yeter.

Gereksinimler

  • X, (n, d) shape’inde bir float array’idir. En az bir satır ve bir sütun içerir.
  • Dönüş değeri (n, d) shape’inde yeni bir NumPy array’i: sütun ortalamalarının (d,) vektörü ya da bir liste değil.
  • Sütun ortalamasını çıkar: satırların ya da bütün matrisin ortalamasını değil. Kare bir matriste (n = d) yanlış eksen (axis) hata vermez. Yalnızca yanlış sonuç üretir.
  • Tek satırlı bir matriste (n = 1) her sütunun ortalaması elemanın kendisidir. Sonuç sıfırlardan oluşur.
  • Sütunlar üzerinde döngü kullanma: broadcasting yeter.
  • X’i değiştirme. Fonksiyon bittiğinde çağıran kodun array’i aynı kalır.

Broadcasting kuralı: her boyut çifti ya eşit olmalı ya da birinde 1 olmalı. Kural iki adımda uygulanır:

  1. Kısa shape’in başına, eksik boyutlar için 1 ekle.
  2. Shape’leri sondan başlayarak boyut boyut karşılaştır.

Uzunluğu 1 olan (ya da eksik olan) bir boyut, diğer array’in boyutuna uzatılmış gibi davranır. Veri gerçekte kopyalanmaz.

İki örnek:

Shape’lerKarşılaştırmaSonuç
(3, 2) ve (2,)İkincisi (1, 2) olarak okunur ve üç satırın hepsine uygulanır.(3, 2)
(3, 2) ve (3,)Sondaki boyutlar 2 ve 3 olduğu için uyuşmaz.Hata

Feature’ların ortalamalarını sıfıra çekmek, veriyi modele hazırlamanın yaygın bir ilk adımıdır.

Feature’ların ölçekleri çok farklıysa öğrenme zorlaşır. Örneğin biri onlarla, öteki on binlerle ölçülür. Bunu doğrusal regresyon dersinde öznitelik ölçekleme (feature scaling) ile birlikte göreceksin.

Sütunlar üzerinde bir döngü de doğru sonucu verir. Döngüde her sütunun ortalamasını hesaplayıp o sütundan çıkarırsın. Broadcasting aynı işi tek bir ifadeyle yapar:

  • Daha kısadır.
  • Döngüyü Python yerine NumPy’ın içinde çalıştırır.

Aynı kural sonraki derslerde de işine yarar. Bir katmanın (layer) çıktısına sapma (bias) eklerken aynı bias vektörü her satıra broadcasting ile eklenir.

Daha fazlası için NumPy hızlı başlangıç dersine bak.

Sütun ortalamalarını axis=0 ile al ve X’ten çıkar. Broadcasting, (d,) shape’indeki ortalamaları her satıra uygular:

import numpy as npdef center_columns(X: np.ndarray) -> np.ndarray:    return X - X.mean(axis=0)

Sık yapılan hata, axis’i yanlış seçmektir. X.mean(axis=1) satır ortalamalarını verir ve shape’i (n,) olur. Sonuç n ile d’ye bağlıdır:

  • n ile d farklıysa çıkarma broadcasting hatası verir.
  • Kare bir matriste (n, n) ile (n,) uyuşur. Kod hata vermeden yanlış sayılar döndürür. Her sütundan, o sütunla ilgisi olmayan bir satır ortalamasını çıkarır.

X.mean() de bütün matrisin tek bir ortalamasını verir. Sütunların ortalamalarını sıfıra getirmez.

Bu problemde bir sorun mu var?

solution.py
import numpy as npdef center_columns(X: np.ndarray) -> np.ndarray:    """Her sütundan o sütunun ortalamasını çıkarır; şekli girdiyle aynı, (n, d) olan bir dizi döndürür."""    # Kodunu buraya yaz.    return np.zeros(X.shape)

İçindekiler

Geri bildirim

Tür