用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圖,直觀的看看變換過程。

 

 

 

 

 

 

  

 

 

 

 

 

 

 

  

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM