Principal Components

Using the USA Arrests dataset for unsupervised learning

rr dimnames(USArrests)

[[1]]
 [1] \Alabama\        \Alaska\         \Arizona\        \Arkansas\       \California\     \Colorado\       \Connecticut\   
 [8] \Delaware\       \Florida\        \Georgia\        \Hawaii\         \Idaho\          \Illinois\       \Indiana\       
[15] \Iowa\           \Kansas\         \Kentucky\       \Louisiana\      \Maine\          \Maryland\       \Massachusetts\ 
[22] \Michigan\       \Minnesota\      \Mississippi\    \Missouri\       \Montana\        \Nebraska\       \Nevada\        
[29] \New Hampshire\  \New Jersey\     \New Mexico\     \New York\       \North Carolina\ \North Dakota\   \Ohio\          
[36] \Oklahoma\       \Oregon\         \Pennsylvania\   \Rhode Island\   \South Carolina\ \South Dakota\   \Tennessee\     
[43] \Texas\          \Utah\           \Vermont\        \Virginia\       \Washington\     \West Virginia\  \Wisconsin\     
[50] \Wyoming\       

[[2]]
[1] \Murder\   \Assault\  \UrbanPop\ \Rape\    

rr apply(USArrests,2,mean)

  Murder  Assault UrbanPop     Rape 
   7.788  170.760   65.540   21.232 

rr apply(USArrests,2, var)

    Murder    Assault   UrbanPop       Rape 
  18.97047 6945.16571  209.51878   87.72916 

Principal Components is about the Variance (Mean will be made 0). We see that Assault has the most variance. If a single variable has a lot of variance, it might dominate the principal components

We calculate the PCA by standardizing the variables

rr #prcomp will standardize the variables for us pca.out=prcomp(USArrests, scale=TRUE) pca.out

Standard deviations (1, .., p=4):
[1] 1.5748783 0.9948694 0.5971291 0.4164494

Rotation (n x k) = (4 x 4):
                PC1        PC2        PC3         PC4
Murder   -0.5358995  0.4181809 -0.3412327  0.64922780
Assault  -0.5831836  0.1879856 -0.2681484 -0.74340748
UrbanPop -0.2781909 -0.8728062 -0.3780158  0.13387773
Rape     -0.5434321 -0.1673186  0.8177779  0.08902432

The standard deviations are the SD of the four principal components. The rotation are the loadings - The 1 PC is loaded equally on Murder, Assault, Rape (all the three crimes) and loaded less on the Urban population. The sign doesnt matter really, because the variance doesnt change - The second is heavily loaded on the urban population

Plotting the first two components

The red is the direction of the loadings of the principal components while each state takes a position on the x plot.

Eg. Florida, Nevada, California is high on crime. Maine, North Dakota, New Hampshire have low crime The y axis is about whether the state has a high population or not

K - Means Clustering

We work on a simulated data, where we have clusters and we shift them by shifting their means

rr set.seed(101) #Generating 2 columns, 100 records x <- matrix(rnorm(100*2), 100, 2) #Generating means and shiting means for the 4 clusters xmean <- matrix(rnorm(8, sd = 4), 4, 2) #Which point is going to be placed on which cluster? which <- sample(1:4, 100, replace = TRUE) #xmean[which,] produces a 100 row matrix with 2 columns x <- x + xmean[which,] plot(x, col = which, pch = 19)

Running a kmeans on this dataset

rr #We run 15 random starts (15 times algorithm, each time the starting cluster assignment is different) kmout <- kmeans(x, 4, nstart = 15) kmout

K-means clustering with 4 clusters of sizes 32, 28, 20, 20

Cluster means:
        [,1]       [,2]
1 -0.5787702  4.7639233
2 -5.6518323  3.3513316
3  1.4989983 -0.2412154
4 -3.1104142  1.2535711

Clustering vector:
  [1] 2 4 1 2 4 1 2 4 1 1 3 1 1 3 4 3 2 3 2 2 2 2 2 3 1 1 4 2 4 1 2 3 2 4 4 3 3 4 3 3 2 4 4 2 2 3 2 1 2 4 2 1 1 3 3 4 3 1 1 1 4 2 2
 [64] 2 4 4 1 1 3 2 2 1 1 3 1 3 2 1 1 1 4 1 4 1 2 3 1 2 2 1 1 4 2 4 1 1 3 3 1 1

Within cluster sum of squares by cluster:
[1] 53.04203 42.40322 34.95921 48.52107
 (between_SS / total_SS =  85.7 %)

Available components:

[1] \cluster\      \centers\      \totss\        \withinss\     \tot.withinss\ \betweenss\    \size\         \iter\        
[9] \ifault\      

Plotting the data

rr #Clusters plot(x, col = kmout$cluster, cex = 2, pch = 1, lwd = 2) #Plotting the original data points(x, col = which, pch = 19)

