目录
7-1 什么是PCA
降维后
同理去掉特征一,降维则为
那个方案更好呢,右边的,在x轴上点集间距离大,有更好的区分度
将点映射到这条斜线上,数据点变为,其整体与原来变化不大,从二维降到了一维,这时无论是映射到xy上间距大好
方差样本的疏密
所有的样本减去整体样本的均值
dmean后式子化简为这样
X是向量,demean后为零
w是单位方向向量
主成分分析法有很强的数学原理
横纵坐标是两个特征,与线垂直,不同于线性回归,
横特征纵是标记,与坐标垂直
7-2 使用梯度上升法求解PCA问题
X是非监督学习提供的样本,没有标记y
整理式子,不用for循环,通过向量的运算计算
1Xm, mXn == 1Xn 需要nx1的梯度,将上式转置 相清楚谁是矩阵谁是向量,如果是矩阵是多少乘多少的
7-3 求数据的主成分PCA
demean
梯度上升法
def f(w, X):
return np.sum((X.dot(w)**2)) / len(X)
def df_math(w, X):
return X.T.dot(X.dot(w)) * 2. / len(X)
def df_debug(w, X, epsilon=0.0001):
res = np.empty(len(w))
for i in range(len(w)):
w_1 = w.copy()
w_1[i] += epsilon
w_2 = w.copy()
w_2[i] -= epsilon
res[i] = (f(w_1, X) - f(w_2, X)) / (2 * epsilon)
return res
def direction(w):
return w / np.linalg.norm(w)
def gradient_ascent(df, X, initial_w, eta, n_iters = 1e4, epsilon=1e-8):
w = direction(initial_w)
cur_iter = 0
while cur_iter < n_iters:
gradient = df(w, X)
last_w = w
w = w + eta * gradient
w = direction(w) # 注意1:每次求一个单位方向
if(abs(f(w, X) - f(last_w, X)) < epsilon):
break
cur_iter += 1
return w
w单位化处理,
初始的搜索不能为零
使用极端数据集测试