Garfield
YZF Admin
İşin amacına göre NumPy dizisini ya min-maks ölçekleme ile belirli bir aralığa, ya da vektör normuna bölerek birim uzunluğa normalize edebilirsin. En yaygın yöntem olan min-maks normalizasyonunda her değerden dizinin en küçüğü çıkarılır ve sonuç, en büyük ile en küçük arasındaki farka bölünür. Böylece değerler genellikle 0 ile 1 arasına taşınır.
Bir dizinin değerlerini 0–1 aralığına taşımak için şu formül kullanılır:
normalize edilmiş değer = (değer - minimum) / (maksimum - minimum)
Örneğin
Beklenen çıktı yaklaşık olarak şöyledir:
Buradaki
Değerleri 0–1 yerine
Bu örneğin çıktısı
“Normalize etmek” tek bir işlemi ifade etmez. Kullanacağın yöntem, verinin hangi özelliğini korumak istediğine bağlıdır.
Tablodaki yöntemler birbirinin yerine her zaman kullanılamaz. Örneğin görüntü veya özellik değerlerini 0–1 aralığına almak istiyorsan min-maks yöntemi uygundur. Bir vektörün yönünü karşılaştırmak istiyorsan normuna bölmek daha anlamlıdır. Veriyi ortalaması 0, standart sapması 1 olacak biçimde dönüştürmek istiyorsan standartlaştırma kullanılır.
Bir vektörü Öklid normuna bölerek uzunluğunu 1 yapabilirsin:
Çıktı yaklaşık olarak
Bir matrisin tamamını tek bir değer aralığına çekmek ile her sütunu ayrı ayrı normalize etmek farklı sonuçlar verir. Satır veya sütun bazında işlem yapacaksan
Burada her sütunun minimumu 0, maksimumu 1 olur. Makine öğrenmesi gibi veri işleme akışlarında normalizasyon sınırlarını yalnızca eğitim verisinden hesaplayıp doğrulama veya test verisine de aynı minimum ve maksimum değerlerini uygulamak gerekir. Aksi hâlde test verisinin bilgisi dönüşüm hesabına karışabilir ve sonuç olduğundan daha iyimser görünebilir.
Min-maks normalizasyonu
Bir dizinin değerlerini 0–1 aralığına taşımak için şu formül kullanılır:
normalize edilmiş değer = (değer - minimum) / (maksimum - minimum)
Örneğin
[1, 3, 5] dizisinde minimum 1, maksimum 5 olduğu için sonuç [0.0, 0.5, 1.0] olur. NumPy ile çalışan en küçük örnek şöyledir:
Python:
import numpy as np
dizi = np.array([1, 3, 5], dtype=float)
minimum = dizi.min()
maksimum = dizi.max()
if maksimum == minimum:
normalize = np.zeros_like(dizi)
else:
normalize = (dizi - minimum) / (maksimum - minimum)
print(normalize)
Beklenen çıktı yaklaşık olarak şöyledir:
Python:
[0. 0.5 1. ]
Buradaki
dtype=float önemlidir; tamsayılarla çalışmak bazı işlemlerde ondalık sonuçların beklenmedik biçimde kaybolmasına yol açabilir. Dizideki bütün değerler aynıysa maksimum - minimum sıfır olur. Bu nedenle örnekte önce bu durum kontrol edilmiştir; tüm değerleri 0 kabul etmek yalnızca uygulamanın bu durumu böyle yorumlaması uygunsa kullanılmalıdır.Başka bir aralığa dönüştürme
Değerleri 0–1 yerine
a ile b arasına taşımak için önce 0–1 normalizasyonu yapılır, ardından hedef aralığa ölçeklenir:
Python:
import numpy as np
dizi = np.array([10, 20, 30], dtype=float)
a = -1
b = 1
minimum = dizi.min()
maksimum = dizi.max()
if maksimum == minimum:
normalize = np.full_like(dizi, (a + b) / 2)
else:
normalize = a + (dizi - minimum) * (b - a) / (maksimum - minimum)
print(normalize)
Bu örneğin çıktısı
[-1. 0. 1.] olur. Böylece en küçük değer a değerine, en büyük değer ise b değerine karşılık gelir.Hangi normalizasyon kullanılmalı?
“Normalize etmek” tek bir işlemi ifade etmez. Kullanacağın yöntem, verinin hangi özelliğini korumak istediğine bağlıdır.
| Yöntem | Formül veya işlem | Uygun kullanım |
|---|---|---|
| Min-maks | (x - min) / (max - min) | Değerleri belirli bir aralığa taşımak |
| Birim vektör | Dizi / norm(dizi) | Yönü koruyup uzunluğu 1 yapmak |
| Standartlaştırma | (x - ortalama) / standart sapma | Ortalama 0 ve standart sapma 1 ölçeğiyle çalışmak |
Bir vektörü birim uzunluğa normalize etme
Bir vektörü Öklid normuna bölerek uzunluğunu 1 yapabilirsin:
Python:
import numpy as np
vektor = np.array([3, 4], dtype=float)
norm = np.linalg.norm(vektor)
if norm == 0:
normalize = np.zeros_like(vektor)
else:
normalize = vektor / norm
print(normalize)
print(np.linalg.norm(normalize))
Çıktı yaklaşık olarak
[0.6 0.8] ve 1.0 olur. Bu işlem değerleri 0–1 aralığına sokmayı garanti etmez; örneğin negatif bileşenler yine negatif kalabilir. Sağladığı şey, sıfır olmayan vektörün uzunluğunu 1 yapmaktır.İki boyutlu dizilerde eksen seçimi
Bir matrisin tamamını tek bir değer aralığına çekmek ile her sütunu ayrı ayrı normalize etmek farklı sonuçlar verir. Satır veya sütun bazında işlem yapacaksan
axis değerini açıkça belirtmelisin:
Python:
import numpy as np
matris = np.array([
[1, 10],
[3, 20],
[5, 30]
], dtype=float)
sutun_min = matris.min(axis=0)
sutun_max = matris.max(axis=0)
sutun_normalize = (matris - sutun_min) / (sutun_max - sutun_min)
print(sutun_normalize)
Burada her sütunun minimumu 0, maksimumu 1 olur. Makine öğrenmesi gibi veri işleme akışlarında normalizasyon sınırlarını yalnızca eğitim verisinden hesaplayıp doğrulama veya test verisine de aynı minimum ve maksimum değerlerini uygulamak gerekir. Aksi hâlde test verisinin bilgisi dönüşüm hesabına karışabilir ve sonuç olduğundan daha iyimser görünebilir.