宋小宝老婆,微信公众-中超蔬菜,欧洲知名中超大盘点

为什么需求降维?

高维机器学习数据集是具有很多列(或变量)的数据集。高维机器学习数据集对核算提出了相应的应战。一般变量(或称为特征)是相关的。咱们期望找到一个变量子集来表明数据中相同等级的信息,或许在不丢掉太多信息的情况下将变量转化为一组新的变量。尽管高性能核算能够处理高维数据,但在许多运用中依然需求下降原始数据的维度。

当进行降维时,主成分剖析(PCA)可能是最盛行的技能。在本文中,我将从PCA开端,然后持续介绍其他降维技能。

主成分剖析(PCA)

主成分剖析(PCA)的思维是削减由很多相关变量组成的数据集的维数,一同尽可能坚持数据集的方差。PCA找到一组新的变量,本来的变量仅仅它们的线性组合。新的变量称为主成分(PC)。这些主成分是正交的:在三维情况下,主成分互相笔直。X不能用Y表明或许Y不能用Z表明。

图(A)显现了PCA的直觉:它“旋转”坐标轴,以便更好地与数据对齐。第一个主成分将捕获数据中的大部分方差,然后是第二个、第三个,依此类推。因而,新的数据将具有更少的维度。

图(A):PCA

让咱们运用iris机器学习数据集来阐明PCA:

# Use the iris dataset to illustrate PCA:
import pandas as宋小宝老婆,微信大众-中超蔬菜,欧洲闻名中超大盘点 pd
url = “https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
# load dataset into Pandas DataFrame
df = pd.read_csv(url, names=[‘sepal length’,’sepal width’,’petal length’,’petal width’,’target’])
df.head()

IRIS数据集

在运用PCA之前,一切的变量应该在相同的范围内,否宋小宝老婆,微信大众-中超蔬菜,欧洲闻名中超大盘点则一个值较大的特征将会主导成果。下面我在scikit-learn中运用StandardScaler将机器学习数据集的特征规范化到单位规范(均值= 0,方差= 1)。

from sklearn.preprocessing import StandardScaler
variables = [‘sepal length’, ‘sepal width’, ‘petal length’, ‘petal width’]
x = df.loc[:, variables].values
y = df.loc[:,[‘target’]].values
x = Standa宋小宝老婆,微信大众-中超蔬菜,欧洲闻名中超大盘点rdScaler().fit_transform(x)
x = pd.DataFrame(x)

规范化特征

原始数据会集有四个特征。所以PCA会供给相同数量的主成分。

from sklearn.decomposition import PCA
pca = PCA()
x_pca = pca.fit_transform(x)
x_pca = pd.Dat宋小宝老婆,微信大众-中超蔬菜,欧洲闻名中超大盘点aFrame(x_pca)
x_pca.head()

IRIS数据集的主成分

每个首要组成部分化说的方差是什么?运用pca.explained_variance_ratio_回来的动摇的向量:

每一个主成分化说的方差是什么呢?运用主成分剖析。explained_贝克三联征variance_ratio_回来方差向量:

explained_variance = pca.explained_variance_ratio_
explained_variance

array([0.72770452, 0.23030523, 0.03683832, 0.00515193])

它显现第一个主成分占72.22%的方差,第二,第三和第四个占23.9%,3.68%和0.51%的方差。咱们能够说第一和第二主成分捕获了72.22 + 23.9 = 96.21%的信息。咱们常常期望只保存重要的特征并删去无关紧要的特征。经历法则是,保存能捕获明显方差的主成分,疏忽较小的方差。

咱们能够运用前两个成分制作成果。让咱们将方针变量y附加到新数据x_pca:

