今天使用Octave练习计算PCA,发现自己对于这个计算还不是特别了解,特此记录。
首先从txt中获取数据,然后将矩阵都入到X中。
octave:7> data = load('ex2data.txt') data = 2.50000 2.40000 0.50000 0.70000 2.20000 2.90000 1.90000 2.20000 3.10000 3.00000 2.30000 2.70000 2.00000 1.60000 1.00000 1.10000 1.50000 1.60000 1.10000 0.90000 octave:8> X = data(:, [1, 2]); octave:15> mu=mean(X) mu = 1.8100 1.9100
求x平均值,然后对于所有的样例,都减去对应的均值。这里x的均值是1.81和1.91,那么一个样例减去均值后即为(0.69,0.49),得到
octave:16> X_norm = bsxfun(@minus, X, mu); octave:17> X_norm X_norm = 0.690000 0.490000 -1.310000 -1.210000 0.390000 0.990000 0.090000 0.290000 1.290000 1.090000 0.490000 0.790000 0.190000 -0.310000 -0.810000 -0.810000 -0.310000 -0.310000 -0.710000 -1.010000
我们使用这个矩阵去构造协方差矩阵sigma = (X_norm’ * X_norm)/size(X_norm(:,1))
octave:34> sigma = X_norm' * X_norm sigma = 5.5490 5.5390 5.5390 6.4490 octave:35> sigma = sigma/10 sigma = 0.55490 0.55390 0.55390 0.64490
使用octave中的svd函数直接计算出协方差的特征值和特征向量
octave:36> [U,S,V] = svd(sigma) U = -0.67787 -0.73518 -0.73518 0.67787 S = Diagonal Matrix 1.155625 0 0 0.044175 V = -0.67787 -0.73518 -0.73518 0.67787
U为特征向量,S为sigma的特征值,通过特征值可以求变量的retained(保留程度)。
比如此时我们想把2维数据转换到1维数据上,那么可以使用U的第一列或者第二列,通过公式z=U’ * X_norm或者X_norm * U得到降维后的数据。
octave:39> z = X_norm*U(:,1) z = -0.827970 1.777580 -0.992197 -0.274210 -1.675801 -0.912949 0.099109 1.144572 0.438046 1.223821
研究其数理意义,就是求源数据到向量基z的投影误差最小,找到合适的基向量代表这个平面。
http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html