数学原理参考:https://blog.csdn.net/aiaiai010101/article/details/72744713

实现过程参考:https://www.cnblogs.com/eczhou/p/5435425.html

两篇博文都写的透彻明白。

自己用python实现了一下,有几点疑问,主要是因为对基变换和坐标变换理解不深。

先附上代码和实验结果:

code:

from numpy import *
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat cx = mat([[2.5, 2.4],
[0.5, 0.7],
[2.2, 2.9],
[1.9, 2.2],
[3.1, 3.0],
[2.3, 2.7],
[, 1.6],
[, 1.1],
[1.5, 1.6],
[1.1, 0.9]])
# print(cx.shape)
sz = cx.shape
m = sz[]
n = sz[] # 显示原数据
def plot_oridata( cx ):
plt.figure(num='原数据图', figsize=(, ))
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.xlim((-, ))
plt.ylim((-, ))
new_ticks = np.arange(-, , 0.5)
plt.xticks(new_ticks)
plt.yticks(new_ticks)
plt.scatter(cx[:, ].tolist(), cx[:, ].tolist(), c='r', marker='+')
plt.plot([, ], [-, ], 'k-')
plt.plot([-, ], [, ], 'k-')
plt.show()
return #求协方差矩阵
def get_covMat( cx ):
print('+++++++++++++ 求协方差矩阵 +++++++++++++++')
# 零均值化
ecol = np.mean(cx, axis=)
cx1 = (cx[:, ]) - ecol[, ]
cx2 = cx[:, ] - ecol[, ]
Mcx = np.column_stack((cx1, cx2))
Covx = np.transpose(Mcx)*Mcx/(m-)
# print(Covx)
return Covx, Mcx #计算特征值和特征向量
def get_eign(Covx, k):
eVals, eVecs = np.linalg.eig(Covx)
# print(eVals)
# print(eVecs, ' ', eVecs.shape)
sorted_indices = np.argsort(eVals)
topk_evecs = eVecs[:, sorted_indices[:-k-:-]]
# print(topk_evecs) plt.figure(num='特征向量', figsize=(, ))
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.xlim((-, ))
plt.ylim((-, ))
new_ticks = np.arange(-, , )
plt.xticks(new_ticks)
plt.yticks(new_ticks)
plt.scatter(cx[:, ].tolist(), cx[:, ].tolist(), c='r', marker='+')
plt.plot([, ], [-, ], 'k-.')
plt.plot([-, ], [, ], 'k-.')
# print(eVecs[, ], eVecs[, ])
# print(eVecs)
plt.plot([, eVecs[, ] * ], [, eVecs[, ] * ], 'b:')
plt.plot([, eVecs[, ] * ], [, eVecs[, ] * ], 'b:')
plt.plot([, eVecs[, ] * -], [, eVecs[, ] * -], 'b:')
plt.plot([, eVecs[, ] * -], [, eVecs[, ] * -], 'b:')
plt.show()
return eVecs, topk_evecs #转换数据
def transform_data(eVecs, Mcx):
print("------------------转换数据---------------------")
tran_data = Mcx * eVecs
plt.figure(num='转换数据', figsize=(, ))
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.xlim((-, ))
plt.ylim((-, ))
new_ticks = np.arange(-, , 0.5)
plt.xticks(new_ticks)
plt.yticks(new_ticks)
plt.scatter(tran_data[:, ].tolist(), tran_data[:, ].tolist(), c='r', marker='+')#哪一维对应x,哪一维对应y
plt.plot([, ], [-, ], 'k-.')
plt.plot([-, ], [, ], 'k-.')
# print(eVecs[, ], eVecs[, ])
# print(eVecs)
plt.show()
return #压缩数据
def compress_data(Mcx, topkevecs, eVecs):
print("------------------压缩数据---------------------")
comdata = Mcx * topkevecs
c1 = np.zeros((, ), dtype=int)
comdata1 = np.column_stack((c1, comdata))
comdata2 = comdata1 * eVecs plt.figure(num='压缩数据', figsize=(, ))
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.xlim((-, ))
plt.ylim((-, ))
new_ticks = np.arange(-, , 0.5)
plt.xticks(new_ticks)
plt.yticks(new_ticks)
plt.scatter(comdata2[:, ].tolist(), comdata2[:, ].tolist(), c='r', marker='+') # 哪一维对应x,哪一维对应y
plt.plot([, ], [-, ], 'k-.')
plt.plot([-, ], [, ], 'k-.')
plt.plot([, eVecs[, ] * ], [, eVecs[, ] * ], 'b:')
plt.plot([, eVecs[, ] * ], [, eVecs[, ] * ], 'b:')
plt.plot([, eVecs[, ] * -], [, eVecs[, ] * -], 'b:')
plt.plot([, eVecs[, ] * -], [, eVecs[, ] * -], 'b:')
# print(eVecs[, ], eVecs[, ])
# print(eVecs)
plt.show()
return plot_oridata(cx)
Covx, Mcx = get_covMat(cx)
eVecs, topk_evecs = get_eign(Covx, )
transform_data(eVecs, Mcx)
compress_data(Mcx, topk_evecs, eVecs)
print('end')