x_pca[‘target’]=y
x_pca.columns = [‘PC1’,’PC2',’PC3',’PC4',’target’]
x_pca.head()

成果显现数据在新空间中是可别离的。

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.set_xlabel(‘Principal Component 1’)
ax.set_ylabel(‘Principal Component 2’)
ax.set_title(‘2 component PCA’)
targets = [‘Iris-setosa’, ‘Iris-versicolor’, ‘Iris-virginica’]
colors = [‘r’, ‘g’, ‘b’]
for target, color in zip(targets,colors):
indicesToKeep = x_pca[‘target’] == target
ax.scatter(x_pca.loc[indicesToKeep, ‘PC1’]
, x_pca.loc[indicesToKeep, ‘PC2’]
, c = color
, s = 50)
ax.legend(targets)
ax.grid()


Kernel PCA(KPCA)

主成分剖析运用线性变换,这是它的局限性。KPCA将主成分剖析扩展到非线性。首要将原始数据映射到某个非线性特征空间(一般是高维空间),然后运用PCA提取该空间的主成分。这能够经过图(B)来了解,左图中蓝点和红点是不能用任何线性变换来切割的。可是假如一切的点都投影到三维空间上,成果就变成线性可分的了!然后咱们运用PCA来别离成分。

直觉从何而来呢?为什么宋小宝老婆,微信大众-中超蔬菜,欧洲闻名中超大盘点投影到高维空间更简略别离成分呢?这要追溯到VC (Vapnik-Chervonenkis)理论。它表明,映射到高维空间一般供给更强的分类才能。

图(B):KPCA

以下Python代码使圆形图由赤色和蓝色点组成。明显,没有办法用线分隔赤色和蓝色点(线性别离)。

print(__doc__)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA, KernelPCA
from sklearn.datasets import make_circles
np.random.seed(0)
X, y = make_circles(n_samples=400, factor=.3, 52色撸noise=.05)
plt.figure(figsize=(10,10))
plt.subplot(2, 2, 1, aspect='equal')
plt.title("Original space")
reds = y == 0
blues = y == 1
plt.scatter(X[reds, 0], X[reds, 1], c="red",s=20, edgecolor='k')
plt.scatter(X[blues, 0], X[blues, 1], c="blue",s=20, edgecolor='k')
plt.xlabel("$x_1$")
plt.ylabel("$x_2$")

可是,当咱们将圆投影到更高维度的空间并运用PCA别离时,得到的第一和第二主成分是可别离的!下面是针对第一和第二主成分制作点的成果。我画了一条线来分隔红点和蓝点。在KernelPCA中,咱们指定kernel ='rbf',它是径向基函数,或Eclidiean间隔。RBF一般用作机器学习技能中的核,例如支撑向量机(SVM)。

kpca = KernelPCA(kernel=”rbf”, fit_inverse_transform=True, gamma=10)
X_kpca = kpca.fshenpokerit_transform(X)
pca 宋小宝老婆,微信大众-中超蔬菜,欧洲闻名中超大盘点= PCA()
X_pca = pca.fit_transform(X)
plt.scatter(X_kpca[reds, 0], X_kpca[reds, 1], c=”red”,s=20, edgecolor=’k’)
plt脊髓复元汤.scatter(X_kpca[blues, 0], X_kpca[blues, 1], c=”blue”,s=20, edgecolor=’k’)
x = np.linspace(-1, 1, 1000)
plt.plot(x, -0.1*x, linestyle=’solid’)
plt.title(“Projection by KPCA”)
plt.xlabel(r”1st principal component in space induced by $\phi$”)
plt.ylabel(“2nd component”)

假如咱们将核指定为如下Python代码所示的“linear”(KernelPCA(kernel= ' linear '),它就变成了规范的PCA,红点和蓝点是不行别离的。

kpca = KernelPCA(kernel=”linear”, fit_inverse_transform=True, gamma=10)
X_kpca = kpca.fit一场错爱到白头_transform(X)
pca = PCA()
X_pca = pca.fit_transform(X)
plt.scatter(X_kpca[reds, 0], X_kpca[reds, 1], c=”red”,s=20, edgecolo人妇r=’k’)
plt.scatter(X_kpca[高江高海blues, 0], X_kpca[blues, 1], c=”blue”,s=20, edgecolor=’k’)
x = np.linspace(-1, 1, 1000)
plt.plot(x, -0.1*x, linestyle=’solid’)
plt.title(“Projection by KPCA”)
plt.xlabel(r”1st principal component in space induced by $\phi$”)
plt.ylabel(“2nd component”)

线性判别剖析(LDA)

LDA的来源不同于PCA。PCA是一种将原始特征转化为一组新特征的无监督机器学习办法。咱们并不关怀新特搜集是否能够为方针变量供给最佳的区别才能。相反,线性判别剖析(LDA)在将原始数据矩阵投影到较低维空间的一同,尽可能地保存因变量的判别才能。LDA是一种监督机器学习技能。它运用因变量中的类将猜测器的空间划分为区域。一切区域都应该有线性鸿沟。因而,linear这个姓名就来源于此。该模型猜测一个区域内的一切观测值都归于同一类因变量。

LDA经过三个首要进程完成上述方针。首要,它核算因变量的不同类之间的可分性,称为类间方差,如图LDA的(1)所示。其次,它核算每个类的均值和样本之间的间隔,称为类内方差,如(2)所示。然后用这个规范结构低维空间:最大化类间方差并最小化类内方差。该规范的解决方案是核算特征值和特征向量。得到的特征向量表明新空间的方向,相应的特征值表明特征向量的长度。因而,每个特征向量表明LDA空间的一个轴,并一胎二宝爹地你不乖且特征值表明该特征向量的长度。

图:LDA

我将在Kaggle竞赛中运用“ 红酒质量 ”数据集(https://www.kaggle.com/piyushgoyal443/red-wine-dataset#wineQualityInfo.txt)。该数据集有11个输入变量和一个输出变量'qual粟米忌廉汤ity'。

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
wine = pd.rea绘空事d_csv(‘winequality-red.csv’)
wine.head()

为了简略起见,我将输出变量从头分组为三个值。 wine[‘quality2’] = np.where(wine[‘quality’]<=4,1, np.where(wine[‘quality’]<=6,2,3)).

以下代码履行PCA和LDA。

X = wine.drop(columns=[‘quality’,’quality2'])
y = wine[‘quality2’]
target_names = np.unique(y)
target_names
pca = PCA(n_激动哥components=2)
X_r = pca.fit(X).transform(X)
lda = LinearDiscriminantAnalysis(n_g1962components=2)
X_r2 = lda.fit(X, y).transform(X)

然后制作PCA和LDA的成果:

# Percentage of variance explained for each components
print(‘explained variance ratio (first two components): %s’
% str(pca.explained_variance_ratio_))
plt.figure()
colors = [‘navy’, ‘turquoise’, ‘darkorange’]
lw = 2
for color, i, target_name in zip(colors, tar菩珠蓬莱客get_names, target_names):
plt.scatter(X_r[y == i, 0], X_r[y == i, 1], color=color, alpha=.8, lw=lw,
label=target_name)
plt.legend(loc=’best’, shadow=False, scatterpoints=1)
plt.title(‘PCA of WINE dataset’北府兵统帅)
plt.figure()
for color, i, target_name in zip(colors, target_names, target_names):
plt.scatter(X_r2[y == i, 0], X_r2[y == i, 1], alpha=.8, color=color,
label=target_name)
plt.legend(loc=’best’, shadow=False, scatterpoints=1)
plt.title(‘LDA of WINE dataset’)
plt.show()

奇异值分化(SVD)

SVD是一种类似于PCA的数据汇总办法。它从数据中提取重要的特征。SVD还有一个长处:将原始机器数据集重构为小数据集。因而,它具有广泛的运用,如图画紧缩。例如,假如您有一个32*32 = 1,024像素的图画,SVD能够将其汇总为66像素。66个像素能够检索到32*32像素的图画,不会遗失重要信息。

SVD在线性代数中发挥了重要效果,但好像“并不像它应该的那样出名”,如Gilbe北方民族大学图书馆rt Strang的经典教科书“线性代数及其运用”中所述。要正确引进SVD,有必要从矩阵运算开端。假如A是一个实对称nn的矩阵,存在正交矩阵V和对角线d,使得

SVD在线性代数中一直起着重要的效果。为了正确地引进奇异值分化,有必要从矩阵运算开端。假如A是一个对称实nn矩阵,则存在一个正交矩阵V和一个对角矩阵D,使得

列V是A的特征向量,D的对角元素是A的特征值。这个进程被称为矩阵A的特征值分化,或EVD,它告知咱们怎么挑选规范正交基,以便转化由具有最简略女儿与爸爸方法的矩阵表明,即对角矩阵。

经过对对称矩阵的扩展,奇异值分化适用于任何实的mn个矩阵甲。给定m n实矩阵A,存在mm正交矩阵U,正交矩阵mm V和对角矩阵mn,使得

留意,正交矩阵是方形矩阵,它本身的乘积和它的逆矩阵是一个单位矩阵。一个对角矩阵是一个除对角线外一切元素都为零的矩阵。

下面我将再次运用iris机器学习数据集向您展现怎么运用SVD。

from numpy import *
import operator
import ma祝精隆tplotlib.pyplot as plt
import pandas as pd
from numpy.linalg import *
url = “https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
# load dataset into Pandas DataFrame
df = pd.read_csv(url, names=[‘sepal length’,’sepal width’,’petal length’,’petal width’,’target’])
# Only the X variables
data = df[[‘sepal length’,’sepal width’,’petal length’,’petal width’]]
#calculate SVD
n = 2 # We will take two Singular Values
U, s, V = linalg.svd( data )
# eye() creates a matrix with ones on the diagonal and zeros elsewhere
Sig = mat(eye(n)*s[:n])
newdata = U[:,:n]
newdata = pd.DataFrame(newdata)
newdata.columns=[‘SVD1’,’SVD2']
newdata.head()

您能够将SVD的成果与PCA的成果进行比较。

# Add the actual target to the data in order to plot it
newdata[‘target’]=df[‘target’]
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.set_xlabel(‘SVD 1’)
ax.set_ylabel(‘SVD 2’)
ax.set_title(‘SVD’)
targets = [‘Iris-setosa’, ‘Iris-versicolor’, ‘Iris-virginica’]
colors = [‘r’, ‘g’, ‘b’]
for target, color in zip(targets,colors):
indicesToKeep = newdata[‘target’] == target
ax.scatter(newdata.loc[indicesToKeep, ‘SVD1’]
, newdata.loc[indicesToKeep, ‘SVD2’]
, c = color
, s = 50)
ax.legend(targets)
ax.grid()

图:SVD

t-SNE

t-SNE是由Laurens van der Maaten和Geoggrey Hinton开发的。它是一种在二维或三维的低维空间中嵌入高维数据的可视化机器学习算法。

将上述三维瑞士卷呈现为二维的最佳方法是什么呢?直觉上,咱们期望将瑞士卷“打开”成扁平的蛋糕。在数学中,它意味着类似的点会变成邻近的点,不同的点会变成间隔点。

图(C)显现了另一个示例。它是一个三维四面体,极点处稀有据点聚类。假如咱们仅仅像Panel (a)那样将三维图折叠成二维图,那么它就不能很好地作业,由于group (a)变成了中心聚类。相比之下,Panel (B)可能是更好一些,它保存了Cluster (A)-(E)之间的间隔。t -SNE是一种非线性降维技能,旨在维护部分邻域。假如一组点集合在一个t-SNE图上,咱们能够适当必定这些点互相很挨近。

图(C):t-SNE

t-SNE对点之间的类似性进行了建模。它怎么界说类似性呢?首要,它由点Xi和Xj之间的欧氏间隔界说。其次,界说为条件概率,即“数据点i与点j类似度为条件概率p,即假如在高斯散布下,依据其他neighbors的概率选取数据j作为其neighbor,则该点i将选取数据j作为其neighbor。”鄙人面的条件尔后不再爱你表达式中,假如点j比其他点更挨近点i,那么挑选它的概率就更高(留意负号)。

t-SNE旨在经过点Yi和Yj之间的低维空间q匹配j和i之间的上述条件概率p ,如下所示。

下一步是找到Yi,使得散布q尽可能挨近散布p。t-SNE运用运用梯度下降法技能(一种优化技能)来查找值。

下面我将演示t-SNE技能怎么与iris数据集一同运用。

from sklearn.manifold import TSNE
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
iris = h黄load_iris()
X_tsne = TSNE宋小宝老婆,微信大众-中超蔬菜,欧洲闻名中超大盘点(learning_rate=100).fit_transform(iris.data)
X_pca = PCA().fit_transform(iris.data)
plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=iris.target)
plt.subplot(122)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=iris.target)

点击展开全文

上一篇:

下一篇:

相关推荐