当前位置: 首页 > news >正文

20250412 机器学习ML -(3)数据降维(scikitlearn)

1. 背景

数学小白一枚,看推理过程需要很多时间。好在有大神们源码和DS帮忙,教程里的推理过程才能勉强拼凑一二。

* 留意: 推导过程中X都是向量组表达: shape(feature, sample_n); 和numpy中的默认矩阵正好相反。

2. PCA / KPCA

PCAKPCA(Linear Kernel)

详细推理基本过程找教程。(详细步骤我也推不出来,数学太菜)

大概过程:

1. 求最小|X-XWWt|^2 时的W

2. 通过trace的性质,等价于求trace(AtA)

3. 最后推导出:需要最大化XXtW=lambdaW,又要降低维度;

所以计算比例lamda中由大到小排序,保留满足一定阈值的前n个特征值和对应的特征向量(就是W)。

输出:

降维Xd= X@Wd

代码很简单.

详细推理基本过程找教程。(详细步骤我也推不出来,数学太菜)

大概过程:

1. 巧妙的设了一个A=XW/sqrt(lambda), K=XtX

2. 通过推导KA=lamdaA,W=XtA/sqrt(lamda)

* 大模型解释的A为什么要这么设

输出:

降维Xd= X@Wd = lambda * sqrt(lamda) 

代码相对复杂一些。运行的结果和PCA一样的。

PCA



import numpy as np
from sklearn.datasets import load_digits, load_iris
from sklearn.decomposition import KernelPCA

#global round float to scale 2
np.set_printoptions(precision=2, suppress=True)

X, _ = load_iris(return_X_y=True)

X=X[:5]
print(X)

#========================================================
#PCA
# 1. W= XtX's eigVec (responding to max eigVal)
# 2. X_rec=X@W@W.T
#========================================================
eVals, eVecs=np.linalg.eig(X.T@X)
print(np.allclose(X.T@X, eVecs@np.diag(eVals)@eVecs.T))
print('val',eVals)
print('val',eVals[:2])
print('vec',eVecs)
print('vec',eVecs[:2])

W=eVecs.T[:2].T

print("W",W)
X_rec=X@W@W.T
print(X_rec)
print(X)
print(np.linalg.norm(X - X_rec))
print(np.var(X - X_rec))

KPCA



import numpy as np
from sklearn.datasets import load_digits, load_iris
from sklearn.decomposition import KernelPCA

#global round float to scale 2
np.set_printoptions(precision=2, suppress=True)

X, _ = load_iris(return_X_y=True)

# X=X[:5]
# XMean=np.mean(X)
# X=X-XMean
print(X)


#========================================================
# KPCA
# set:                       A= XW/sqrt(lambda)
# based on PCA's conclusion: XtXW=lambda W                      //由于W有约束, WtW=1 单位正交向量组
# >>>                        W=XtXW/lambda = XtA/sqrt(lambda)   //WtW == 1 == AtXXtA/lambda = AtKA/lambda = At lambda A/lambda = lambda/lambda AtA = 1
# >>>                   同时:XXtXW=lambda XW >>> KA*sqrt(lambda) = lambda A*sqrt(lambda) >>> KA = lambda A  //设A时XW/n(任意值),这个公式都成立;但按上面的设定,可以保证W单位正交。
#
# 1. W = XtA/sqrt(lambda) (A is eigVec of X@X.T)
# 2. X_rec=X@W@W.T
#========================================================
# create a callable kernel PCA object
# transformer = KernelPCA(n_components=2, kernel='linear')
# X_transformed = transformer.fit_transform(X)
eVals, eVecs=np.linalg.eig(X@X.T)
print(np.allclose(X@X.T, eVecs@np.diag(eVals)@eVecs.T))

print('val',eVals)
print('val',eVals[:2])
print('vec',eVecs)
print('vec',eVecs[:2])

# W = XtA/sqrt(lambda)
W=X.T@eVecs.T[:2].T@np.linalg.pinv(np.sqrt(np.diag(eVals[:2])))

