sklearn机器学习(六)

sklearn机器学习(六),第1张

sklearn机器学习(六)

Task06
本次学习参照Datawhale开源学习:https://github.com/datawhalechina/machine-learning-toy-code/tree/main/ml-with-sklearn
内容安排如下,主要是一些代码实现和部分原理介绍。

6. 主成分分析 6.1. 维数灾难

假设训练样本采样密度足够大,任意测试样本 x x x附件任意小的距离 δ delta δ范围内总能找到一个训练样本。但是这个假设在现实任务中通常很难满足,例如若 δ = 0.001 delta=0.001 δ=0.001,考虑一维单个属性情况,需要1000个样本点平均分布在归一化后的属性取值范围内。但如果在更高维度有更多属性,例如维度为20时,若要样本满足密采样条件则至少需要 ( 1 0 3 ) 20 = 1 0 60 (10^3)^{20}=10^{60} (103)20=1060个样本。这种在高维情形下出现的数据样本稀疏、距离计算困难等问题被称为“维数灾难”。维数灾难会带来两个主要问题:

  • 过拟合
  • 搜索空间的数据稀疏程度分布不均

例如:我们要对十个样本的猫和狗图片进行分类。若只是用一个特征(图片平均红色程度)分类效果不佳:

增加第二个特征(平均绿色程度)仍然不能进行线性分割:

增加第三个特征(平均蓝色程度)可以找到一个平面将猫和狗完全分开:

似乎特征不断增加就能获得最佳分类效果。但是,我们需要注意:随着特征维度的增加,训练样本的在特征空间的密度是如何呈指数型下降的。在1D空间中,10个训练样本完全覆盖了1D特征空间,特征空间宽度为5,样本密度是10/2=5。而在2D空间中,10个训练样本构成的2D特征空间面积为5x5=25,样本密度是10/25=0.4。最后在3D空间中,10个训练样本构成的3D特征空间大小为5x5x5=125,样本密度为10/125=0.08。可以看到随着特征空间维度增加,样本变得越来越稀疏。使得我们更加容易找到一个超平面来实现分类。然而,如果我们将高维的分类结果投影到低维空间中,将会出现一个严重的问题:过拟合。

从训练样本方面讲,如果在1D范围我们希望训练样本的特征值占特征值范围的20%,纳闷训练样本的数量就要达到总体样本数的20%。如果增加第二个、第三个特征,那么训练样本数量就要分别达到总体样本数的45%和58%。换句话说,如果可用的训练样本数量是固定的,那么如果增加特征维度的话,过拟合就会发生。

维度灾难还会造成搜索空间的数据稀疏程度分布不均。在一个正方形2D特征空间中(下图绿色),特征空间的平均值位于这个单位正方形的中心处,距中心处单位距离的所有点构成了正方形的内接圆(下图红色)。没有落在单位圆的训练样本在搜索空间的角落处,而这些样本由于特征值差异很大难以分类。相对而言大部分样本落在单位内接圆里,比较容易分类。

随着维度的增加,越来越多的数据将落在角落里难以进行分类:

6.2. 缓解维数灾难

缓解维数灾难的一个重要途径是降维(dimension reduction),亦称“维数约简”。即通过某种数学变换将原始高维属性空间转变为一个低维“子空间”,在这个子空间中样本密度大幅提高,距离也变得更为容易计算。

