1. 程式人生 > 其它 >用R語言實現歐式距離的兩種標準化

用R語言實現歐式距離的兩種標準化

第一種標準化轉換公式:x*=D-1(x-µ),求出樣本x的期望和其協方差矩陣的對角矩陣的逆即可。

第二種標準化轉換公式:x*=∑-1/2(x-µ),其中-1/2=TΛT′Tx的協方差矩陣的特徵向量矩陣,Λ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圖,直觀的看看變換過程。