机器学习十讲第六讲
特征值分解
- 设A是n阶方阵,如果有常数λ和n维非零列向量α的关系式,Aα = λα 成立,则称 λ 为方阵A的特征值,非零向量 α 称为方阵A的对应于特征值λ的特征向量。
什么是降维?
主成分分析:
- 主成分分析(Principal Component Analysis, PCA),1901年由Karl Pearson提出
- 在人脸识别和图像压缩等领域得到了广泛的应用
- 基本思想:构造原始特征的一系列线性组合形成的线性无关低维特征,以去除数据的相关性,并使降维后的数据最大程度地保持原始高维数据的方差信息
数据集表示
优化目标
模型求解
算法流程
方差比例与数据重构
图像重构应用实例
自编码器
深层自编码器
自编码器:深度网络预训练
Deep Patient 整体框架
- A. 从临床数据仓库中抽取电子健康档案数据(EHRs)
- B. 使用无监督的深度网络学习病人表示向量
- C. 使用病人表示向量预测未来患病风险
Deep Patient 特征学习深度网络结构
Deep Patient 效果
- 训练集:700000 病人
- 测试集:76214 病人,78种疾病
- 疾病预测准确率
Python常用降维实践工具介绍
实例:
Python实现PCA算法:
import numpy as np #PCA算法 def principal_component_analysis(X, l): X = X - np.mean(X, axis=0)#对原始数据进行中心化处理 sigma = X.T.dot(X)/(len(X)-1) # 计算协方差矩阵 a,w = np.linalg.eig(sigma) # 计算协方差矩阵的特征值和特征向量 sorted_indx = np.argsort(-a) # 将特征向量按照特征值进行排序 X_new = X.dot(w[:,sorted_indx[0:l]])#对数据进行降维****Y=XW return X_new,w[:,sorted_indx[0:l]],a[sorted_indx[0:l]] #返回降维后的数据、主成分、对应特征值 from sklearn import datasets import matplotlib.pyplot as plt %matplotlib inline #使用make_regression生成用于线性回归的数据集 x, y = datasets.make_regression(n_samples=200,n_features=1,noise=10,bias=20,random_state=111) ##将自变量和标签进行合并,组成一份二维数据集。同时对两个维度均进行归一化。 x = (x - x.mean())/(x.max()-x.min()) y = (y - y.mean())/(y.max()-y.min()) ###可视化展示 fig, ax = plt.subplots(figsize=(6, 6)) #设置图片大小 ax.scatter(x,y,color="#E4007F",s=50,alpha=0.4) plt.xlabel("$x_1$") plt.ylabel("$x_2$")
#调用刚才写好的PCA算法对数据进行降维 import pandas as pd X = pd.DataFrame(x,columns=["x1"]) X["x2"] = y X_new,w,a = principal_component_analysis(X,1) #直线的斜率为w[1,0]/w[0,0]。将主成分方向在散点图中绘制出来 import numpy as np x1 = np.linspace(-.5, .5, 50) x2 = (w[1,0]/w[0,0])*x1 fig, ax = plt.subplots(figsize=(6, 6)) #设置图片大小 X = pd.DataFrame(x,columns=["x1"]) X["x2"] = y ax.scatter(X["x1"],X["x2"],color="#E4007F",s=50,alpha=0.4) ax.plot(x1,x2,c="gray") # 画出第一主成分直线 plt.xlabel("$x_1$") plt.ylabel("$x_2$")
#使用散点图绘制降维后的数据集 import numpy as np fig, ax = plt.subplots(figsize=(6, 2)) #设置图片大小 ax.scatter(X_new,np.zeros_like(X_new),color="#E4007F",s=50,alpha=0.4) plt.xlabel("First principal component")
基于PCA的特征脸提取和人脸重构
#导入olivettifaces人脸数据集 from sklearn.datasets import fetch_olivetti_faces faces = fetch_olivetti_faces() faces.data.shape
输出的维度如下
#随机排列 rndperm = np.random.permutation(len(faces.data)) plt.gray() fig = plt.figure(figsize=(9,4) ) #取18个 for i in range(0,18): ax = fig.add_subplot(3,6,i+1 ) ax.matshow(faces.data[rndperm[i],:].reshape((64,64))) plt.box(False) #去掉边框 plt.axis("off")#不显示坐标轴 plt.show()
#将人脸数据从之前的4096维降低到20维 %time faces_reduced,W,lambdas = principal_component_analysis(faces.data,20)
#将降维后得到的20个特征向量表示出来 fig = plt.figure( figsize=(18,4)) plt.gray() for i in range(0,20): ax = fig.add_subplot(2,10,i+1 ) #将降维后的W每一列都提出,从4096长度向量变成64×64的图像 ax.matshow(W[:,i].reshape((64,64))) plt.title("Face(" + str(i) + ")") plt.box(False) #去掉边框 plt.axis("off")#不显示坐标轴 plt.show()