1. 程式人生 > 其它 >光譜資訊散度與光譜角的匹配演算法(SID_SA)

光譜資訊散度與光譜角的匹配演算法(SID_SA)

在衛星遙感技術上,對地物的識別和分類用到了SID_SA演算法,即比較被測地物的光譜曲線與已有光譜資料庫中光譜曲線的相似度以判斷地物的類別。

這種技術在判斷依賴服務是否互相影響時?即流量、吞吐量走勢曲線是否相似上也可用。

光譜角度製圖(Spectral angle mapping, SAM )

基於光譜曲線整體相似性的一種演算法,把影象中的每個像元的光譜視為一個高維向量,通過計算兩向量間的夾角來度量光譜間的相似性,夾角越小,兩光譜越相似,屬於同類物的可能性越大,因而可根據光譜角的大小來辨別未知資料的類別。

分類時,通過計算未知資料與已知資料間的光譜角,並把未知資料的類別歸為最小光譜角對應的類別中。

假設,\(x\) 和 \(y\) 分別代表目標光譜與測試光譜,長度都為 \(n_1\)。
SAM用來計算兩個陣列之間的相似性,其計算結果可看作兩陣列之間餘弦角。

其中

  • 為2 條光譜間的光譜夾角值。

  • 分別為 2 條光譜向量的 模

用go語言實現的程式碼如下:

// 光譜角製圖
func SAM(src, dst []float64) float64 {
	s := floats.Dot(src, dst)
	t := floats.Norm(src, 2) * floats.Norm(dst, 2)
	return math.Acos(s / t)
}

光譜資訊散度(spectral information divergence,SID)

光譜資訊散度是一種基於資訊理論衡量兩條光譜之間差異的波譜分類方法,將光譜向量作為隨機變數,基於概率統計理論分析兩個隨機向量的相似度,即其中,光譜資訊散度的值越小,說明兩組光譜越相似。

假設 \(x\) 和 \(y\) 分別代表目標光譜與測試光譜,長度都為 \(n_1\)。

其中

同理

用go語言實現的程式碼:


// 光譜資訊散度
func SID(src, dst []float64) float64 {
	lensrc := len(src)
	lendst := len(dst)
	if lensrc != lendst {
		panic(fmt.Sprintf("兩個陣列的長度不一樣!%d,%d", lensrc, lendst))
	}

	srcf := []float64{}
	dstf := []float64{}
	sumsrc, sumdst := 0.0, 0.0
	for i := 0; i < lensrc; i++ {
		sumsrc += src[i]
		sumdst += dst[i]
		srcf = append(srcf, 0.0)
		dstf = append(dstf, 0.0)
	}
	log.Printf("sum %f %f", sumsrc, sumdst)

	for i := 0; i < lensrc; i++ {
		srcf[i] = src[i] / sumsrc
		dstf[i] = dst[i] / sumdst
	}

	sid := 0.0
	for i := 0; i < lensrc; i++ {
		if dstf[i] != 0.0 && srcf[i] != 0.0 { // 排除分母出現 0 的情況 ,0 是沒資料,不參與比較
			sid += srcf[i]*math.Log10(srcf[i]/dstf[i]) + dstf[i]*math.Log10(dstf[i]/srcf[i])
		}

	}
	return sid
}

SID_SA 結合法

  • SAM的原理是將目標光譜與測試光譜投影到空間中,計算其間的夾角,其值越小代表相似度越高。
  • SID是一種基於資訊理論理念,通過計算資訊熵來判斷光譜相似性的方法。

而2種方法結合的 SID_SA 結合法同時考慮到 SAM 和 SID的優點,從光譜的形狀以及反射能量差異2方面入手,能有效計算光譜間的相似度。

計算公式


值越小,證明光譜相似度越高,反之則說明光譜間相似度低。

用go實現的程式碼:

import (
	"fmt"
	"log"
	"math"
	"gonum.org/v1/gonum/floats"
)

// 組合使用 SID 和 SAM
func SidSa(src, dst []float64) float64 {
	return SID(src, dst) * math.Sin(SAM(src, dst))
}

參考: