මෙම ත්රෙඩ් එකේ ජේ. ඩී. ලෝන්ග්ගේ විශිෂ්ට පෝස්ට් එකෙන් පසුව, මම සරල උදාහරණයක් සෙව්වෙමි, සහ පීසීඒ නිෂ්පාදනය කිරීමට අවශ්ය ආර් කේතය නැවත මුල් දත්ත වෙත යන්න. එය මට පළමු වරට ජ්යාමිතික බුද්ධියක් ලබා දුන් අතර, මට ලැබුණු දේ බෙදා ගැනීමට මට අවශ්යය. දත්ත කට්ටලය සහ කේතය කෙලින්ම පිටපත් කර R ආකාරයෙන් ගිතුබ් වෙත ඇලවිය හැකිය.
මම මෙහි අර්ධ සන්නායක මත මාර්ගගතව සොයාගත් දත්ත කට්ටලයක් භාවිතා කළ අතර , කුමන්ත්රණය පහසු කිරීම සඳහා මා එය “පරමාණුක ක්රමාංකය” සහ “ද්රවාංකය” යන මානයන් දෙකකට සීමා කළෙමි.
අවවාදයක් ලෙස අදහස ගණනය කිරීමේ ක්රියාවලිය තනිකරම නිදර්ශනය කරයි: PCA භාවිතා කරනුයේ විචල්යයන් දෙකකට වඩා ව්යුත්පන්න වූ ප්රධාන සංරචක කිහිපයකට අඩු කිරීමට හෝ බහු ලක්ෂණ වලදී සහසම්බන්ධතාව හඳුනා ගැනීමට ය. එබැවින් විචල්යයන් දෙකක දී එය එතරම් යෙදුමක් සොයා නොගනු ඇති අතර, ඇමීබා විසින් පෙන්වා දී ඇති පරිදි සහසම්බන්ධිත අනුකෘතියේ ඊජන්එවේටර් ගණනය කිරීමේ අවශ්යතාවයක් ද නොමැත.
තවද, එක් එක් කරුණු සොයා ගැනීමේ කාර්යය පහසු කිරීම සඳහා මම නිරීක්ෂණ 44 සිට 15 දක්වා කපා දැමුවෙමි. අවසාන ප්රති result ලය වූයේ ඇටසැකිලි දත්ත රාමුවක් ( dat1
):
compounds atomic.no melting.point
AIN 10 498.0
AIP 14 625.0
AIAs 23 1011.5
... ... ...
"සංයෝග" තීරුව අර්ධ සන්නායකයේ රසායනික ව්යවස්ථාව පෙන්නුම් කරන අතර පේළි නාමයේ කාර්යභාරය ඉටු කරයි.
මෙය පහත පරිදි ප්රතිනිෂ්පාදනය කළ හැකිය (ආර් කොන්සෝලය මත පිටපත් කර ඇලවීමට සූදානම්):
dat <- read.csv(url("http://rinterested.github.io/datasets/semiconductors"))
colnames(dat)[2] <- "atomic.no"
dat1 <- subset(dat[1:15,1:3])
row.names(dat1) <- dat1$compounds
dat1 <- dat1[,-1]
පසුව දත්ත පරිමාණයට ලක් කරන ලදී:
X <- apply(dat1, 2, function(x) (x - mean(x)) / sd(x))
# This centers data points around the mean and standardizes by dividing by SD.
# It is the equivalent to `X <- scale(dat1, center = T, scale = T)`
රේඛීය වීජ ගණිත පියවර අනුගමනය කළේ:
C <- cov(X) # Covariance matrix (centered data)
⎡⎣⎢at_nomelt_pat_no10.296melt_p0.2961⎤⎦⎥
සහසම්බන්ධතා ශ්රිතය cor(dat1)
පරිමාණයෙන් තොර දත්තවල ශ්රිතයට cov(X)
සමාන නොවන ප්රතිදානය ලබා දෙයි .
lambda <- eigen(C)$values # Eigenvalues
lambda_matrix <- diag(2)*eigen(C)$values # Eigenvalues matrix
⎡⎣⎢λPC11.2964220λPC200.7035783⎤⎦⎥
e_vectors <- eigen(C)$vectors # Eigenvectors
12√⎡⎣⎢PC111PC21−1⎤⎦⎥
∼[−0.7,−0.7][0.7,0.7]
e_vectors[,1] = - e_vectors[,1]; colnames(e_vectors) <- c("PC1","PC2")
1.29642170.703578364.8%eigen(C)$values[1]/sum(eigen(C)$values) * 100
∼65%35.2%
මෙම සෙල්ලම් දත්ත කට්ටලයේ කුඩා ප්රමාණයට අනුව අපි ඊජෙන්වෙක්ටර් දෙකම ඇතුළත් කරන්නෙමු, එක් ඊජෙන්වෙක්ටර් එකක් බැහැර කිරීමෙන් මානයන් අඩු වනු ඇති බව වටහා ගැනීම - පීසීඒ පිටුපස ඇති අදහස.
මෙම ලකුණු සංඛ්යාව න්යාසය මේ අනුකෘතිය ගුණ තීරණය කරන ලදි පරිමාණ දත්ත ( X
විසින්) eigenvectors (හෝ "භමණය") අනුකෘතිය :
score_matrix <- X %*% e_vectors
# Identical to the often found operation: t(t(e_vectors) %*% t(X))
X
[0.7,0.7]TPC1[0.7,−0.7]TPC2
[0.7,−0.7]
1
> apply(e_vectors, 2, function(x) sum(x^2))
PC1 PC2
1 1
( පැටවීම් ) යනු ඊජන් අගයන් මගින් පරිමාණය කරන ලද ඊජන්එවේටර් ය (පහත දැක්වෙන R ශ්රිතයන්හි ව්යාකූල පාරිභාෂිතය තිබියදීත්). එහි ප්රති ing ලයක් වශයෙන්, පැටවීම් ගණනය කළ හැක්කේ:
> e_vectors %*% lambda_matrix
[,1] [,2]
[1,] 0.9167086 0.497505
[2,] 0.9167086 -0.497505
> prcomp(X)$rotation %*% diag(princomp(covmat = C)$sd^2)
[,1] [,2]
atomic.no 0.9167086 0.497505
melting.point 0.9167086 -0.497505
භ්රමණය වූ දත්ත වලාකුළට (ලකුණු කුමන්ත්රණය) එක් එක් සංරචක (PC) සමඟ සමාන අගයන්ට සමාන විචල්යතාවයක් ඇති බව සැලකිල්ලට ගැනීම සිත්ගන්නා කරුණකි:
> apply(score_matrix, 2, function(x) var(x))
PC1 PC2
53829.7896 110.8414
> lambda
[1] 53829.7896 110.8414
සාදන ලද කාර්යයන් උපයෝගී කර ගනිමින් ප්රති results ල නැවත නැවත කළ හැකිය:
# For the SCORE MATRIX:
prcomp(X)$x
# or...
princomp(X)$scores # The signs of the PC 1 column will be reversed.
# and for EIGENVECTOR MATRIX:
prcomp(X)$rotation
# or...
princomp(X)$loadings
# and for EIGENVALUES:
prcomp(X)$sdev^2
# or...
princomp(covmat = C)$sd^2
UΣVTprcomp()
svd_scaled_dat <-svd(scale(dat1))
eigen_vectors <- svd_scaled_dat$v
eigen_values <- (svd_scaled_dat$d/sqrt(nrow(dat1) - 1))^2
scores<-scale(dat1) %*% eigen_vectors
ප්රති result ලය පහත දැක්වේ, පළමුව, තනි ලක්ෂ්යයේ සිට පළමු ඊජෙන්වෙක්ටර් දක්වා ඇති දුර, සහ දෙවන කුමන්ත්රණයක දී, විකලාංග දුර දෙවන ඊජන්වෙක්ටර් වෙත:
ඒ වෙනුවට අපි ලකුණු අනුකෘතියේ (පීසී 1 සහ පීසී 2) අගයන් සැලසුම් කළෙමු නම් - තවදුරටත් “ද්රවාංකය” සහ “පරමාණුක.නෝ” නොවේ, නමුත් ඇත්ත වශයෙන්ම ලක්ෂ්යයේ පදනමේ වෙනසක් ඊජන්එවේටර් සමඟ සම්බන්ධීකරණයේ පදනම ලෙස වෙනස් වුවහොත් මෙම දුර ප්රමාණය වනු ඇත. සංරක්ෂණය කර ඇති නමුත් ස්වාභාවිකවම xy අක්ෂයට ලම්බක වනු ඇත:
උපක්රමය දැන් මුල් දත්ත නැවත ලබා ගැනීමයි . ඊජෙන්වෙක්ටර්ස් විසින් සරල අනුකෘති ගුණ කිරීමකින් ලකුණු පරිවර්තනය කර ඇත. දත්ත ලක්ෂ්යවල පිහිටීමෙහි කැපී පෙනෙන වෙනසක් ඇති කරමින් ඊජෙන්වෙක්ටර් වල අනුකෘතියේ ප්රතිලෝමයෙන් ගුණ කිරීමෙන් දත්ත නැවත භ්රමණය විය . නිදසුනක් ලෙස, වම් ඉහළ චතුරස්රයේ (වම් බිම් කොටසෙහි කළු කවය, පහළ) රෝස පැහැති තිතෙහි වෙනසක් සැලකිල්ලට ගෙන, වම් පහළ චතුරස්රයේ ආරම්භක ස්ථානයට ආපසු යන්න (දකුණු බිම් කොටසෙහි කළු කවය, පහළ).
දැන් අපි අවසානයේදී මෙම "භ්රමණය වූ" අනුකෘතියේ මුල් දත්ත ප්රතිෂ් ored ාපනය කළෙමු:
පීසීඒ හි දත්ත භ්රමණය කිරීමේ ඛණ්ඩාංක වෙනස් කිරීමෙන් ඔබ්බට, ප්රති results ල අර්ථ නිරූපණය කළ යුතු අතර, මෙම ක්රියාවලියට සම්බන්ධ වීමට නැඹුරු වන අතර biplot
, ඒ මත නව ඊජෙන්වෙක්ටර් ඛණ්ඩාංක සම්බන්ධයෙන් දත්ත ලක්ෂ්ය සැලසුම් කර ඇති අතර මුල් විචල්යයන් දැන් අධිප්රමාණය වී ඇත. දෛශික. ඉහත භ්රමණ ප්රස්ථාරවල දෙවන පේළියේ ("xy අක්ෂය = ඊජෙන්වෙක්ටර් සමඟ ලකුණු") (ඊළඟට ඇති බිම් කැබලි වල වමට), සහ biplot
(සිට ) දක්වා වූ බිම් අතර ඇති ස්ථානවල සමානතාව සටහන් කිරීම සිත්ගන්නා කරුණකි . දකුණේ):
මුල් විචල්යයන් රතු ඊතල ලෙස අධිස්ථාපනය කිරීමෙන් PC1
දෛශිකයක් ලෙස දිශාවට (හෝ ධනාත්මක සහසම්බන්ධයක් සහිතව) අර්ථ දැක්වීමට මාර්ගයක් atomic no
සහ melting point
; සහ eigenvectors වල අගයන්ට අනුරූප PC2
වන atomic no
නමුත් negative ණාත්මක ලෙස සහසම්බන්ධිත melting point
අගයන් වැඩි කරන සං component ටකයක් ලෙස:
PCA$rotation
PC1 PC2
atomic.no 0.7071068 0.7071068
melting.point 0.7071068 -0.7071068
වික්ටර් පවෙල් විසින් කරන ලද මෙම අන්තර්ක්රියාකාරී නිබන්ධනය දත්ත වලාකුළු වෙනස් කරන විට ඊජෙන්වෙයාර්වල සිදුවන වෙනස්කම් පිළිබඳව ක්ෂණික ප්රතිපෝෂණයක් ලබා දෙයි.