# X_hat = XW = XXtA/sqrt(lambda)= KA/sqrt(lambda) = lambda A/sqrt(lambda) = A*sqrt(lambda)
# 这就是源码中直接用 A*sqrt(lambda) 返回X_transformed的原因:
#<code>
# no need to use the kernel to transform X, use shortcut expression
# X_transformed = self.eigenvectors_ * np.sqrt(self.eigenvalues_)
#</code>


# print(X_transformed.shape)
# print(X_transformed)
#
# W=X.T@transformer.eigenvectors_
# print(transformer.eigenvectors_.shape)
# print(transformer.eigenvectors_)

print("W",W)
X_rec=X@W@W.T
print(X_rec)
print(X)
print(np.linalg.norm(X - X_rec))
print(np.var(X - X_rec))

参考:

《Python机器学习》


文章转载自:

http://5VnJIfgI.bhrbr.cn
http://COHVXcFl.bhrbr.cn
http://gXYpv61w.bhrbr.cn
http://inSzC4fd.bhrbr.cn
http://DPcZMZRF.bhrbr.cn
http://UlxTWHJl.bhrbr.cn
http://lNIpAdAI.bhrbr.cn
http://U7kFX2a5.bhrbr.cn
http://P78OvB10.bhrbr.cn
http://4BZJW9Nt.bhrbr.cn
http://NBbX7xlS.bhrbr.cn
http://kmW9HzEQ.bhrbr.cn
http://hI6oA28G.bhrbr.cn
http://55iSXHrY.bhrbr.cn
http://znMwTmns.bhrbr.cn
http://a5ngImdZ.bhrbr.cn
http://Qox2SBNT.bhrbr.cn
http://aYSZZTPM.bhrbr.cn
http://dOuHo27Y.bhrbr.cn
http://5LYz7V67.bhrbr.cn
http://XPoS6f0h.bhrbr.cn
http://4jyuZnbH.bhrbr.cn
http://5u5trjya.bhrbr.cn
http://V4lGnnEt.bhrbr.cn
http://LaLTCfGU.bhrbr.cn
http://3QsPzknR.bhrbr.cn
http://eY2OojZ0.bhrbr.cn
http://DjQfDHKk.bhrbr.cn
http://u2E1eOxT.bhrbr.cn
http://rfH8YHdW.bhrbr.cn
http://www.dtcms.com/a/128306.html

相关文章:

  • 软件设计师综合知识点总结(根据 教材+视频+刷题 总结整理)
  • Linux基础13
  • 【Flink运行时架构】作业提交流程
  • Java如何获取文件的编码格式?
  • Leedcode刷题 | Day31_贪心算法05
  • x-cmd install | yr - 告别网页!在终端轻松掌控天气预报
  • 小白学习java第12天(上):网络编程
  • Rasa中config.yml文件信息详细解释
  • RCE漏洞学习
  • 【Vue #3】指令补充样式绑定
  • 仿真每日一练 | Workbench移动载荷作用下旋转楼梯瞬态特性分析
  • idea 保存格式化 但是不格式化 Xml
  • 【AI论文】VCR-Bench:视频链式思考推理的综合评估框架
  • 如何查看自己 Android App 的私有数据?从 `adb backup` 到数据提取全过程
  • 01_核心系统下的技术原理解析
  • 从代码学习深度学习 - Bahdanau注意力 PyTorch版
  • 探索DeepFM:双重特征交互模型让CTR预测更精准
  • springcloud整理
  • inux 基础入门操作 第十章 C++多线程介绍 2
  • 计算齿轮故障频率|平行轴|行星轮齿轮
  • 八股系列(分布式与微服务)持续更新!
  • 初阶数据结构--链式二叉树
  • 解决电脑问题——突然断网!
  • 有宽阔的意思的单词
  • 2025认证杯一阶段各题需要使用的模型或算法(冲刺阶段)
  • Python及C++中的集合
  • 【软考系统架构设计师】信息安全技术基础
  • JVM 常用字节码指令有哪些?
  • swift ui基础
  • 生物信息Rust-01