博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bobo老师机器学习笔记第七课-如何通过PCA实现高维数据向低维数据的转换
阅读量:4171 次
发布时间:2019-05-26

本文共 1469 字,大约阅读时间需要 4 分钟。

在上一篇博客中我们总结如何求出前N个主成分, 这篇博客中我们主要讲述如何通过PCA实现高维数据向低维数据的转变。 

高维数据向低维数据的转变的核心是重新建立新的坐标系,而这个坐标系就是前K个主成分构成矩阵。所以问题简化为如何通过高位矩阵和前K主成分矩阵,找出新坐标下的地位矩阵

首先假设数据X和前K个主成分我们已经求得如下:

转换公式其实很简单,如下:

从上图可以看到X乘以W的转置矩阵就会获取一个m*k的地位矩阵了。 

此外如果知道低维数据,也可以通过坐标系W还原到原来的X(m)数据。不过此处要注意,还原后的数据虽然和愿数据维度不变,但是数据有一定的损失,下面我们通过编程来直观的看一下。 

二、编码实现

基于上一篇博客的代码,增加如下代码:

def transform(self, X):        """将给定的X,映射到各个主成分分量中"""        assert X.shape[1] == self.components_.shape[1]        return X.dot(self.components_.T)    def inverse_transform(self, X):        """将给定的X,反向映射回原来的特征空间"""        assert X.shape[1] == self.components_.shape[0]        return X.dot(self.components_)

测试代码:

x = np.random.randint(1, 100, size=100)    X = np.empty((100, 2))    X[:, 0] = x    X[:, 1] = 0.75 * x + 3. + np.random.normal(1,10., size=len(x))    pca = PCA(n_components=1)    pca.fit(X)    w = pca.components_[0]    X_reduction = pca.transform(X)    print('X_reduction:', X_reduction.shape)    X_restore = pca.inverse_transform(X_reduction)    print('X_restore:', X_restore.shape)    plt.scatter(X[:, 0], X[:, 1], color='b', alpha=0.5, label='X')    plt.scatter(X_restore[:, 0], X_restore[:, 1], color='r', alpha=0.5, label='Restore X')    plt.plot([0, w[0] * 30], [0, w[1] * 30], color='g', label='W')    plt.legend()    plt.show()

测试代码把2维X降维到1维 X_reduction,映射的坐标是w方向, 然后又用w方向把X_reduction还原成X_restore。不过可以看出

restore_X和X相比存在数据损失。restore_X是2维数据,但看起来在一条直线上,因此可以为还原后的restore_X仅仅是通过高维空间来表达低维空间的数据。

要是你在西安,感兴趣一起学习AIOPS,欢迎加入QQ群 860794445

转载地址:http://lhkai.baihongyu.com/

你可能感兴趣的文章
嵌入式100题(017):malloc的底层实现
查看>>
嵌入式100题(018):在1G内存的计算机中能否malloc(1.2G)?为什么?
查看>>
嵌入式100题(019):指针与引用的相同和区别;如何相互转换?
查看>>
嵌入式100题(040):什么是三次握手
查看>>
嵌入式100题(037):Http1.1和Http1.0的区别
查看>>
嵌入式100题(038):HTTPS与HTTP的一些区别
查看>>
嵌入式100题(042):为什么服务端易受到SYN攻击?
查看>>
嵌入式100题(043):什么是四次挥手
查看>>
嵌入式100题(044):为什么客户端最后还要等待2MSL?
查看>>
嵌入式100题(045):为什么建立连接是三次握手,关闭连接确是四次挥手呢?...
查看>>
嵌入式100题(028):static的用法(定义和用途)
查看>>
嵌入式100题(027):char和int之间的转换
查看>>
嵌入式100题(029):const常量和#define的区别(编译阶段、安全性、内存占用等)...
查看>>
嵌入式100题(030):volatile作用和用法
查看>>
嵌入式100题(033):TCP、UDP的优缺点
查看>>
嵌入式100题(035):TCP为什么是可靠连接
查看>>
嵌入式100题(034):TCP UDP适用场景
查看>>
嵌入式100题(70):一个程序从开始运行到结束的完整过程(四个过程)
查看>>
嵌入式100题(71):什么是堆,栈,内存泄漏和内存溢出?
查看>>
嵌入式100题(73):死锁的原因、条件 创建一个死锁,以及如何预防
查看>>