Ana bileşen (PC) dönüşümü (Karhunen-Loeve dönüşümü olarak da bilinir), spektral olarak ilişkili görüntü verilerini alıp ilişkisiz veriler döndüren bir spektral rotasyondur. PC dönüşümü, bu işlemi öz analiz aracılığıyla giriş bant korelasyon matrisini köşegenleştirerek gerçekleştirir. Bunu Earth Engine'da yapmak için bir dizi görüntüde bir kovaryans azaltıcı kullanın ve elde edilen kovaryans dizisinde eigen()
komutunu kullanın.
Bu amaçla aşağıdaki işlevi kullanabilirsiniz (Uygulamada bu işlevin bir örneği, Code Editor komut dosyası ve Colab not defteri olarak kullanılabilir).
var getPrincipalComponents = function(centered, scale, region) { // Collapse the bands of the image into a 1D array per pixel. var arrays = centered.toArray(); // Compute the covariance of the bands within the region. var covar = arrays.reduceRegion({ reducer: ee.Reducer.centeredCovariance(), geometry: region, scale: scale, maxPixels: 1e9 }); // Get the 'array' covariance result and cast to an array. // This represents the band-to-band covariance within the region. var covarArray = ee.Array(covar.get('array')); // Perform an eigen analysis and slice apart the values and vectors. var eigens = covarArray.eigen(); // This is a P-length vector of Eigenvalues. var eigenValues = eigens.slice(1, 0, 1); // This is a PxP matrix with eigenvectors in rows. var eigenVectors = eigens.slice(1, 1); // Convert the array image to 2D arrays for matrix computations. var arrayImage = arrays.toArray(1); // Left multiply the image array by the matrix of eigenvectors. var principalComponents = ee.Image(eigenVectors).matrixMultiply(arrayImage); // Turn the square roots of the Eigenvalues into a P-band image. var sdImage = ee.Image(eigenValues.sqrt()) .arrayProject([0]).arrayFlatten([getNewBandNames('sd')]); // Turn the PCs into a P-band image, normalized by SD. return principalComponents // Throw out an an unneeded dimension, [[]] -> []. .arrayProject([0]) // Make the one band array image a multi-band image, [] -> image. .arrayFlatten([getNewBandNames('pc')]) // Normalize the PCs by their SDs. .divide(sdImage); };
import ee import geemap.core as geemap
def get_principal_components(centered, scale, region): # Collapse bands into 1D array arrays = centered.toArray() # Compute the covariance of the bands within the region. covar = arrays.reduceRegion( reducer=ee.Reducer.centeredCovariance(), geometry=region, scale=scale, maxPixels=1e9, ) # Get the 'array' covariance result and cast to an array. # This represents the band-to-band covariance within the region. covar_array = ee.Array(covar.get('array')) # Perform an eigen analysis and slice apart the values and vectors. eigens = covar_array.eigen() # This is a P-length vector of Eigenvalues. eigen_values = eigens.slice(1, 0, 1) # This is a PxP matrix with eigenvectors in rows. eigen_vectors = eigens.slice(1, 1) # Convert the array image to 2D arrays for matrix computations. array_image = arrays.toArray(1) # Left multiply the image array by the matrix of eigenvectors. principal_components = ee.Image(eigen_vectors).matrixMultiply(array_image) # Turn the square roots of the Eigenvalues into a P-band image. sd_image = ( ee.Image(eigen_values.sqrt()) .arrayProject([0]) .arrayFlatten([get_new_band_names('sd')]) ) # Turn the PCs into a P-band image, normalized by SD. return ( # Throw out an an unneeded dimension, [[]] -> []. principal_components.arrayProject([0]) # Make the one band array image a multi-band image, [] -> image. .arrayFlatten([get_new_band_names('pc')]) # Normalize the PCs by their SDs. .divide(sd_image) )
İşleve girilen giriş, ortalaması sıfır olan bir resim, bir ölçek ve analizin yapılacağı bir bölgedir. Giriş görüntüsünün önce 1 boyutlu dizi görüntüsüne dönüştürülmesi ve ardından ee.Reducer.centeredCovariance()
kullanılarak azaltılması gerektiğini unutmayın. Bu azaltma işleminin döndürdüğü dizi, girişin simetrik varyans-kovaryans matrisidir.
Kovaryans matrisinin öz değerlerini ve öz vektörlerini almak için eigen()
komutunu kullanın. eigen()
tarafından döndürülen matris, 1 ekseninin 0. konumundaki kendi değerini içerir. Daha önceki işlevde gösterildiği gibi, öz değerleri ve öz vektörleri ayırmak için slice()
kullanın. eigenVectors matrisinin 0 eksenindeki her öğe bir özvektördür. Başlıklı şapka (TC) örneğinde olduğu gibi, arrayImage
değerini matris çarpımıyla öz vektörlerle çarparak dönüşümü gerçekleştirin.
Bu örnekte, her özvektör çarpımı bir PC ile sonuçlanır.