为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第6天 Python3入门机器学习

①课程介绍


课程名称:Python3入门机器学习 经典算法与应用 入行人工智能
课程章节:7-1,7-2
主讲老师:liuyubobobo

内容导读


上一篇文章对PCA算法进行地整体思路的顺,这篇文章分片来讲PCA在使用搜索的方式求解过程中做了什么。

  • 第一部分 使用极端数据测试
  • 第二部分 求数据的前N个主成分
  • 第三部分 求解第一个主成分详解

②课程详细


第一部分 使用极端数据测试

导入函数

import numpy as np
import matplotlib.pyplot as plt

创造随机的数据,theta的值为3,4

X2 = np.empty((100, 2))
X2[:,0] = np.random.uniform(0., 100., size=100)
X2[:,1] = 0.75 * X2[:,0] + 3.

可视化

plt.scatter(X2[:,0],X2[:,1])
plt.show()

图片描述
通过看图中数据的分布可以看出以下几点

  1. 数据没有噪点,呈线性分布
  2. 假如降维的话,最佳的主成分w就是沿着线分布,
  3. 这图片仅仅展示了两个维度的X数据
    找出前N个主成分
X2_demean = demean(X2)
initial_w = np.random.random(X2.shape[1])
w2 = gradient_ascent(df_math, X2_demean, initial_w, eta=0.001)

可视化降维结果

plt.scatter(X2_demean[:,0], X2_demean[:,1])
plt.plot([0, w2[0]*30], [0, w2[1]*30], color='r')
plt.show()

图片描述
可以看出降维结果没有问题,我自己实现的PCA算法没问题

第二部分 求数据的前N个主成分(代码展示)

这一部分,展示求解主成分的代码
导入函数

import numpy as np
import matplotlib.pyplot as plt

创造随机的数据,

X = np.empty((100, 2))
X[:,0] = np.random.uniform(0., 100., size=100)
X[:,1] = 0.75 * X[:,0] + 3. + np.random.normal(0, 10., size=100)

对数据进行demean操作

def demean(X):
    return X - np.mean(X, axis=0)
X = demean(X)

求主成分的代码

def f(w, X):
    return np.sum((X.dot(w)**2)) / len(X)

def df(w, X):
    return X.T.dot(X.dot(w)) * 2. / len(X)

def direction(w):
    return w / np.linalg.norm(w)

def first_component(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) 
        if(abs(f(w, X) - f(last_w, X)) < epsilon):
            break
            
        cur_iter += 1

    return w

运行

initial_w = np.random.random(X.shape[1])
eta = 0.01
w = first_component(X, initial_w, eta)
w

求解第二主成分

#在X中对于第一主成分的分量去掉,去掉后设为X2
X2 = X -X.dot(w).reshape(-1,1) * w

我这里只有两个维度的数据,对于二维平面来说,找到第一个主成分以后,就剩一个主成分需要找了,而剩下的这一个主成分的寻找,其实某种程度上讲,已经和我们的数据无关了,剩下的这一个主成分,只要和我们的第一个主成分垂直就 ok 了

可视化

plt.scatter(X2[:,0], X2[:,1])
plt.show()

图片描述

第三部分 求解第一个主成分详解

应为求解主成分找到一个轴,数据就删除掉这一主成分的数据分量,然后就成找下一个主成分,其实是一个循环,找主成分的过程其实用的函数是一样的。
代码详解

 def first_n_components(n, X, eta=0.01, n_iters=1e4, epilson=1e-8):
        
        X_pca = X.copy()
        X_pca = demean(X_pca)
        #主成分列表
        res = []
        #循环n次,求出前n个主成分
        for i in range(n):
            #下面要用梯度上升法,搜索对于当前XPca的第一主成分
            #初始生成w
            initial_w = np.random.random(X_pca.shape[1])
            w = first_component(X_pca,initial_w, eta)
            res.append(w)
            #减去w轴方向上的主成分
            X_pca = X_pca -X_pca.dot(w).reshape(-1,1) * w
            #然后循环,基于新的x_pca进行求主成分,减去原来的w
        return res

③课程思考


  • PCA求解主成分的时候有点绕,但是利用三维可视化的方式,分布进行就能很清晰地认知PCA在做搜索方式进行地过程。
  • PCA从主成分的方式来理解,就像是找出一个新的坐标系能更好表达数据的分布,而且每个轴逐级递增,因此降维之后能最大程度地保留数据地分布情况。

④课程截图

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消