| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 哈工大2022机器学习实验三&四:KMeans&PCA -> 正文阅读 |
|
[人工智能]哈工大2022机器学习实验三&四:KMeans&PCA |
由于课时压缩,两个实验一起提交,故把这两个实验合并成一篇博客。因为这两部分的知识点之前我正好都写过博客(KMeans,PCA;但是当时的代码写得不太简练,这篇博客里会重置一遍),所以这篇博客会没有前两篇实验详细,还请谅解。 实验三:KMeans这个实验原来还包含GMM的部分,但是压缩后只做KMeans的部分就可以了。简单介绍一下KMeans:KMeans是一种常用的聚类算法,在给定聚类数
k
k
k后,它的目标是最小化平方误差 输入:样本集
D
=
{
x
1
,
x
2
,
.
.
.
,
x
N
}
;
D=\{\pmb x_1,\pmb x_2,...,\pmb x_N\};
D={xx1?,xx2?,...,xxN?};聚类簇数
k
.
k.
k. 如果不想看上述伪代码,KMeans的主要流程可以用文字描述如下: 下面我们仍用
然后我们编写KMeans算法:
代码中只有一行不是那么简洁明了: 实验的主要部分已经编写完,下面我们运行KMeans并将其可视化。主函数如下:
运行结果如下图所示。 实验四:PCA该实验要求用PCA(主成分分析)对高维数据进行降维。我们在这里仅给出PCA的算法步骤,理论推导在文章开篇的链接中。PCA步骤如下:
1.
将原始数据矩阵
R
d
×
N
标准化
:
x
i
j
=
r
i
j
?
r
i
ˉ
,
得到矩阵
X
;
(
R
的每一列是一个样本
)
1. 将原始数据矩阵R_{d \times N}标准化:x_{ij}=r_{ij}-\bar{r_i},得到矩阵X;(R的每一列是一个样本)
1.将原始数据矩阵Rd×N?标准化:xij?=rij??ri?ˉ?,得到矩阵X;(R的每一列是一个样本) 其中第1步中,可以除以样本标准差;但是在之前的博客中发现 此外,我们在
d
d
d个主成分中只选取方差最大
k
k
k个来降维,若设这
k
k
k个主成分的特征向量组成的矩阵为
A
=
(
α
1
,
α
2
,
.
.
.
,
α
k
)
d
×
k
A=(\pmb\alpha_1,\pmb\alpha_2,...,\pmb\alpha_k)_{d\times k}
A=(αα1?,αα2?,...,ααk?)d×k?,为了将
d
d
d维样本
x
=
(
x
1
,
x
2
,
.
.
.
,
x
d
)
\pmb x=(x_1,x_2,...,x_d)
xx=(x1?,x2?,...,xd?)降成
k
k
k维,我们只需要计算
z
=
(
x
?
μ
)
A
\pmb z=(\pmb x-\pmb \mu)A
zz=(xx?μμ)A即可,其中
μ
\pmb\mu
μμ为训练时所有样本的均值(由于标准化时减去了均值再求取主成分,所以在变换时我们也应该减去该均值)。为了将其降维后的样本还原,计算
x
′
=
z
A
T
+
μ
.
\pmb x'=\pmb zA^T+\pmb \mu.
xx′=zzAT+μμ.(在
k
=
d
k=d
k=d时,这是一个可逆变换,没有信息损失,由于
A
A
A此时为正交矩阵,
A
?
1
=
A
T
A^{-1}=A^T
A?1=AT;可以理解,在
k
<
d
k<d
k<d时逆变换仍为该形式,但会损失一些原有数据,我们在这里不讨论数学细节)
之后我们用数据来测试一下PCA降维的效果。我们首先生成一个二维数据,便于可视化。我们生成一个均值为 ( 3 , 3 ) (3,3) (3,3),协方差矩阵为 ( 10 3 3 1 ) \begin{pmatrix}10 & 3\\ 3 &1\end{pmatrix} (103?31?)的 100 100 100个点的二维正态分布,代码和图像如下:
结果:
可以看到通过PCA逆变换得到的向量与原始向量非常接近。这样,我们就用一维实数代替了原先的二维向量,同时又可以将其逆变换为与原来近似的值。(前提是数据内部具有一定的规律,即可以通过旋转使某一维具有较大的方差。若数据近似于噪声,我们很难把维度显著降低) 我们再看一个更加实际的例子:用PCA对人脸数据集进行降维。ppt上CBCL database的
2429
2429
2429张
19
×
19
19\times19
19×19灰度图像数据集在官网上似乎已经停止维护(http://poggio-lab.mit.edu/codedatasets),还好还留有另一个人脸数据集(下载地址:http://cbcl.mit.edu/software-datasets/heisele/facerecognition-database.html)。但是该数据集每张人脸是
200
×
200
200 \times 200
200×200的,转化为灰度图像一个样本就是
40000
40000
40000维,PCA计算过程中的协方差矩阵就是
40000
×
400008
b
i
t
≈
1.6
G
B
40000\times400008bit≈1.6GB
40000×400008bit≈1.6GB,计算过程还需要消耗大量额外内存。为了便于实验,我把这些数据都resize成了
19
×
19
19\times19
19×19的版本(也就是
361
361
361维,可以接受),这里提供下载,可以解压后放到项目文件夹下。我们使用python的
运行结果:
下面是以不同的
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:25:53- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |