用R語言實現歐式距離的兩種標準化
阿新 • • 發佈:2022-03-21
第一種標準化轉換公式:x*=D-1(x-µ),求出樣本x的期望和其協方差矩陣的對角矩陣的逆即可。
第二種標準化轉換公式:x*=∑-1/2(x-µ),其中∑-1/2=TΛT′,T為x的協方差矩陣的特徵向量矩陣,Λ為x的協方差矩陣的特徵值構成的對角矩陣。
第一種轉換能夠消除各變數單位的或方差差異的影響,但不能消除變數之間的相關性的影響。
第二種轉換則可以做到消除變數之間的相關性的影響。
下面是R語言程式碼:
library(MASS) Sigma=matrix(c(2,2.2,2.2,7),2)#建立一個2行的協方差矩陣 mu=c(1,1)#期望 set.seed(8)#設定一個隨機種子 x=mvrnorm(n=100,mu,Sigma)#隨機生成100個隨機樣本服從期望為mu,協方差為Sigma的二元正態分佈 s=cov(x)#計算X的協方差矩陣 plot(x,ylim=c(-10,10),xlim=c(-10,10),pch=20,ylab="y",xlab="x")#對隨機樣本x的點畫圖,橫縱座標數值範圍為-10到10,畫圖符號選20號符號
#diag函式可以用來提取矩陣的對角元素,並將它儲存成向量的格式,然後繼續用diag函式來生成給定對角元素的對角陣 D=diag(sqrt(diag(s)))#計算對角矩陣D meanx=colMeans(x)#按列來求X的均值 #R語言是預設byrow=False,即資料按列輸入,byrow=True則是按行輸入,rep函式用於重複輸出 mean=matrix(rep(meanx,100),nrow=100,byrow=T)#將meanx按行輸入100次生成一個100*2的矩陣 x1=t(solve(D)%*%t(x-mean))#標準化轉換,D是2*2矩陣,X-mean是100*2矩陣,所以要轉置X-mean進行運算,最後再轉置回來,%*%是左乘的意思 plot(x1,ylim=c(-10,10),xlim=c(-10,10),pch=20,ylab="y",xlab="x") cov(x1)#x1的協方差陣
完成第一種標準轉換後,確實消除了消除x和y單位的或方差差異的影響,但顯然沒有消除x對y或y對x的相關性的影響。圖中直觀看到隨著x增加y呈上升趨勢,協方差陣cov(x,y),cov(y,x)不為0。下面進行第二種標準轉換。
s.eigen=eigen(s)#計算s的特徵值和特徵向量 s.eigen$vectors#輸出s的特徵向量 a=s.eigen$values#s的特徵值賦值給a A=diag(a)#計算對角矩陣 T=s.eigen$vectors#S的單位正交特徵向量定義了一個新的座標系 x2=t(t(T)%*%t(x))#將隨機樣本X投影到新的座標系T上 plot(x2,ylim=c(-10,10),xlim=c(-10,10),pch=20,ylab="y",xlab="x") round(cov(x2),4)#求x2協方差,保留四位小數
在x落在由特徵向量定義的座標軸上,可以看到變數間的相關性已經被消除了。相當於將原先的座標軸旋轉了一下。下面就繼續消除單位的或方差差異的影響
s1=T%*%sqrt(A)%*%t(T)#求A的平方根矩陣 x3=t(solve(s1)%*%t(x-mean))#標準化轉換 plot(x3,ylim=c(-10,10),xlim=c(-10,10),pch=20,ylab="y",xlab="x") round(cov(x3),4)#求x3協方差,保留四位小數
最後再輸出所有的plot圖,直觀的看看變換過程。