通俗理解: 找出一个最主要的特征 进行分析
例子: 考察一个人的智力情况 直接看数学成绩就行
例子: 观看电视 将显示器的百万像素转化为一个三维图像
重点:
降维技术
主成分分析(PCA)
对半导体数据进行降维处理
1.数据集更容易使用
2.降低算法的计算开销
3.去除噪声
4.使得结果易懂 ---(有利于可视化)
几种不同的降维方法:
1. 主成分分析(Principal Component Analysis, PCA)
通俗理解: 找出一个最主要的特征 进行分析
例子: 考察一个人的智力情况 直接看数学成绩就行
原理简介:
在PCA中,数据从原来的坐标系转化到了新的坐标系, 新坐标系的选择是由数据
本身决定的.
第一个新坐标轴选择的是原始数据中方差最大的方向
第二个新坐标轴的选择是和第一个坐标轴正交且具有最大方差的方向
该过程已知重复 重复次数为原始数据中特征的数目
会发现: 大部分方差后包含在最前面的几个新坐标轴中 因此可以忽略余下的坐标轴 即对数据进行降维处理
2. 因子分析(Factor Analysis)
通俗理解: 将多个实测变量转化为少数几个综合指标 反映一种降维的思想: 通过降维将相关性高的变量聚在一起 从而减少需要分析的变量的数量 而减少问题分析的复杂性
例子: 考察一个人的整体情况 就组合3样成绩(隐变量), 看平均成绩就行
原理简介:
在因子分析中, 假设在观察数据的生成中有一些观察不到的隐变量
假设观察数据是这些隐变量和某些噪声的线性组合 那么隐变量的数据可能比观察数据的数目少
也就是说找到隐变量就可以实现数据的降维
3.独立成分分析(Independent Component Analysis, ICA)
通俗理解: ICA认为观测信号是若干个独立信号的线性组合 ICA要做的就是解混过程
例子: 去KTV唱歌 想辨别唱的是什么歌曲? ICA是观察发现原唱唱的一首歌(2个独立的声音 (原唱/主唱))
ICA假设数据是从N个数据源生成的, 这一点和因子分析类似
假设数据为多个数据源的混合观察结构 这些数据源之间在统计上是相互独立的
在PCA中只假设数据是不相关的
如果数据源的数目少于观察数据的数目 则可以实现降维过程
PCA 主成分分析
优点:降低数据的复杂性 识别最重要的多个特征
缺点:不一定需要, 且可能损失有用信息
适用数据类型: 数值型数据
PCA是如何降维的? 移动坐标轴
1.1 移动坐标轴
第一条坐标轴旋转到覆盖数据的最大方差位置 —–> 数据的最大方差给出了数据的最重要的信息
第二条坐标轴是覆盖数据次大差异性的坐标轴
找到坐标轴之后如果降维?
坐标轴的旋转并没有减少数据的维度
考虑到决策树 每次都是基于一个特征来做决策的 分类规则简单 但分隔平面难以保持质量
考虑到SVM 分类规则复杂 但是分隔平面优异
PCA降维可以同时过得SVM和决策树的优点
PCA降维的基本过程
主成分分析
第一个主成分就是数据差异性最大的方向提取出来
第二个主成分则是来自于数据差异性次大的方向 并且该方向与第一个主成分方向正交
通过数据集的协方差矩阵以及特征值分析 就可以求出这些主成分的值
一旦得到了协方差矩阵的特征向量 就可以保留最大的N个值 这些特征向量也给出了N个最重要特征的真实结构
可以通过将数据乘上这N个特征向量 而将他转化到新的空间
特征值分析是线性代数中的一个领域 可以通过数据的一般格式来揭示数据的’真实’结构
即: 常说的特征向量和特征值
Av=λv中,v是特征向量λ是特征值特征值都是简单的标量值因此该公式表示的是:如果特征向量v被某个矩阵A左乘那么它就等于某个标量λ乘以v A v = λ v 中 , v 是 特 征 向 量 λ 是 特 征 值 特 征 值 都 是 简 单 的 标 量 值 因 此 该 公 式 表 示 的 是 : 如 果 特 征 向 量 v 被 某 个 矩 阵 A 左 乘 那 么 它 就 等 于 某 个 标 量 λ 乘 以 v
PCA 工作原理
1. 找出第一个主成分的方向 也就是数据方差最大的方向
2. 找出第二个主成分的方向 也就是数据方差次大的方向 并且该方向与第一个主成分方向 正交( 如果是二维空间就叫垂直)
3. 通过这种方式计算出所有的主成分方向
4. 通过数据集的协方差矩阵的特征值和特征向量 可以得到这些主成分的值
5. 一旦得到了协方差矩阵的特征值和特征向量 就可以保留最大的N个特征 这些特征向量也给出了N个最重要特征的真实结构
就可以通过将数据乘上N个特征向量 从而将它转化到新的空间上
为什么正交?
1. 正交是为了数据的有效性损失最小
2. 正交的一个原因是特征值的特征向量是正交的
特征值与特征向量在代数和几何层面的实际意义是什么?
Ax = cx A为矩阵 x为特征向量 c为特征值
矩阵A乘以x表示: 对向量x进行一次转化(旋转或者拉伸)是一种线性变换, 而该转换的效果为常数乘以向量x(即只进行拉伸)
通常: 求特征值和特征向量即为求出该矩阵能使哪些向量(当然是特征向量)只发生拉伸, 使其拉伸的程度如果(特征值大小)
意义:
看清一个矩阵在哪些方面能产生最大的效果
并根据所产生的每个特征向量(一般研究特征值最大的那几个)进行分类讨论与研究
算法实现 PCA 主成分分析
在数据转化为前N个主成分的伪代码大致如下:
去除平均值
计算协方差矩阵
计算协方差矩阵的特征值和特征向量
将特征值从大到小排序
保留最上面的N个特征向量
将数据转化到上述N个特征向量构建的新空间中
代码实现:
import numpy as np
print(__doc__)
"""
算法实现 PCA 主成分分析
在数据转化为前N个主成分的伪代码大致如下:
去除平均值
计算协方差矩阵
计算协方差矩阵的特征值和特征向量
将特征值从大到小排序
保留最上面的N个特征向量
将数据转化到上述N个特征向量构建的新空间中
"""
# def loadDataSet(fileName, delim='\t'):
# fr = open(fileName)
# stringArr = [line.strip().split(delim) for line in fr.readlines()]
# datArr = [map(float, line) for line in stringArr]
# return mat(datArr)
def load_data(filename, delim='\t'):
fr = open(filename)
data_set = list()
string_set = [line.strip().split(delim) for line in fr.readlines()]
# print('string_set', string_set)
for line in string_set:
data_set.append(list(map(float, line)))
return np.mat(data_set)
def pca(data_set, top_features=999999999):
"""
principal component analysis 主成分降维
:param data_set: 数据集
:param top_features: 去N个特征向量
:return:
low_data_mat 降维后的数据集
recon_mat 新的数据集空间
"""
# step1 去除均值并且计算协方差矩阵
data_mean = np.mean(data_set, axis=0)
# print('data_mean', data_mean)
mean_removed = data_set - data_mean
cov_mat = np.cov(mean_removed, rowvar=0)
# print('cov mat', cov_mat)
# step2 计算协方差矩阵的特征值和特征向量
eig_vals, eig_vects = np.linalg.eig(np.mat(cov_mat))
print('eig vals', eig_vals)
print('eig_vects', eig_vects)
# step3 将特征值从大到小排序 保留最上面的N个特征向量
eig_vals_index = np.argsort(eig_vals) # 从小到大
# print('eig_vals_index', eig_vals_index)
eig_vals_index = eig_vals_index[:-(top_features + 1): -1] # 从大到小
print('eig_vals_index', eig_vals_index)
read_eig_vects = eig_vects[:, eig_vals_index] # 保留最上面的N个特征向量
# step4 将数据转换到新空间
low_data_mat = mean_removed * read_eig_vects # 1000x2 * 2x1 = 1000x1
recon_mat = (low_data_mat * read_eig_vects.T) + data_mean
# print('low_data_mat', low_data_mat)
# print('recon_mat', recon_mat)
return low_data_mat, recon_mat
def mat_fig(data_set, recon_mat):
import matplotlib.pyplot as plt
figure = plt.figure()
ax = figure.add_subplot(111)
ax.scatter(data_set[:, 0].flatten().A[0], data_set[:, 1].flatten().A[0], marker='^', s=90)
ax.scatter(recon_mat[:, 0].flatten().A[0], data_set[:, 1].flatten().A[0], marker='o', s=50, c='r')
# figure.show()
plt.show()
def replace_nan_with_mean():
data_set = load_data('secom.data', ' ')
num_feature = np.shape(data_set)[1]
for i in range(num_feature):
mean_val = np.mean(data_set[np.nonzero(~np.isnan(data_set[:, i].A))[0], i])
data_set[np.nonzero(np.isnan(data_set[:, i].A))[0], i] = mean_val
return data_set
def main():
# filename = 'testSet.txt'
# data_set = load_data(filename)
# print('data_set', data_set)
# low_data_mat, recon_mat = pca(data_set, top_features=1)
# print('降维后的数据集', np.shape(low_data_mat))
# print('low_data_mat', low_data_mat)
# print('新的数据集空间 recon_mat', recon_mat)
# mat_fig(data_set, recon_mat)
data_set = replace_nan_with_mean()
print('data_set', data_set)
if __name__ == '__main__':
main()