机器学习——主成分分析及sklearn实现

前言:数学知识太复杂,似懂非懂

机器学习专栏机器学习专栏

一、主成分分析原理

主成分分析(Principal components analysis,以下简称PCA)是最重要的降维方法之一。由于各变量间存在一定的相关关系,因此有可能用较少的综合指标分别综合存在于各变量中的各类信息,在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用。
首先考虑一个问题:对于正交属性空间中的样本点,如何用一个超平面(直线的高维推广)对所有样本进行恰当的表达?可以想到,若存在这样的超平面,那么它大概具有这样的性质:

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

二、最近重构性和最大可分性

1、最近重构性

首先对数据样本的每个属性进行中心化,即 ∑ i = 1 m x j ( i ) = 0 \sum_{i=1}^{m} x_j^{(i)}=0 i=1mxj(i)=0。设投影变换后新空间坐标系为 { w 1 , w 2 , . . . , w n } \{w_1,w_2,...,w_n\} {w1,w2,...,wn},其中 w i w_i wi是标准正交向量基( ∣ ∣ w i ∣ ∣ 2 = 1 , w i T w j = 0 ||w_i||_2=1,w_i^Tw_j=0 wi2=1,wiTwj=0)。
现我们要求降维,即丢弃新坐标系中的部分坐标( n ′ < n n'<n n<n),则样本点 x ( i ) x^{(i)} x(i)在低维坐标系中的投影是 z ( i ) = ( z 1 ( i ) , z 2 ( i ) , . . . , z n ′ ( i ) ) z^{(i)}=(z^{(i)}_1,z^{(i)}_2,...,z^{(i)}_{n'}) z(i)=(z1(i),z2(i),...,zn(i)),其中 z j ( i ) = w j T x ( i ) z^{(i)}_j=w^T_jx^{(i)} zj(i)=wjTx(i)
若基于 z ( i ) z^{(i)} z(i)来重构 x ( i ) x^{(i)} x(i),则会得到 x ( i ) ^ = ∑ j = 1 n ′ z j ( i ) w j \hat{x^{(i)}}=\sum_{j=1}^{n'}z^{(i)}_jw_j x(i)^=j=1nzj(i)wj,则考虑整个训练集,原样本点 x ( i ) x^{(i)} x(i)和新样本点 x ( i ) ^ \hat{x^{(i)}} x(i)^的距离为:
∑ i = 1 m ∣ ∣ x ( i ) ^ − x ( i ) ∣ ∣ 2 2 = ∑ i = 1 m z ( i ) T z ( i ) − 2 ∑ i = 1 m z ( i ) T W T x ( i ) + c o n s t ∝ − t r ( W T ( ∑ i = 1 m x ( i ) x ( i ) T ) ) \sum_{i=1}{m}||\hat{x^{(i)}}-x^{(i)}||_2^2=\sum_{i=1}^{m}{z^{(i)}}^{T}z^{(i)}-2\sum_{i=1}^{m}{z^{(i)}}^TW^Tx^{(i)}+const \\\qquad \qquad \quad\propto -tr(W^T(\sum_{i=1}^{m}x^{(i)}{x^{(i)}}^T)) i=1mx(i)^x(i)22=i=1mz(i)Tz(i)2i=1mz(i)TWTx(i)+consttr(WT(i=1mx(i)x(i)T))
其中, W = ( w 1 , w 2 , . . . , w n ) W=(w_1,w_2,...,w_n) W=(w1,w2,...,wn)。根据最小重构性,得:
m i n W − t r ( W T X X T W ) s . t . W T W = I \mathop{min} \limits_W \quad -tr(W^TXX^TW) \\ s.t. W^TW=I Wmintr(WTXXTW)s.t.WTW=I

2、最大可分性

从最大可分性角度出发,应该使投影后的样本点的方差最大化
在这里插入图片描述
投影后样本点的协方差矩阵是 ∑ i = 1 m W T x ( i ) x ( i ) T W \sum_{i=1}^{m}W^Tx^{(i)}{x^{(i)}}^TW i=1mWTx(i)x(i)TW,于是优化目标为:
m a x W t r ( W T X X T W ) s . t . W T W = I \mathop{max} \limits_W \quad tr(W^TXX^TW) \\ s.t. W^TW=I Wmaxtr(WTXXTW)s.t.WTW=I
对上式使用拉格朗日乘子法得:
X X T w ( j ) = λ j w j XX^Tw^{(j)}=\lambda_jw_j XXTw(j)=λjwj
对协方差矩阵 X X T XX^T XXT进行特征值分解,将求得的特征值排序: λ 1 ≥ λ 2 . . . ≥ λ n \lambda_1\geq \lambda_2...\geq \lambda_n λ1λ2...λn,再取前 n ′ n' n个特征值对应的特征值构成 W ∗ = ( w 1 , w 2 , . . . , w n ′ ) W^*=(w_1,w_2,...,w_{n'}) W=(w1,w2,...,wn),这就是主成分分析的解。( n ′ n' n个主成分)

三、sklearn实现PCA

# -*- coding:utf-8 -*-
"""
@author: 1
@file: PCA.py
@time: 2019/12/4 20:38
"""


import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn.decomposition import PCA           # 加载PCA算法包
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn import svm
import pandas as pd


df = pd.read_csv(r'D:\workspace\python\machine learning\data\iris.csv')
X = df.iloc[:, 0:4]
Y = df.iloc[:, 4]
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
pca = PCA(n_components=2)       # 加载PCA算法,设置降维后主成分数目为2
reduced_x = pca.fit_transform(X)  # 对样本进行降维
reduced_x = pd.DataFrame(reduced_x)

# SVM分类
x_train, x_test, y_train, y_test = train_test_split(reduced_x, Y, test_size=0.2)
clf = svm.SVC(gamma='scale', decision_function_shape="ovr")    # 一对多法
# clf = svm.SVC(gamma='scale', decision_function_shape='ovo')  # 一对一法
clf.fit(x_train, y_train)
y_pred = clf.predict(x_test)


# 可视化,画分类结果图
N, M = 500, 500  # 横纵各采样多少个值
x1_min, x2_min = x_train.min(axis=0)
x1_max, x2_max = x_train.max(axis=0)
t1 = np.linspace(x1_min, x1_max, N)
t2 = np.linspace(x2_min, x2_max, M)
x1, x2 = np.meshgrid(t1, t2)  # 生成网格采样点
x_show = np.stack((x1.flat, x2.flat), axis=1)  # 测试点
y_predict = clf.predict(x_show)
cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
plt.pcolormesh(x1, x2, y_predict.reshape(x1.shape), cmap=cm_light)
plt.scatter(x_train.iloc[:, 0], x_train.iloc[:, 1], c=y_train, cmap=cm_dark, marker='o', edgecolors='k')
plt.grid(True, ls=':')
plt.show()

分类结果图:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tao_RY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值