Task06
本次学习参照Datawhale开源学习:https://github.com/datawhalechina/machine-learning-toy-code/tree/main/ml-with-sklearn
内容安排如下,主要是一些代码实现和部分原理介绍。
假设训练样本采样密度足够大,任意测试样本 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特征空间中(下图绿色),特征空间的平均值位于这个单位正方形的中心处,距中心处单位距离的所有点构成了正方形的内接圆(下图红色)。没有落在单位圆的训练样本在搜索空间的角落处,而这些样本由于特征值差异很大难以分类。相对而言大部分样本落在单位内接圆里,比较容易分类。
随着维度的增加,越来越多的数据将落在角落里难以进行分类:
缓解维数灾难的一个重要途径是降维(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施加了不同的约束。
主成分分析(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)
Wmaxtr(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的解。过程如下:
'''使用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。随机数发生器的种子,给定数字固定随机数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)