第7章 PCA与梯度上升法 学习笔记上

心不动则不痛 提交于 2020-08-12 03:15:33

目录

7-1 什么是PCA

7-2 使用梯度上升法求解PCA问题

7-3 求数据的主成分PCA

demean

梯度上升法

使用极端数据集测试


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单位化处理,

初始的搜索不能为零

使用极端数据集测试

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!