初学python,代码肯定很啰嗦,并且很丑。

实验结果:

疑问1:对数据进行特征向量为基的转换时,公式如下。我得到的坐标是以原坐标系为参考的,那么哪一维对应x,哪一维对应y,如果我将特征向量按照特征值降序的顺序重新排列,是否有影响呢?

得到的坐标是新坐标系下的。根据转换向量对应。

疑问2:取最大特征值对应的特征向量为基时,对数据进行降维,此时我得到的一维坐标是以这个特征向量为参考的吗?此时我应该如何在原坐标系show出这些数据?

我的代码中,取第一维为0,第二维为得到的坐标,以此再进行以此疑问1中的二维基转换,得到坐标,并且plot。不太理解道理。

对一维坐标,分别对两个坐标轴投影即可得到新坐标系下的两个坐标。

PCA算法数学原理及实现的更多相关文章

  1. PCA的数学原理

    PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维 数据的 ...

  2. 【机器学习笔记之七】PCA 的数学原理和可视化效果

    PCA 的数学原理和可视化效果 本文结构: 什么是 PCA 数学原理 可视化效果 1. 什么是 PCA PCA (principal component analysis, 主成分分析) 是机器学习中 ...

  3. PCA的数学原理(转)

    PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...

  4. 机器学习--主成分分析(PCA)算法的原理及优缺点

    一.PCA算法的原理 PCA(principle component analysis),即主成分分析法,是一个非监督的机器学习算法,是一种用于探索高维数据结构的技术,主要用于对数据的降维,通过降维可 ...

  5. 非对称加密技术- RSA算法数学原理分析

    非对称加密技术,在现在网络中,有非常广泛应用.加密技术更是数字货币的基础. 所谓非对称,就是指该算法需要一对密钥,使用其中一个(公钥)加密,则需要用另一个(私钥)才能解密. 但是对于其原理大部分同学应 ...

  6. PCA的数学原理Matlab演示

    关于 PCA(Principal component analysis)主成分分析.是SVD(Singular value decomposition)神秘值分析的一种特殊情况.主要用于数据降维.特征 ...

  7. PCA数学原理

    PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...

  8. pca数学原理(转)

    PCA的数学原理 前言 数据的向量表示及降维问题 向量的表示及基变换 内积与投影 基 基变换的矩阵表示 协方差矩阵及优化目标 方差 协方差 协方差矩阵 协方差矩阵对角化 算法及实例 PCA算法 实例 ...

  9. python实现PCA算法原理

    PCA主成分分析法的数据主成分分析过程及python原理实现 1.对于主成分分析法,在求得第一主成分之后,如果需要求取下一个主成分,则需要将原来数据把第一主成分去掉以后再求取新的数据X’的第一主成分, ...

随机推荐

  1. Cesium 学习笔记

    Entity API 1,和 fill属性不太一样,outline没有对应的材质配置,而是用两个独立的属性outlineColor和outlineWidth. 注意outlineWidth属性仅仅在非 ...

  2. 在sql中select的执行顺序

    <select{[distinct |all] columns |*}> [into table_name] <from {tables |views | other select} ...

  3. 要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10;

    package text1; import java.util.ArrayList; import java.util.HashSet; /* * 要求产生10个随机的字符串, * 每一个字符串互相不 ...

  4. gzip对字符串的压缩和解压

    package org.jc.plugins.gzip; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStre ...

  5. SpringMVC,SpringBoot使用ajax传递对象集合/数组到后台

    假设有一个bean名叫TestPOJO. 1.使用ajax从前台传递一个对象数组/集合到后台. 前台ajax写法: var testPOJO=new Array(); //这里组装testPOJO数组 ...

  6. Android系统分析之运营商显示流程分析之运营商信息的读取流程二

    运营商显示流程分析之运营商信息的读取流程 一. SIM卡运营商信息的读取 从前面的 运营商信息的获取和赋值 可以知道SIM卡运营商的赋值最终是在 SIMRecords 中完成的, 而SIM卡信息的相关 ...

  7. day14

    迭代器什么是迭代器(iterator) 器指的是某种工具 迭代指的是更新换代的过程,例如应用程序的版本更新从1.0 变成 1.2 迭代的目的是要根据上一个结果,产生下一个结果,这是一个重复的过程,但不 ...

  8. scrapy 爬虫的暂停与重启

    暂停爬虫项目 首先在项目目录下创建一个文件夹用来存放暂停爬虫时的待处理请求url以及其他的信息.(文件夹名称:job_info) 在启动爬虫项目时候用pycharm自带的终端启动输入下面的命令: sc ...

  9. ZOJ 2477 Magic Cube(魔方)

    ZOJ 2477 Magic Cube(魔方) Time Limit: 2 Seconds      Memory Limit: 65536 KB This is a very popular gam ...

  10. 解决win10 蓝牙设备只能配对无法连接 ,并且删除设备无效的问题

    系统环境: win10家庭版 dell本 问题描述:蓝牙设备(比如蓝牙键盘,蓝牙音箱)出现无法连接的情况,打算删除已配对的设备,再重新配对连接.但删除设备后重启蓝牙,那些原本被删除的设备又自动配对上, ...