无监督学习的降维算法及应用

PCA算法及应用

主成分分析(PCA)

主成分分析(Principal Component Analysis,PCA)是最常用的一种降维方法,通常用于高位数据集的探索与可视化,还可以用作数据压缩和预处理等。

PCA可以吧具有相关性的高位变量合称为线性无关的低维变量,称为主成分。主成分能够尽可能保留原始数据的信息。

相关术语

方差

方差是各个样本和样本均值的差和平方和的均值,用来度量一组数据的分散程度。

协方差

协方差用于度量两个变量之间的线性相关程度,若两个变量的协方差为0,则可认为二者线性无关。协方差矩阵则是由变量的协方差值构成的矩阵(对称阵)。

特征向量

矩阵的特征向量是描述数据集结构的非零向量,并满足如下公式

A是方阵,v是特征向量,λ是特征值

原理

原理:矩阵的主成分就是其协方差矩阵对应的特征向量,按照对应的特征值大小进行排序,最大的特征值就是第一主成分,其次是第二主成分,以此类推。

PCA算法应用

需求

PCA实现高维数据可视化
已知鸢尾花数据是4维的,共三类样本。使用PCA实现对鸢尾花数据进行降维,实现在二维平面上的可视化。

实现过程

  1. 建立工程,导入sklearn相关包
  2. 加载数据并进行降维
  3. 按类别对降维后的数据进行保存
  4. 降维后数据点的可视化

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 23 15:12:43 2019

@author: Jiaxi Wang
"""

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
pca = PCA(n_components = 2)
reduced_X = pca.fit_transform(X)

red_x, red_y = [], []
blue_x, blue_y = [], []
green_x, green_y = [], []

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

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

结果

拓展&改进

NMF算法及实例

非负矩阵分解(NMF)

非负矩阵分解(Non-negative Matrix Factorization,NMF)实在矩阵中所有元素均为非负数约束条件之下的矩阵分解方法。

基本思想:给定一个非负矩阵V,NMF能够找到一个非负矩阵W和一个非负矩阵H,使得矩阵W和H的乘积近似等于矩阵V中的值。

  • W矩阵:基础图像矩阵,相当于从原矩阵V中抽取出来的特征。
  • 矩阵:系数矩阵。
  • NMF能够广泛应用于图像分析、文本挖掘和语音处理等领域。

矩阵分解优化目标:最小化W矩阵H矩阵的乘积和原始矩阵之间的差别。

基于KL的优化目标,损失函数如下:

NMF算法应用

需求

现有某大学校园网的日志数据,290条大学生的校园网使用情况数据,数据包括用户ID,设备MAC地址,IP地址,开始上网时间,停止上网时间,上网时长,校园网套餐等。利用已有数据,分析学生的上网模式。

需求

NMF人脸数据特征提取
目标:Olivetti人脸数据共400个,每个数据是64*64大小。由于NMF分解得到的W矩阵相当于从原始矩阵中提取的特征,那么就可以使用NMF对400个人脸数据进行特征提取。

思路

通过设置k的大小,设置提取的特征的数目。在本实验中设置k=6,随后将提取的特征以图像的形式展示出来。

  1. 建立工程,引入相关包
  2. 设置基本参数并加载数据
  3. 设置图像的展示方式
  4. 创建特征提取的对象NMF,使用PCA作为对比
  5. 降维后数据点的可视化

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# -*- coding: utf-8 -*-
"""
Created on Wed Apr 24 10:41:47 2019

@author: Jiaxi Wang
"""

from numpy.random import RandomState
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_olivetti_faces
from sklearn import decomposition


n_row, n_col = 2, 3
n_components = n_row * n_col
image_shape = (64, 64)


###############################################################################
# Load faces data
dataset = fetch_olivetti_faces(shuffle=True, random_state=RandomState(0))
faces = dataset.data

###############################################################################
def plot_gallery(title, images, n_col=n_col, n_row=n_row):
plt.figure(figsize=(2. * n_col, 2.26 * n_row))
plt.suptitle(title, size=16)

for i, comp in enumerate(images):
plt.subplot(n_row, n_col, i + 1)
vmax = max(comp.max(), -comp.min())

plt.imshow(comp.reshape(image_shape), cmap=plt.cm.gray,
interpolation='nearest', vmin=-vmax, vmax=vmax)
plt.xticks(())
plt.yticks(())
plt.subplots_adjust(0.01, 0.05, 0.99, 0.94, 0.04, 0.)


plot_gallery("First centered Olivetti faces", faces[:n_components])
###############################################################################

estimators = [
('Eigenfaces - PCA using randomized SVD',
decomposition.PCA(n_components=6,whiten=True)),

('Non-negative components - NMF',
decomposition.NMF(n_components=6, init='nndsvda', tol=5e-3))
]

###############################################################################

for name, estimator in estimators:
print("Extracting the top %d %s..." % (n_components, name))
print(faces.shape)
estimator.fit(faces)
components_ = estimator.components_
plot_gallery(name, components_[:n_components])

plt.show()

结果展示