There are one or two mismatches between the blue and black. They are much closer to each other and this result is reasonable.

Hierarchical Clustering

We use the same simulated dataset for hierarchical clustering

Computing the clusters based on different link functions and plotting the dendogram (bottom-up clustering)

rr hc_complete <- hclust(dist(x), method = ) hc_single <- hclust(dist(x), method = ) hc_average <- hclust(dist(x), method = ) par(mfrow = c(1,3)) plot(hc_complete) plot(hc_single) r plot(hc_average)

Complete is the prefered method

“cuttree” is a function used to get the clusters at a preferred height level. We compare this with the original data

rr table(hc_cut, which)

      which
hc_cut  1  2  3  4
     1  0 28  0  0
     2  1  0  0 20
     3 31  0  0  0
     4  0  0 20  0

The orders are actually arbitrary. THe small numers are the misidentifications. 1 in hc_cut is not the same as 1 in original data

Comparing with K-Means clustering (4 clusters)

rr table(hc_cut, kmout$cluster)

      
hc_cut  1  2  3  4
     1  0 28  0  0
     2  1  0  0 20
     3 31  0  0  0
     4  0  0 20  0

We see similar results for the kmeans and hierarchical clustering

The dendograms can be labelled with the original cluster assignments in order to see misassignments

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2sgLSBVbnN1cGVydmlzZWQgTGVhcm5pbmcgSVNMUiBMYWJzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMjUHJpbmNpcGFsIENvbXBvbmVudHMNCg0KVXNpbmcgdGhlIFVTQSBBcnJlc3RzIGRhdGFzZXQgZm9yIHVuc3VwZXJ2aXNlZCBsZWFybmluZw0KDQpgYGB7cn0NCmRpbW5hbWVzKFVTQXJyZXN0cykNCmFwcGx5KFVTQXJyZXN0cywyLG1lYW4pDQphcHBseShVU0FycmVzdHMsMiwgdmFyKQ0KYGBgDQoNClByaW5jaXBhbCBDb21wb25lbnRzIGlzIGFib3V0IHRoZSBWYXJpYW5jZSAoTWVhbiB3aWxsIGJlIG1hZGUgMCkuIFdlIHNlZSB0aGF0IEFzc2F1bHQgaGFzIHRoZSBtb3N0IHZhcmlhbmNlLiBJZiBhIHNpbmdsZSB2YXJpYWJsZSBoYXMgYSBsb3Qgb2YgdmFyaWFuY2UsIGl0IG1pZ2h0IGRvbWluYXRlIHRoZSBwcmluY2lwYWwgY29tcG9uZW50cw0KDQpXZSBjYWxjdWxhdGUgdGhlIFBDQSBieSBzdGFuZGFyZGl6aW5nIHRoZSB2YXJpYWJsZXMNCg0KYGBge3J9DQojcHJjb21wIHdpbGwgc3RhbmRhcmRpemUgdGhlIHZhcmlhYmxlcyBmb3IgdXMNCnBjYS5vdXQ9cHJjb21wKFVTQXJyZXN0cywgc2NhbGU9VFJVRSkNCnBjYS5vdXQNCmBgYA0KDQpUaGUgc3RhbmRhcmQgZGV2aWF0aW9ucyBhcmUgdGhlIFNEIG9mIHRoZSBmb3VyIHByaW5jaXBhbCBjb21wb25lbnRzLiBUaGUgcm90YXRpb24gYXJlIHRoZSBsb2FkaW5ncw0KLSBUaGUgMSBQQyBpcyBsb2FkZWQgZXF1YWxseSBvbiBNdXJkZXIsIEFzc2F1bHQsIFJhcGUgKGFsbCB0aGUgdGhyZWUgY3JpbWVzKSBhbmQgbG9hZGVkIGxlc3Mgb24gdGhlIFVyYmFuIHBvcHVsYXRpb24uIFRoZSBzaWduIGRvZXNudCBtYXR0ZXIgcmVhbGx5LCBiZWNhdXNlIHRoZSB2YXJpYW5jZSBkb2VzbnQgY2hhbmdlDQotIFRoZSBzZWNvbmQgaXMgaGVhdmlseSBsb2FkZWQgb24gdGhlIHVyYmFuIHBvcHVsYXRpb24NCg0KUGxvdHRpbmcgdGhlIGZpcnN0IHR3byBjb21wb25lbnRzDQoNCmBgYHtyfQ0KYmlwbG90KHBjYS5vdXQsIHNjYWxlID0gMCwgY2V4ID0gMC42KQ0KYGBgDQoNCg0KVGhlIHJlZCBpcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBsb2FkaW5ncyBvZiB0aGUgcHJpbmNpcGFsIGNvbXBvbmVudHMgd2hpbGUgZWFjaCBzdGF0ZSB0YWtlcyBhIHBvc2l0aW9uIG9uIHRoZSB4IHBsb3QuDQoNCkVnLiBGbG9yaWRhLCBOZXZhZGEsIENhbGlmb3JuaWEgaXMgaGlnaCBvbiBjcmltZS4gTWFpbmUsIE5vcnRoIERha290YSwgTmV3IEhhbXBzaGlyZSBoYXZlIGxvdyBjcmltZQ0KVGhlIHkgYXhpcyBpcyBhYm91dCB3aGV0aGVyIHRoZSBzdGF0ZSBoYXMgYSBoaWdoIHBvcHVsYXRpb24gb3Igbm90DQoNCg0KIyMjIEsgLSBNZWFucyBDbHVzdGVyaW5nDQoNCldlIHdvcmsgb24gYSBzaW11bGF0ZWQgZGF0YSwgd2hlcmUgd2UgaGF2ZSBjbHVzdGVycyBhbmQgd2Ugc2hpZnQgdGhlbSBieSBzaGlmdGluZyB0aGVpciBtZWFucw0KDQpgYGB7cn0NCnNldC5zZWVkKDEwMSkNCiNHZW5lcmF0aW5nIDIgY29sdW1ucywgMTAwIHJlY29yZHMNCnggPC0gbWF0cml4KHJub3JtKDEwMCoyKSwgMTAwLCAyKQ0KI0dlbmVyYXRpbmcgbWVhbnMgYW5kIHNoaXRpbmcgbWVhbnMgZm9yIHRoZSA0IGNsdXN0ZXJzDQp4bWVhbiA8LSBtYXRyaXgocm5vcm0oOCwgc2QgPSA0KSwgNCwgMikNCiNXaGljaCBwb2ludCBpcyBnb2luZyB0byBiZSBwbGFjZWQgb24gd2hpY2ggY2x1c3Rlcj8NCndoaWNoIDwtIHNhbXBsZSgxOjQsIDEwMCwgcmVwbGFjZSA9IFRSVUUpDQojeG1lYW5bd2hpY2gsXSBwcm9kdWNlcyBhIDEwMCByb3cgbWF0cml4IHdpdGggMiBjb2x1bW5zDQp4IDwtIHggKyB4bWVhblt3aGljaCxdDQoNCnBsb3QoeCwgY29sID0gd2hpY2gsIHBjaCA9IDE5KQ0KYGBgDQoNClJ1bm5pbmcgYSBrbWVhbnMgb24gdGhpcyBkYXRhc2V0DQoNCmBgYHtyfQ0KI1dlIHJ1biAxNSByYW5kb20gc3RhcnRzICgxNSB0aW1lcyBhbGdvcml0aG0sIGVhY2ggdGltZSB0aGUgc3RhcnRpbmcgY2x1c3RlciBhc3NpZ25tZW50IGlzIGRpZmZlcmVudCkNCmttb3V0IDwtIGttZWFucyh4LCA0LCBuc3RhcnQgPSAxNSkNCmttb3V0DQpgYGANCg0KLSBDbHVzdGVyIE1lYW5zIC0gQ2VudHJvaWQNCi0gQ2x1c3RlciBWZWN0b3IgLSBBc3NpZ25tZW50IG9mIGNsdXN0ZXIgdG8gdGhlIGRhdGEgcG9pbnQNCi0gV2l0aGluIGNsdXN0ZXIgc3VtIG9mIHNxdWFyZXMgaXMgc3VtbWFyeSBvZiB0aGUgY2x1c3Rlcg0KLSBiZXR3ZWVuIHN1bSBvZiBzcXVhcmVzL3RvdGFsIHN1bSBvZiBzcXVhcmVzIGlzIGxpa2UgUl4yIGZvciBjbHVzdGVyaW5nLiBJdCBpcyB0aGUgcGVyY2VudGFnZSBvZiB2YXJpYW5jZSBleHBsYWluZWQgYnkgdGhlIGNsdXN0ZXJpbmcNCg0KUGxvdHRpbmcgdGhlIGRhdGEgDQoNCmBgYHtyfQ0KI0NsdXN0ZXJzDQpwbG90KHgsIGNvbCA9IGttb3V0JGNsdXN0ZXIsIGNleCA9IDIsIHBjaCA9IDEsIGx3ZCA9IDIpDQojUGxvdHRpbmcgdGhlIG9yaWdpbmFsIGRhdGENCnBvaW50cyh4LCBjb2wgPSB3aGljaCwgcGNoID0gMTkpDQpgYGANCg0KVGhlcmUgYXJlIG9uZSBvciB0d28gbWlzbWF0Y2hlcyBiZXR3ZWVuIHRoZSBibHVlIGFuZCBibGFjay4gVGhleSBhcmUgbXVjaCBjbG9zZXIgdG8gZWFjaCBvdGhlciBhbmQgdGhpcyByZXN1bHQgaXMgcmVhc29uYWJsZS4NCg0KDQojIyNIaWVyYXJjaGljYWwgQ2x1c3RlcmluZw0KDQpXZSB1c2UgdGhlIHNhbWUgc2ltdWxhdGVkIGRhdGFzZXQgZm9yIGhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nDQoNCkNvbXB1dGluZyB0aGUgY2x1c3RlcnMgYmFzZWQgb24gZGlmZmVyZW50IGxpbmsgZnVuY3Rpb25zIGFuZCBwbG90dGluZyB0aGUgZGVuZG9ncmFtIChib3R0b20tdXAgY2x1c3RlcmluZykNCmBgYHtyfQ0KaGNfY29tcGxldGUgPC0gaGNsdXN0KGRpc3QoeCksIG1ldGhvZCA9ICJjb21wbGV0ZSIpDQpoY19zaW5nbGUgPC0gaGNsdXN0KGRpc3QoeCksIG1ldGhvZCA9ICJzaW5nbGUiKQ0KaGNfYXZlcmFnZSA8LSBoY2x1c3QoZGlzdCh4KSwgbWV0aG9kID0gImF2ZXJhZ2UiKQ0KDQpwYXIobWZyb3cgPSBjKDEsMykpDQpwbG90KGhjX2NvbXBsZXRlKQ0KcGxvdChoY19zaW5nbGUpDQpwbG90KGhjX2F2ZXJhZ2UpDQpgYGANCg0KDQotIFdlIGtub3cgdGhlcmUgYXJlIDQgY2x1c3RlcnMuIFRoZSAiY29tcGxldGUiIGNsdXN0ZXIgZ2l2ZXMgdXMgNCBiaWcgY2x1c3RlcnMgYXQgaGVpZ2h0IH4gNiwgYW5kIHRoaXMgc2hvdWxkIG1hdGNoIHdpdGggdGhlIG9yaWdpbmFsIGNsdXN0ZXJzLiANCi0gInNpbmdsZSIgY2x1c3RlciBpcyBkaWZmZXJlbnQsIHRoaXMgd291bGQgbW9zdGx5IGpvaW4gaW5kaXZpZHVhbCBkYXRhIHBvaW50cyB3aXRoIGNsdXN0ZXJzLiBHaXZlcyBsb24sIHN0cnVuZyBvdXQgY2x1c3RlcnMNCi0gImF2ZXJhZ2UiIGdpdmVzIHVzIHNvbWV0aGluZyBpbiBiZXR3ZWVuDQoNCkNvbXBsZXRlIGlzIHRoZSBwcmVmZXJlZCBtZXRob2QNCg0KImN1dHRyZWUiIGlzIGEgZnVuY3Rpb24gdXNlZCB0byBnZXQgdGhlIGNsdXN0ZXJzIGF0IGEgcHJlZmVycmVkIGhlaWdodCBsZXZlbC4gV2UgY29tcGFyZSB0aGlzIHdpdGggdGhlIG9yaWdpbmFsIGRhdGENCg0KYGBge3J9DQpoY19jdXQgPC0gY3V0cmVlKGhjX2NvbXBsZXRlLCA0KQ0KDQp0YWJsZShoY19jdXQsIHdoaWNoKQ0KYGBgDQpUaGUgb3JkZXJzIGFyZSBhY3R1YWxseSBhcmJpdHJhcnkuIFRIZSBzbWFsbCBudW1lcnMgYXJlIHRoZSBtaXNpZGVudGlmaWNhdGlvbnMuIDEgaW4gaGNfY3V0IGlzIG5vdCB0aGUgc2FtZSBhcyAxIGluIG9yaWdpbmFsIGRhdGENCg0KDQpDb21wYXJpbmcgd2l0aCBLLU1lYW5zIGNsdXN0ZXJpbmcgKDQgY2x1c3RlcnMpDQpgYGB7cn0NCnRhYmxlKGhjX2N1dCwga21vdXQkY2x1c3RlcikNCmBgYA0KDQpXZSBzZWUgc2ltaWxhciByZXN1bHRzIGZvciB0aGUga21lYW5zIGFuZCBoaWVyYXJjaGljYWwgY2x1c3RlcmluZw0KDQpUaGUgZGVuZG9ncmFtcyBjYW4gYmUgbGFiZWxsZWQgd2l0aCB0aGUgb3JpZ2luYWwgY2x1c3RlciBhc3NpZ25tZW50cyBpbiBvcmRlciB0byBzZWUgbWlzYXNzaWdubWVudHMNCmBgYHtyfQ0KcGxvdChoY19jb21wbGV0ZSxsYWJlbHM9d2hpY2gpDQpgYGANCiANCg0KDQoNCg==