东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 3762|回复: 4

[课堂笔记] PCA主成分分析:核心的思想

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14418
QQ
发表于 2019-9-13 09:56:17 | 显示全部楼层 |阅读模式


PCA主成分分析:核心的思想


  1. import numpy as np


  2. class PCA:

  3.     def __init__(self, n_components):
  4.         """初始化PCA"""
  5.         assert n_components >= 1, "n_components must be valid"
  6.         self.n_components = n_components
  7.         self.components_ = None

  8.     def fit(self, X, eta=0.01, n_iters=1e4):
  9.         """获得数据集X的前n个主成分"""
  10.         assert self.n_components <= X.shape[1], \
  11.             "n_components must not be greater than the feature number of X"

  12.         def demean(X):
  13.             return X - np.mean(X, axis=0)

  14.         def f(w, X):
  15.             return np.sum((X.dot(w) ** 2)) / len(X)

  16.         def df(w, X):
  17.             return X.T.dot(X.dot(w)) * 2. / len(X)

  18.         def direction(w):
  19.             return w / np.linalg.norm(w)

  20.         def first_component(X, initial_w, eta=0.01, n_iters=1e4, epsilon=1e-8):

  21.             w = direction(initial_w)
  22.             cur_iter = 0

  23.             while cur_iter < n_iters:
  24.                 gradient = df(w, X)
  25.                 last_w = w
  26.                 w = w + eta * gradient
  27.                 w = direction(w)
  28.                 if (abs(f(w, X) - f(last_w, X)) < epsilon):
  29.                     break

  30.                 cur_iter += 1

  31.             return w

  32.         X_pca = demean(X)
  33.         self.components_ = np.empty(shape=(self.n_components, X.shape[1]))
  34.         for i in range(self.n_components):
  35.             initial_w = np.random.random(X_pca.shape[1])
  36.             w = first_component(X_pca, initial_w, eta, n_iters)
  37.             self.components_[i,:] = w

  38.             X_pca = X_pca - X_pca.dot(w).reshape(-1, 1) * w

  39.         return self

  40.     def transform(self, X):
  41.         """将给定的X,映射到各个主成分分量中"""
  42.         assert X.shape[1] == self.components_.shape[1]

  43.         return X.dot(self.components_.T)

  44.     def inverse_transform(self, X):
  45.         """将给定的X,反向映射回原来的特征空间"""
  46.         assert X.shape[1] == self.components_.shape[0]

  47.         return X.dot(self.components_)

  48.     def __repr__(self):
  49.         return "PCA(n_components=%d)" % self.n_components
复制代码


pca.png
var.png
二维降到一维的最佳方案.png
pca的本质就是最优化问题.png
求第二主成分pca.png
求第二主成分pca2.png
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14418
QQ
 楼主| 发表于 2019-9-13 11:25:57 | 显示全部楼层
PCA主成分分析
from sklearn.decomposition import PCA
pca = PCA(n_components=1)
pca.fit(X)
pca.components_
X_reduction = pca.transform(X)
X_reduction.shape

X_restore = pca.inverse_transform(X_reduction)

X_restore.shape
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14418
QQ
 楼主| 发表于 2019-9-13 11:27:46 | 显示全部楼层
东方耀 发表于 2019-9-13 11:25
PCA主成分分析
from sklearn.decomposition import PCA
pca = PCA(n_components=1)
  1. X_reduction = pca.transform(X)
  2. X_reduction.shape

  3. X_restore = pca.inverse_transform(X_reduction)
复制代码
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14418
QQ
 楼主| 发表于 2019-9-13 11:37:23 | 显示全部楼层
东方耀 发表于 2019-9-13 11:25
PCA主成分分析
from sklearn.decomposition import PCA
pca = PCA(n_components=1)

pca = PCA(0.9)  表示:只保留90%的信息 并不是原来维度的90%
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14418
QQ
 楼主| 发表于 2019-9-13 16:32:57 | 显示全部楼层
使用PCA对数据降维的过程可能会降噪
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-3-29 04:46 , Processed in 0.191599 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表