Analisis Eigen

Transformasi komponen utama (PC) (juga dikenal sebagai transformasi Karhunen-Loeve) adalah rotasi spektral yang mengambil data gambar yang berkorelasi secara spektral dan menghasilkan data yang tidak berkorelasi. Transformasi PC melakukannya dengan mendiagonalkan matriks korelasi band input melalui analisis Eigen. Untuk melakukannya di Earth Engine, gunakan pengurangan kovariansi pada gambar array dan perintah eigen() pada array kovariansi yang dihasilkan. Pertimbangkan fungsi berikut untuk tujuan tersebut (contohnya dalam aplikasi tersedia sebagai skrip Code Editor dan notebook Colab).

Editor Kode (JavaScript)

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);
};

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

import ee
import geemap.core as geemap

Colab (Python)

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)
  )

Input ke fungsi adalah gambar mean nol, skala, dan region tempat analisis akan dilakukan. Perhatikan bahwa gambar input harus dikonversi terlebih dahulu menjadi gambar array 1-D, lalu dikurangi menggunakan ee.Reducer.centeredCovariance(). Array yang ditampilkan oleh pengurangan ini adalah matriks varians-kovarian simetris dari input. Gunakan perintah eigen() untuk mendapatkan nilai eigen dan vektor eigen dari matriks kovarians. Matriks yang ditampilkan oleh eigen() berisi nilai eigen di posisi ke-0 sumbu 1. Seperti yang ditunjukkan dalam fungsi sebelumnya, gunakan slice() untuk memisahkan nilai eigen dan vektor eigen. Setiap elemen di sepanjang sumbu 0 matriks eigenVectors adalah eigenvector. Seperti dalam contoh tasseled cap (TC), lakukan transformasi dengan matriks yang mengalikan arrayImage dengan eigenvektor. Dalam contoh ini, setiap perkalian eigenvector menghasilkan PC.