最简单降维的方法就是对原始高维空间进行线性变换,给定 d d d维空间中的样本 X = ( x 1 , x 2 , . . . , x m ) ∈ R d × m X=(x_1,x_2,...,x_m)in{R}^{d×m} X=(x1​,x2​,...,xm​)∈Rd×m,变换之后得到 d ′ ⩽ d d'leqslant{d} d′⩽d维空间中的样本: Z = W T X Z=W^TX Z=WTX其中 W ∈ R d × d ′ Win{R}^{d×d'} W∈Rd×d′是变换矩阵, Z ∈ R d ′ × m Zin{{R}^{d'×m}} Z∈Rd′×m是样本在新空间中的表达。基于线性变换来进行降维的方法称为线性降维方法,它们都符合上述基本形式,不同之处是对低维子空间的性质有不同的要求,也就对 W W W施加了不同的约束。

6.3. 主成分分析

主成分分析(Principal Component Analysis,PCA)是最常用的一种降维方法。为了对正交属性空间中的样本点使用一个超平面进行划分,这个超平面大概需要具有这样的性质:

  • 最近重构性:样本点到这个超平面的距离都足够近;
  • 最大可分性:样本点在这个超平面上的投影能尽可能分开。

这两种性质分别得到主成分分析的两种等价推导,分别得到如下两种PCA优化目标:
(1) m i n W − t r ( W T X X T W ) underset {W}{min}quad -tr(W^TXX^TW) Wmin​−tr(WTXXTW) s . t . W T W = I s.t.quad W^TW=I s.t.WTW=I
(2) m a x W t r ( W T X X T W ) underset {W}{max}quad tr(W^TXX^TW) Wmax​tr(WTXXTW) s . t . W T W = I s.t.quad W^TW=I s.t.WTW=I
对任意一式使用拉格朗日乘子可得:
X X T W = λ W XX^TW=lambda W XXTW=λW于是,只需要对协方差矩阵 X X T XX^T XXT进行特征值分解,将求得的特征值排序,再取前 d ′ d' d′个特征值对应的特征向量构成 W = ( w 1 , w 2 , . . . , w d ′ ) W=(w_1,w_2,...,w_{d'}) W=(w1​,w2​,...,wd′​)就是PCA的解。过程如下:

6.4. sklearn PCA
'''使用PCA对鸢尾花数据集进行降维'''
import numpy as np
import matplotlib.pyplot as plt     
from sklearn.decomposition import PCA   
from sklearn.datasets import load_iris

data=load_iris()
y=data.target
x=data.data
print(x.shape)
print(np.unique(y))
(150, 4)
[0 1 2]

可以看到原始数据集中鸢尾花有150个样本,每个样本4个特征。鸢尾花分为0、1、2三种标签属性。

pca=PCA(n_components=2)  #使用PCA将4维降维2维,也可方便可视化展示
model=pca.fit_transform(x)

red_x,red_y=[],[]
blue_x,blue_y=[],[]
green_x,green_y=[],[]
 
for i in range(len(model)):
 if y[i] ==0:
  red_x.append(model[i][0])
  red_y.append(model[i][1])
 elif y[i]==1:
  blue_x.append(model[i][0])
  blue_y.append(model[i][1])
 else:
  green_x.append(model[i][0])
  green_y.append(model[i][1])

plt.scatter(red_x,red_y,c='r',marker='o')
plt.scatter(blue_x,blue_y,c='b',marker='D')
plt.scatter(green_x,green_y,c='g',marker='x')
plt.show()

6.5. 参数说明
class sklearn.decomposition.PCA(n_components=None, *, copy=True, whiten=False, svd_solver='auto', tol=0.0, iterated_power='auto', random_state=None)

n_componentsint 或者 string,缺省时默认为 None。主成分个数 n,也即保留下来的特征个数 n。
copybool,缺省时默认为True。表示是否在运行算法时,是否将原始训练数据复制一份。True,原始训练数据的值不会有任何改变;False,原始训练数据的值会改。
whitenbool,缺省时默认为 False。白化,使得每个特征具有相同的方差。
svd_solver,str,可选"auto",“randomized”,“full”,“arpack”,缺省时默认为 “auto” 。定奇异值分解 SVD 的方法。“auto” PCA 类自动选择下述三种算法权衡。“randomized”,适用于数据量大,数据维度多同时主成分数目比例又较低的 PCA 降维。“full”,传统意义上的 SVD。“arpack”,直接使用 scipy 库的 sparse SVD 实现,和randomized 的适用场景类似。
tolfloat ,默认值为 0。停止求解的容错率标准。
iterated_powerint 或者 str ,默认值为"auto"。迭代次数。
random_stateint 类型,默认为 None。随机数发生器的种子,给定数字固定随机数。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5689812.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存