主成分分析
第二主成分就是在新的数据上求第一主成分。
代码实现
首先,根据上节求出数据的第一主成分
下面求第二主成分
#%% 第二主成分
#X2 = np.empty(X.shape)
#for i in range(len(X)):
# X2[i] = X[i] - X[i].dot(w) * w
X2 = X - X.dot(w).reshape(-1,1) * w #此行可代替上面三行
plt.scatter(X2[:,0],X2[:,1])
plt.show()
图像与第一主成分垂直,得
w2 = first_component(X2,initial_w,eta)
array([-0.61256369, 0.79042124])
通过验证, 两个 w 点乘结果近似为 0 .
w.dot(w2)
4.839838137316033e-06
将求前 n 个主成分封装成函数:
def first_n_component(n,X,eta=0.01,n_iters=1e4,epsilon=1e-8):
X_pca = X.copy()
X_pca = demean(X_pca)
res = []
for i in range(n):
initial_w = np.random.random(X_pca.shape[1])
w = first_component(X_pca,initial_w,eta)
res.append(w)
X_pca = X_pca - X_pca.dot(w).reshape(-1,1) * w
return res
例如,求前 2 个主成分
first_n_component(2,X)
结果:
first_n_component(2,X)
[array([0.78718057, 0.61672258]), array([-0.61672013, 0.7871825 ])]