b站学习链接:传送门学习视频第13 14章
学习目录索引:吴恩达2014课程简介
知识补充
闵可夫斯基距离
闵可夫斯基距离(Minkowski distance)是一种用于衡量两个点之间的距离的度量方式,它是欧几里德距离和曼哈顿距离的一般化形式。该距离以数学家 Hermann Minkowski 的名字命名,他是在19世纪末和20世纪初对几何学和数学物理学做出重要贡献的数学家之一。
在二维空间中,两个点 (x1, y1) 和 (x2, y2) 之间的闵可夫斯基距离记为 D,并定义为:
D = ((|x1 - x2|^p + |y1 - y2|^p) ^ (1/p))
其中,p 是一个常数,称为闵可夫斯基参数。当 p = 1 时,闵可夫斯基距离等同于曼哈顿距离;当 p = 2 时,闵可夫斯基距离等同于欧几里德距离。对于其他的 p 值,闵可夫斯基距离提供了在这两种距离度量之间进行平滑插值的方式。
在更高维度的空间中,闵可夫斯基距离的定义也类似,适用于 n 维空间中的点之间的距离计算。
闵可夫斯基距离的应用广泛,特别是在机器学习和数据挖掘领域,常被用于聚类、分类和回归等任务中,同时也被用于处理多维数据的距离计算。
杰卡德相似系数(Jaccard)
杰卡德相似系数(Jaccard similarity coefficient),也称为杰卡德指数,是一种用于衡量两个集合相似程度的统计量。它是以法国数学家 Paul Jaccard 的名字命名的,用于比较两个集合之间的重叠部分。
在给定两个集合 A 和 B 的情况下,杰卡德相似系数 J(A, B) 定义为两个集合交集的大小除以它们的并集的大小,用数学表达式表示为:
J(A, B) = |A ∩ B| / |A ∪ B|
其中,|A| 表示集合 A 的大小(元素个数)。
杰卡德相似系数的取值范围在 0 到 1 之间。当两个集合完全相同时,杰卡德相似系数为 1,表示两个集合完全重叠;当两个集合没有任何共同元素时,杰卡德相似系数为 0,表示两个集合没有交集。
该相似性系数常用于文本挖掘、数据挖掘、推荐系统等领域,特别是在处理集合数据和处理二元属性的情况下。例如,在文本挖掘中,可以使用杰卡德相似系数来比较文档之间的相似性,或者在推荐系统中使用它来计算用户之间的兴趣相似度。
余弦相似度
余弦相似度(cosine similarity)是一种用于衡量两个向量之间相似程度的度量方式,常用于向量空间模型和文本挖掘等领域。它通过计算两个向量之间的夹角来确定它们之间的相似性,而不是直接计算向量的绝对值或欧几里德距离。
对于给定的两个 n 维向量 A 和 B,余弦相似度 cos(θ) 定义为两个向量的内积除以它们的模的乘积,用数学表达式表示为:
cos(θ) = (A · B) / (||A|| * ||B||)
其中,
- A · B 表示向量 A 和向量 B 的内积(点积),即对应元素相乘后再求和。
- ||A|| 表示向量 A 的模(长度),即向量 A 到原点的距离。
- ||B|| 表示向量 B 的模(长度),即向量 B 到原点的距离。
余弦相似度的取值范围在 -1 到 1 之间。当余弦相似度为 1 时,表示两个向量方向完全相同,即它们的夹角为 0 度,表明两个向量非常相似;当余弦相似度为 -1 时,表示两个向量方向完全相反,即它们的夹角为 180 度,表明两个向量非常不相似;当余弦相似度为 0 时,表示两个向量互相垂直,夹角为 90 度,表明两个向量没有相关性,彼此之间完全无关。
余弦相似度通常用于文本挖掘中的文档相似性计算、推荐系统中的用户兴趣相似度、图像处理中的图像相似性等。由于它只考虑向量的方向而不考虑向量的大小,因此在某些情况下对于数据的大小变化不敏感,更适用于描述数据的方向特征。
协方差
协方差(covariance)是一种用于衡量两个随机变量之间关联性或线性相关性的统计量。它描述了两个随机变量如何一起变化,即它们的变化趋势是否相似或相反。
给定两个随机变量 X 和 Y,其协方差记为 Cov(X, Y),计算公式如下:
Cov(X, Y) = Σ [(Xᵢ - μₓ) * (Yᵢ - μᵧ)] / N
其中,
- Xᵢ 和 Yᵢ 分别是 X 和 Y 的第 i 个观察值。
- μₓ 是 X 的均值(期望值)。
- μᵧ 是 Y 的均值(期望值)。
- N 是观测的总数量。
协方差的取值范围没有固定的上下限。当 Cov(X, Y) > 0 时,表示 X 和 Y 存在正向线性关系,即当一个变量增加时,另一个变量也增加;当 Cov(X, Y) < 0 时,表示 X 和 Y 存在负向线性关系,即当一个变量增加时,另一个变量减少;当 Cov(X, Y) ≈ 0 时,表示 X 和 Y 之间没有线性关系或者线性关系非常弱。
需要注意的是,协方差仅描述了两个随机变量之间的线性关系,如果两个变量之间存在非线性关系,协方差可能无法捕捉到这种关系。此外,协方差的数值大小受到变量本身尺度的影响,因此不便于直接比较不同数据集的相关性。
为了消除尺度的影响并标准化相关性度量,通常会使用相关系数,如皮尔逊相关系数,它是通过协方差除以两个变量的标准差得到的。
协方差矩阵
协方差矩阵(Covariance Matrix)是一种用于衡量多个随机变量之间关系的矩阵。对于具有 n n n个特征的数据集,协方差矩阵是一个 n × n n \times n n×n的方阵,其中的元素表示不同特征之间的协方差。
对于包含 m m m个数据样本的数据集,假设每个数据样本有 n n n个特征,可以将数据集表示为一个 m × n m \times n m×n的矩阵 X X X,其中每行表示一个数据样本,每列表示一个特征。
协方差矩阵的元素 C o v ( X i , X j ) Cov(X_i, X_j) Cov(Xi,Xj)表示第 i i i个特征和第 j j j个特征之间的协方差,计算公式如下:
C o v ( X i , X j ) = 1 m − 1 ∑ k = 1 m ( X k i − X i ˉ ) ( X k j − X j ˉ ) Cov(X_i, X_j) = \frac{1}{m-1} \sum_{k=1}^{m} (X_{ki} - \bar{X_i}) (X_{kj} - \bar{X_j}) Cov(Xi,Xj)=m−11∑k=1m(Xki−Xiˉ)(Xkj−Xjˉ)
其中, X k i X_{ki} Xki和 X k j X_{kj} Xkj分别表示第 k k k个样本的第 i i i个特征和第 j j j个特征的值, X i ˉ \bar{X_i} Xiˉ和 X j ˉ \bar{X_j} Xjˉ分别表示第 i i i个特征和第 j j j个特征的样本均值。
协方差矩阵的对角线元素 C o v ( X i , X i ) Cov(X_i, X_i) Cov(Xi,Xi)表示每个特征自身的方差,而非对角线元素 C o v ( X i , X j ) Cov(X_i, X_j) Cov(Xi,Xj)表示不同特征之间的协方差。
在数据分析和机器学习中,协方差矩阵是一个重要的工具,它可以用于研究特征之间的相关性、进行特征选择、以及执行主成分分析(PCA)等降维技术。在PCA中,我们通过对协方差矩阵进行特征值分解,得到数据的主成分(特征向量)和它们对应的方差(特征值)。
标准差
标准差(Standard Deviation)是一种衡量数据分散程度的统计量。对于一组数据,它是每个数据点与平均值的偏差的平方的平均值的平方根。标准差用来描述数据的波动性或变化程度,值越大表示数据的离散程度越大,值越小表示数据的离散程度越小。
对于一组数据 X X X,它的标准差 σ \sigma σ 计算公式如下:
σ = 1 N ∑ i = 1 N ( X i − μ ) 2 \sigma = \sqrt{\frac{1}{N} \sum_{i=1}^{N} (X_i - \mu)^2} σ=N1∑i=1N(Xi−μ)2
其中, N N N是数据的样本数量, X i X_i Xi 是第 i i i 个数据点, μ \mu μ是数据的平均值。
在PCA算法中,对数据进行标准化(归一化)处理是为了确保所有特征都在相同的尺度上进行分析。这样做有助于避免特征尺度的影响,使得PCA算法更加稳定和有效。标准化的步骤为 (X - X.mean()) / X.std()
,其中 X.mean()
表示数据的平均值,X.std()
表示数据的标准差。通过这个步骤,数据的每个特征都会独立地具有均值为0和标准差为1的特性。
单位矩阵
单位矩阵(Identity matrix),也称为恒等矩阵或单位阵,是一个特殊的方阵,在线性代数和矩阵理论中有重要的作用。单位矩阵是一个 n × n 的矩阵,其对角线上的元素全为 1,而其它位置上的元素全为 0。用数学符号表示为:
I = | 1 0 0 ... 0 |
| 0 1 0 ... 0 |
| 0 0 1 ... 0 |
| . . . ... . |
| 0 0 0 ... 1 |
其中,I_ij 表示单位矩阵中第 i 行第 j 列的元素。
单位矩阵的性质:
- 乘法单位:任何矩阵 A 与单位矩阵相乘,结果仍为矩阵 A,即 A × I = I × A = A。
- 单位元:单位矩阵在矩阵乘法中的作用类似于数学中的乘法单位元(1 对于实数或复数)。
单位矩阵在线性代数和矩阵计算中非常重要,它类似于数学中的 1,具有保持矩阵性质不变的作用。在矩阵运算中,单位矩阵常用于表示恒等变换,例如对一个向量进行单位矩阵的乘法,结果仍为原始向量。
单位矩阵也是方阵的一种特殊情况,方阵是指行数等于列数的矩阵。对于单位矩阵,其对角线上的元素全为 1,而其它位置上的元素全为 0,这使得它在矩阵乘法和逆矩阵等运算中扮演重要的角色。
对角矩阵
对角矩阵(Diagonal matrix)是一种特殊的方阵,其所有非对角元素均为零。换句话说,对角矩阵的非对角元素只在主对角线上(从左上角到右下角)具有非零值,其它位置的元素均为零
一个 n × n 的对角矩阵可以表示为:
D = | d₁ 0 0 ... 0 |
| 0 d₂ 0 ... 0 |
| 0 0 d₃ ... 0 |
| . . . . |
| 0 0 0 ... dₙ |
其中,d₁, d₂, d₃, ..., dₙ 表示对角元素,其它位置的元素均为零。
对角矩阵具有一些重要的性质和特点:
- 矩阵乘法:对角矩阵和任何其他矩阵相乘,结果仍为对角矩阵。对角矩阵和非零向量相乘,相当于对向量的每个分量进行缩放,缩放因子由对角元素给出。
- 行列式:对角矩阵的行列式等于对角元素的乘积,即 |D| = d₁ _ d₂ _ d₃ _ ... _ dₙ。
- 逆矩阵:对角矩阵的逆矩阵存在当且仅当对角元素均不为零,且其逆矩阵的对角元素为原对角元素的倒数。
对角矩阵在线性代数和数值计算中具有广泛的应用,它们在各种问题中都具有重要的作用。例如,在特征值分解中,一个方阵的对角化就是将其变换为对角矩阵,对角矩阵的对角元素就是原矩阵的特征值。对角矩阵也常用于线性方程组的求解和行列式的计算。
由于对角矩阵的特殊性质,它们在数学和工程应用中经常出现,且在某些情况下可以简化计算和推导过程。
实对称矩阵
实对称矩阵(Real symmetric matrix)是一个特殊的方阵,它满足以下条件:矩阵的转置等于它本身。换句话说,如果 A 是一个 n × n 的实对称矩阵,则满足 A^T = A。
实对称矩阵具有一些重要的性质和特点:
- 对角元素:实对称矩阵的对角元素一定是实数,因为它们等于自己的转置,转置操作不会改变对角元素。
- 零元素:由于实对称矩阵的转置等于它本身,所以 A_ij = A_ji,即非对角元素是对称的。因此,当 i ≠ j 时,如果 A_ij = 0,则 A_ji 也等于 0。
- 特征值:实对称矩阵的特征值都是实数。这使得特征值和特征向量的计算变得更加简便,特征向量之间也是正交的。
实对称矩阵在数学和工程中非常重要,它们在很多应用中都有广泛的应用,特别是在线性代数、信号处理、机器学习和物理学等领域。一些常见的应用包括:
- 特征值分解:实对称矩阵的特征值分解非常高效,可以通过正交变换得到对角矩阵,其中对角元素是特征值。
- 正交对角化:实对称矩阵可以通过正交相似变换变成对角矩阵,对角元素是特征值,对应的正交矩阵的列向量是特征向量。
- 特征脸识别:在图像处理和计算机视觉中,实对称矩阵常用于特征脸(Eigenfaces)识别,用于人脸识别和人脸表情分析等任务。
由于实对称矩阵的特殊性质,它们在很多算法和数学推导中都起着重要作用,并且具有较好的数值稳定性。
正交矩阵
正交矩阵(Orthogonal matrix)是一个特殊的方阵,它具有一些重要的性质。一个 n × n 的实矩阵 A 被称为正交矩阵,如果满足以下条件:
A^T _ A = A _ A^T = I
其中,A^T 表示 A 的转置,I 是单位矩阵。
正交矩阵具有以下重要性质:
- 行列式:正交矩阵的行列式的绝对值等于 1,即 |det(A)| = 1。这是因为行列式的值等于矩阵的所有特征值的乘积,而正交矩阵的特征值的模长都为 1。
- 逆矩阵:正交矩阵是可逆的,且其逆矩阵也是正交矩阵。即如果 A 是正交矩阵,则 A^-1 也是正交矩阵。
- 行向量和列向量正交性:正交矩阵的行向量和列向量两两之间都是正交的。也就是说,如果 A 的第 i 行和第 j 行不相同,则 A 的第 i 列和第 j 列是正交的。
正交矩阵在几何变换和向量空间变换中有重要的应用。由于正交矩阵保持向量的长度不变并保持向量之间的夹角,因此它们通常用于旋转、镜像和刚体变换等几何变换。在向量空间中,正交矩阵是一个线性变换,它保持向量的内积不变,因此在线性代数和信号处理中有重要的作用。
一些常见的正交矩阵包括:
- 旋转矩阵:用于绕坐标轴或空间中的某个点旋转向量。
- 反射矩阵:用于沿着某个平面反射向量。
- 剪切矩阵:用于在向量空间中进行剪切变换。
正交矩阵的性质使得它们在很多数学和工程应用中具有重要地位,尤其在计算机图形学、计算机视觉、机器学习和控制系统等领域有广泛的应用。
矩阵的特征向量
矩阵的特征向量是在线性代数中与矩阵相关的重要概念。对于一个 n × n 的矩阵 A,如果存在一个非零向量 v 和一个标量 λ,使得下面的方程成立:
A * v = λ * v
其中,v 是非零向量,称为特征向量,λ 是对应于特征向量 v 的特征值。
换句话说,特征向量 v 经过矩阵 A 的线性变换后,结果与原特征向量 v 的方向相同(可能是相反的)但长度可能不同,长度的变化由特征值 λ 决定。
寻找矩阵的特征向量和特征值对于许多问题非常重要,例如在数据降维、信号处理、图像处理、机器学习等领域。特征向量和特征值的性质可以提供关于矩阵的重要信息。
要找到一个矩阵的特征向量和特征值,需要解决矩阵的特征方程:
det(A - λ * I) = 0
其中,det 表示矩阵的行列式,I 是单位矩阵。解特征方程得到的 λ 就是矩阵的特征值。然后,将每个特征值代入方程 (A - λ * I) * v = 0 中求解非零向量 v,得到的 v 就是对应于该特征值的特征向量。
一个 n × n 矩阵 A 可能有 n 个特征向量和 n 个特征值(可能有重复特征值)。对于实对称矩阵,特征向量是正交的,即不同特征值对应的特征向量之间的内积为 0。
特征向量和特征值的应用广泛,它们在诸如主成分分析(PCA)、奇异值分解(SVD)、特征脸识别等问题中都起着重要作用。
奇异值分解
奇异值分解(Singular Value Decomposition,简称SVD)是一种在线性代数和数值计算中常用的矩阵分解方法。它将一个矩阵分解为三个矩阵的乘积,从而提取出矩阵的重要特征,广泛应用于数据降维、信号处理、图像压缩、推荐系统等领域。
给定一个 m × n 的实数矩阵 A,其奇异值分解可以表示为以下形式:
A = UΣV^T
其中,
- U 是一个 m × m 的正交矩阵,其列向量是 A × A^T(A 的转置)的特征向量,这些特征向量称为左奇异向量。
- Σ 是一个 m × n 的对角矩阵,其对角线上的元素称为奇异值,通常按照从大到小的顺序排列。
- V 是一个 n × n 的正交矩阵,其列向量是 A^T × A 的特征向量,这些特征向量称为右奇异向量。
奇异值分解的一个重要特性是,奇异值按照从大到小的顺序排列,这意味着前面的奇异值对应的左奇异向量和右奇异向量包含了矩阵 A 中最重要的信息,可以用于数据降维。通常情况下,我们可以保留排名前 k 个奇异值对应的部分,从而得到一个近似矩阵 A_k:
A_k ≈ U[:, 1:k] × Σ[1:k, 1:k] × V^T[:, 1:k]
其中 U[:, 1:k] 表示 U 矩阵的前 k 列,Σ[1:k, 1:k] 表示 Σ 矩阵的前 k 个对角元素和对应的零元素,V^T[:, 1:k] 表示 V 矩阵的前 k 列的转置。
奇异值分解在很多领域都有重要应用,例如在图像处理中的图像压缩,通过保留较少的奇异值可以压缩图像并去除噪声;在推荐系统中,可以使用奇异值分解对用户-物品评分矩阵进行分解,从而进行推荐预测。
课堂笔记
十三、聚类(Clustering)
13.1 无监督学习:简介
参考视频: 13 - 1 - Unsupervised Learning_ Introduction (3 min).mkv
在这个视频中,我将开始介绍聚类算法。这将是一个激动人心的时刻,因为这是我们学习的第一个非监督学习算法。我们将要让计算机学习无标签数据,而不是此前的标签数据。
那么,什么是非监督学习呢?在课程的一开始,我曾简单的介绍过非监督学习,然而,我们还是有必要将其与监督学习做一下比较。
在一个典型的监督学习中,我们有一个有标签的训练集,我们的目标是找到能够区分正样本和负样本的决策边界,在这里的监督学习中,我们有一系列标签,我们需要据此拟合一个假设函数。与此不同的是,在非监督学习中,我们的数据没有附带任何标签,我们拿到的数据就是这样的:
在这里我们有一系列点,却没有标签。因此,我们的训练集可以写成只有 x ( 1 ) x^{(1)} x(1), x ( 2 ) x^{(2)} x(2)......一直到 x ( m ) x^{(m)} x(m)。我们没有任何标签 y y y。因此,图上画的这些点没有标签信息。也就是说,在非监督学习中,我们需要将一系列无标签的训练数据,输入到一个算法中,然后我们告诉这个算法,快去为我们找找这个数据的内在结构给定数据。我们可能需要某种算法帮助我们寻找一种结构。图上的数据看起来可以分成两个分开的点集(称为簇),一个能够找到我圈出的这些点集的算法,就被称为聚类算法。
这将是我们介绍的第一个非监督学习算法。当然,此后我们还将提到其他类型的非监督学习算法,它们可以为我们找到其他类型的结构或者其他的一些模式,而不只是簇。
我们将先介绍聚类算法。此后,我们将陆续介绍其他算法。那么聚类算法一般用来做什么呢?
在这门课程的早些时候,我曾经列举过一些应用:比如市场分割。也许你在数据库中存储了许多客户的信息,而你希望将他们分成不同的客户群,这样你可以对不同类型的客户分别销售产品或者分别提供更适合的服务。社交网络分析:事实上有许多研究人员正在研究这样一些内容,他们关注一群人,关注社交网络,例如Facebook ,Google+,或者是其他的一些信息,比如说:你经常跟哪些人联系,而这些人又经常给哪些人发邮件,由此找到关系密切的人群。因此,这可能需要另一个聚类算法,你希望用它发现社交网络中关系密切的朋友。我有一个朋友正在研究这个问题,他希望使用聚类算法来更好的组织计算机集群,或者更好的管理数据中心。因为如果你知道数据中心中,那些计算机经常协作工作。那么,你可以重新分配资源,重新布局网络。由此优化数据中心,优化数据通信。
最后,我实际上还在研究如何利用聚类算法了解星系的形成。然后用这个知识,了解一些天文学上的细节问题。好的,这就是聚类算法。这将是我们介绍的第一个非监督学习算法。在下一个视频中,我们将开始介绍一个具体的聚类算法。
13.2 K-均值算法
参考视频: 13 - 2 - K-Means Algorithm (13 min).mkv
K-均值 是最普及的聚类算法,算法接受一个未标记的数据集,然后将数据聚类成不同的组。
K-均值是一个迭代算法,假设我们想要将数据聚类成n个组,其方法为:
首先选择 K K K个随机的点,称为聚类中心 (cluster centroids);
对于数据集中的每一个数据,按照距离 K K K个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类。
计算每一个组的平均值,将该组所关联的中心点移动到平均值的位置。
重复步骤2-4直至中心点不再变化。
下面是一个聚类示例:
迭代 1 次
迭代 3 次
迭代 10 次
用 μ 1 μ^1 μ1, μ 2 μ^2 μ2,..., μ k μ^k μk 来表示聚类中心,用 c ( 1 ) c^{(1)} c(1), c ( 2 ) c^{(2)} c(2),..., c ( m ) c^{(m)} c(m)来存储与第 i i i个实例数据最近的聚类中心的索引,K-均值算法的伪代码如下:
Repeat {
for i = 1 to m
c(i) := index (form 1 to K) of cluster centroid closest to x(i)
for k = 1 to K
μk := average (mean) of points assigned to cluster k
}
算法分为两个步骤,第一个for 循环是赋值步骤,即:对于每一个样例 i i i,计算其应该属于的类。第二个for 循环是聚类中心的移动,即:对于每一个类 K K K,重新计算该类的质心。
K-均值 算法也可以很便利地用于将数据分为许多不同组,即使在没有非常明显区分的组群的情况下也可以。下图所示的数据集包含身高和体重两项特征构成的,利用K-均值 算法将数据分为三类,用于帮助确定将要生产的T-恤衫的三种尺寸。
13.3 优化目标
参考视频: 13 - 3 - Optimization Objective (7 min).mkv
K-均值最小化问题,是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和,因此
K-均值的代价函数(又称畸变函数 Distortion function)为:
J ( c ( 1 ) , . . . , c ( m ) , μ 1 , . . . , μ K ) = 1 m ∑ i = 1 m ∥ X ( i ) − μ c ( i ) ∥ 2 J(c^{(1)},...,c^{(m)},μ_1,...,μ_K)=\dfrac {1}{m}\sum^{m}{i=1}\left\| X^{\left( i\right) }-\mu{c^{(i)}}\right\| ^{2} J(c(1),...,c(m),μ1,...,μK)=m1∑i=1m X(i)−μc(i) 2
其中 μ c ( i ) {{\mu }_{{{c}^{(i)}}}} μc(i)代表与 x ( i ) {{x}^{(i)}} x(i)最近的聚类中心点。
我们的的优化目标便是找出使得代价函数最小的 c ( 1 ) c^{(1)} c(1), c ( 2 ) c^{(2)} c(2),..., c ( m ) c^{(m)} c(m)和 μ 1 μ^1 μ1, μ 2 μ^2 μ2,..., μ k μ^k μk:
回顾刚才给出的:
K-均值 迭代算法,我们知道,第一个循环是用于减小 c ( i ) c^{(i)} c(i)引起的代价,而第二个循环则是用于减小 μ i {{\mu }_{i}} μi引起的代价。迭代的过程一定会是每一次迭代都在减小代价函数,不然便是出现了错误。
13.4 随机初始化
参考视频: 13 - 4 - Random Initialization (8 min).mkv
在运行K-均值算法的之前,我们首先要随机初始化所有的聚类中心点,下面介绍怎样做:
- 我们应该选择 K < m K<m K<m,即聚类中心点的个数要小于所有训练集实例的数量
- 随机选择 K K K个训练实例,然后令 K K K个聚类中心分别与这 K K K个训练实例相等
K-均值 的一个问题在于,它有可能会停留在一个局部最小值处,而这取决于初始化的情况。
为了解决这个问题,我们通常需要多次运行K-均值 算法,每一次都重新进行随机初始化,最后再比较多次运行K-均值 的结果,选择代价函数最小的结果。这种方法在 K K K较小的时候(2--10)还是可行的,但是如果 K K K较大,这么做也可能不会有明显地改善。
13.5 选择聚类数
参考视频: 13 - 5 - Choosing the Number of Clusters (8 min).mkv
没有所谓最好的选择聚类数的方法,通常是需要根据不同的问题,人工进行选择的。选择的时候思考我们运用K-均值 算法聚类的动机是什么,然后选择能最好服务于该目的标聚类数。
对于上图也可以分为2类,由于这些数据没有标签,因此并没有一个正确的答案。
当人们在讨论,选择聚类数目的方法时,有一个可能会谈及的方法叫作"肘部法则"。关于"肘部法则",我们所需要做的是改变 K K K值,也就是聚类类别数目的总数。我们用一个聚类来运行K均值 聚类方法。这就意味着,所有的数据都会分到一个聚类里,然后计算成本函数或者计算畸变函数 J J J。 K K K代表聚类数字。
我们可能会得到一条类似于这样的曲线。像一个人的肘部。这就是"肘部法则"所做的,让我们来看这样一个图,看起来就好像有一个很清楚的肘在那儿。好像人的手臂,如果你伸出你的胳膊,那么这就是你的肩关节、肘关节、手。这就是"肘部法则"。你会发现这种模式,它的畸变值会迅速下降,从1到2,从2到3之后,你会在3的时候达到一个肘点。在此之后,畸变值就下降的非常慢,看起来就像使用3个聚类来进行聚类是正确的,这是因为那个点是曲线的肘点,畸变值下降得很快, K = 3 K=3 K=3之后就下降得很慢,那么我们就选 K = 3 K=3 K=3。当你应用"肘部法则"的时候,如果你得到了一个像上面这样的图,那么这将是一种用来选择聚类个数的合理方法。
例如,我们的 T-恤制造例子中,我们要将用户按照身材聚类,我们可以分成3个尺寸: S , M , L S,M,L S,M,L,也可以分成5个尺寸 X S , S , M , L , X L XS,S,M,L,XL XS,S,M,L,XL,这样的选择是建立在回答"聚类后我们制造的T-恤是否能较好地适合我们的客户"这个问题的基础上作出的。这种就是根据实际需要选择K
总结一下:大部分时候,聚类数量K仍然通过手动输入或由我们的经验决定,一种可以尝试的办法是"肘部法则",但是我们不能期望他每次都有效果,更好的做法是,找到我们运行k均值聚类的目的是什么,哪个k能满足我们的需求。
聚类参考资料:
1.相似度/距离计算方法总结
(1). 闵可夫斯基距离Minkowski /(其中欧式距离: p = 2 p=2 p=2)
d i s t ( X , Y ) = ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 p dist(X,Y)={{\left( {{\sum\limits_{i=1}^{n}{\left| {{x}{i}}-{{y}{i}} \right|}}^{p}} \right)}^{\frac{1}{p}}} dist(X,Y)=(i=1∑n∣xi−yi∣p)p1
(2). 杰卡德相似系数(Jaccard):
J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ J(A,B)=\frac{\left| A\cap B \right|}{\left|A\cup B \right|} J(A,B)=∣A∪B∣∣A∩B∣
(3). 余弦相似度(cosine similarity):
n n n维向量 x x x和 y y y的夹角记做 θ \theta θ,根据余弦定理,其余弦值为:
c o s ( θ ) = x T y ∣ x ∣ ⋅ ∣ y ∣ = ∑ i = 1 n x i y i ∑ i = 1 n x i 2 ∑ i = 1 n y i 2 cos (\theta )=\frac{{{x}^{T}}y}{\left|x \right|\cdot \left| y \right|}=\frac{\sum\limits_{i=1}^{n}{{{x}{i}}{{y}{i}}}}{\sqrt{\sum\limits_{i=1}^{n}{{{x}{i}}^{2}}}\sqrt{\sum\limits{i=1}^{n}{{{y}_{i}}^{2}}}} cos(θ)=∣x∣⋅∣y∣xTy=i=1∑nxi2 i=1∑nyi2 i=1∑nxiyi
(4). Pearson皮尔逊相关系数:
ρ X Y = cov ( X , Y ) σ X σ Y = E [ ( X − μ X ) ( Y − μ Y ) ] σ X σ Y = ∑ i = 1 n ( x − μ X ) ( y − μ Y ) ∑ i = 1 n ( x − μ X ) 2 ∑ i = 1 n ( y − μ Y ) 2 {{\rho }{XY}}=\frac{\operatorname{cov}(X,Y)}{{{\sigma }{X}}{{\sigma }{Y}}}=\frac{E[(X-{{\mu }{X}})(Y-{{\mu }{Y}})]}{{{\sigma }{X}}{{\sigma }{Y}}}=\frac{\sum\limits{i=1}^{n}{(x-{{\mu }{X}})(y-{{\mu }{Y}})}}{\sqrt{\sum\limits_{i=1}^{n}{{{(x-{{\mu }{X}})}^{2}}}}\sqrt{\sum\limits{i=1}^{n}{{{(y-{{\mu }_{Y}})}^{2}}}}} ρXY=σXσYcov(X,Y)=σXσYE[(X−μX)(Y−μY)]=i=1∑n(x−μX)2 i=1∑n(y−μY)2 i=1∑n(x−μX)(y−μY)
Pearson相关系数即将 x x x、 y y y坐标向量各自平移到原点后的夹角余弦。
2.聚类的衡量指标
(1). 均一性: p p p
类似于精确率,一个簇中只包含一个类别的样本,则满足均一性。其实也可以认为就是正确率(每个 聚簇中正确分类的样本数占该聚簇总样本数的比例和)
(2). 完整性: r r r
类似于召回率,同类别样本被归类到相同簇中,则满足完整性;每个聚簇中正确分类的样本数占该
类型的总样本数比例的和
(3). V-measure :
均一性和完整性的加权平均
V = ( 1 + β 2 ) ∗ p r β 2 ∗ p + r V = \frac{(1+\beta^2)*pr}{\beta^2*p+r} V=β2∗p+r(1+β2)∗pr
(4). 轮廓系数
样本 i i i的轮廓系数: s ( i ) s(i) s(i)
簇内不相似度:计算样本 i i i到同簇其它样本的平均距离为 a ( i ) a(i) a(i),应尽可能小。
簇间不相似度:计算样本 i i i到其它簇 C j C_j Cj的所有样本的平均距离 b i j b_{ij} bij,应尽可能大。
轮廓系数: s ( i ) s(i) s(i)值越接近1表示样本 i i i聚类越合理,越接近-1,表示样本 i i i应该分类到 另外的簇中,近似为0,表示样本 i i i应该在边界上;所有样本的 s ( i ) s(i) s(i)的均值被成为聚类结果的轮廓系数。
s ( i ) = b ( i ) − a ( i ) m a x { a ( i ) , b ( i ) } s(i) = \frac{b(i)-a(i)}{max\{a(i),b(i)\}} s(i)=max{a(i),b(i)}b(i)−a(i)
(5). ARI
数据集 S S S共有 N N N个元素, 两个聚类结果分别是:
X = { X 1 , X 2 , . . . , X r } , Y = { Y 1 , Y 2 , . . . , Y s } X=\{{{X}{1}},{{X}{2}},...,{{X}{r}}\},Y=\{{{Y}{1}},{{Y}{2}},...,{{Y}{s}}\} X={X1,X2,...,Xr},Y={Y1,Y2,...,Ys}
X X X和 Y Y Y的元素个数为:
a = { a 1 , a 2 , . . . , a r } , b = { b 1 , b 2 , . . . , b s } a=\{{{a}{1}},{{a}{2}},...,{{a}{r}}\},b=\{{{b}{1}},{{b}{2}},...,{{b}{s}}\} a={a1,a2,...,ar},b={b1,b2,...,bs}
记: n i j = ∣ X i ∩ Y i ∣ {{n}{ij}}=\left| {{X}{i}}\cap {{Y}_{i}} \right| nij=∣Xi∩Yi∣
A R I = ∑ i , j C n i j 2 − [ ( ∑ i C a i 2 ) ⋅ ( ∑ i C b i 2 ) ] / C n 2 1 2 [ ( ∑ i C a i 2 ) + ( ∑ i C b i 2 ) ] − [ ( ∑ i C a i 2 ) ⋅ ( ∑ i C b i 2 ) ] / C n 2 ARI=\frac{\sum\limits_{i,j}{C_{{{n}{ij}}}^{2}}-\left[ \left( \sum\limits{i}{C_{{{a}{i}}}^{2}} \right)\cdot \left( \sum\limits{i}{C_{{{b}{i}}}^{2}} \right) \right]/C{n}^{2}}{\frac{1}{2}\left[ \left( \sum\limits_{i}{C_{{{a}{i}}}^{2}} \right)+\left( \sum\limits{i}{C_{{{b}{i}}}^{2}} \right) \right]-\left[ \left( \sum\limits{i}{C_{{{a}{i}}}^{2}} \right)\cdot \left( \sum\limits{i}{C_{{{b}{i}}}^{2}} \right) \right]/C{n}^{2}} ARI=21[(i∑Cai2)+(i∑Cbi2)]−[(i∑Cai2)⋅(i∑Cbi2)]/Cn2i,j∑Cnij2−[(i∑Cai2)⋅(i∑Cbi2)]/Cn2
十四、降维(Dimensionality Reduction)
14.1 动机一:数据压缩
参考视频: 14 - 1 - Motivation I_ Data Compression (10 min).mkv
这个视频,我想开始谈论第二种类型的无监督学习问题,称为降维。有几个不同的的原因使你可能想要做降维。一是数据压缩,后面我们会看了一些视频后,数据压缩不仅允许我们压缩数据,因而使用较少的计算机内存或磁盘空间,但它也让我们加快我们的学习算法。
但首先,让我们谈论降维是什么。作为一种生动的例子,我们收集的数据集,有许多,许多特征,我绘制两个在这里。
假设我们未知两个的特征: x 1 x_1 x1:长度:用厘米表示; x 2 x_2 x2:是用英寸表示同一物体的长度。
所以,这给了我们高度冗余表示,也许不是两个分开的特征 x 1 x_1 x1和 x 2 x_2 x2,这两个基本的长度度量,也许我们想要做的是减少数据到一维,只有一个数测量这个长度。这个例子似乎有点做作,这里厘米英寸的例子实际上不是那么不切实际的,两者并没有什么不同。
将数据从二维降至一维:
假使我们要采用两种不同的仪器来测量一些东西的尺寸,其中一个仪器测量结果的单位是英寸,另一个仪器测量的结果是厘米,我们希望将测量的结果作为我们机器学习的特征。现在的问题的是,两种仪器对同一个东西测量的结果不完全相等(由于误差、精度等),而将两者都作为特征有些重复,因而,我们希望将这个二维的数据降至一维。
从这件事情我看到的东西发生在工业上的事。如果你有几百个或成千上万的特征,它是它这往往容易失去你需要的特征。有时可能有几个不同的工程团队,也许一个工程队给你二百个特征,第二工程队给你另外三百个的特征,第三工程队给你五百个特征,一千多个特征都在一起,它实际上会变得非常困难,去跟踪你知道的那些特征,你从那些工程队得到的。其实不想有高度冗余的特征一样。
多年我一直在研究直升飞机自动驾驶。诸如此类。如果你想测量------如果你想做,你知道,做一个调查或做这些不同飞行员的测试------你可能有一个特征: x 1 x_1 x1,这也许是他们的技能(直升机飞行员),也许 x 2 x_2 x2可能是飞行员的爱好。这是表示他们是否喜欢飞行,也许这两个特征将高度相关。你真正关心的可能是这条红线的方向,不同的特征,决定飞行员的能力。
将数据从三维降至二维:
这个例子中我们要将一个三维的特征向量降至一个二维的特征向量。过程是与上面类似的,我们将三维向量投射到一个二维的平面上,强迫使得所有的数据都在同一个平面上,降至二维的特征向量。
这样的处理过程可以被用于把任何维度的数据降到任何想要的维度,例如将1000维的特征降至100维。
正如我们所看到的,最后,这将使我们能够使我们的一些学习算法运行也较晚,但我们会在以后的视频提到它。
14.2 动机二:数据可视化
参考视频: 14 - 2 - Motivation II_ Visualization (6 min).mkv
在许多及其学习问题中,如果我们能将数据可视化,我们便能寻找到一个更好的解决方案,降维可以帮助我们。
假使我们有有关于许多不同国家的数据,每一个特征向量都有50个特征(如GDP ,人均GDP ,平均寿命等)。如果要将这个50维的数据可视化是不可能的。使用降维的方法将其降至2维,我们便可以将其可视化了。
这样做的问题在于,降维的算法只负责减少维数,新产生的特征的意义就必须由我们自己去发现了。
14.3 主成分分析问题
参考视频: 14 - 3 - Principal Component Analysis Problem Formulation (9 min). mkv
主成分分析(PCA)是最常见的降维算法。
在PCA 中,我们要做的是找到一个方向向量(Vector direction ),当我们把所有的数据都投射到该向量上时,我们希望投射平均均方误差能尽可能地小。方向向量是一个经过原点的向量,而投射误差是从特征向量向该方向向量作垂线的长度。
下面给出主成分分析问题的描述:
问题是要将 n n n维数据降至 k k k维,目标是找到向量 u ( 1 ) u^{(1)} u(1), u ( 2 ) u^{(2)} u(2),..., u ( k ) u^{(k)} u(k)使得总的投射误差最小。主成分分析与线性回顾的比较:
主成分分析与线性回归是两种不同的算法。主成分分析最小化的是投射误差(Projected Error ),而线性回归尝试的是最小化预测误差。线性回归的目的是预测结果,而主成分分析不作任何预测。
上图中,左边的是线性回归的误差(垂直于横轴投影),右边则是主要成分分析的误差(垂直于红线投影)。
PCA 将 n n n个特征降维到 k k k个,可以用来进行数据压缩,如果100维的向量最后可以用10维来表示,那么压缩率为90%。同样图像处理领域的KL变换 使用PCA 做图像压缩。但PCA 要保证降维后,还要保证数据的特性损失最小。
PCA技术的一大好处是对数据进行降维的处理。我们可以对新求出的"主元"向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果。同时最大程度的保持了原有数据的信息。
PCA 技术的一个很大的优点是,它是完全无参数限制的。在PCA的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后的结果只与数据相关,与用户是独立的。
但是,这一点同时也可以看作是缺点。如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。
14.4 主成分分析算法
参考视频: 14 - 4 - Principal Component Analysis Algorithm (15 min).mkv
PCA 减少 n n n维到 k k k维:
第一步是均值归一化。我们需要计算出所有特征的均值,然后令 x j = x j − μ j x_j= x_j-μ_j xj=xj−μj。如果特征是在不同的数量级上,我们还需要将其除以标准差 σ 2 σ^2 σ2。
第二步是计算协方差矩阵 (covariance matrix ) Σ (注意:这里是大写的 s i g m a ,不是求和符号) Σ(注意:这里是大写的sigma,不是求和符号) Σ(注意:这里是大写的sigma,不是求和符号):
∑ = 1 m ∑ i = 1 n ( x ( i ) ) ( x ( i ) ) T \sum=\dfrac {1}{m}\sum^{n}_{i=1}\left( x^{(i)}\right) \left( x^{(i)}\right) ^{T} ∑=m1∑i=1n(x(i))(x(i))T
这里x是一个 n ∗ 1 n*1 n∗1矩阵,最终为n*n矩阵
第三步是计算协方差矩阵 Σ Σ Σ的特征向量 (eigenvectors):
在 Octave 里我们可以利用奇异值分解 (singular value decomposition )来求解,[U, S, V]= svd(sigma)
。
S i g m a = 1 m ∑ i = 1 n ( x ( i ) ) ( x ( i ) ) T Sigma=\dfrac {1}{m}\sum^{n}_{i=1}\left( x^{(i)}\right) \left( x^{(i)}\right) ^{T} Sigma=m1∑i=1n(x(i))(x(i))T
对于一个 n × n n×n n×n维度的矩阵,上式中的 U U U是一个具有与数据之间最小投射误差的方向向量构成的矩阵。如果我们希望将数据从 n n n维降至 k k k维,我们只需要从 U U U中选取前 k k k个向量,获得一个 n × k n×k n×k维度的矩阵,我们用 U r e d u c e U_{reduce} Ureduce表示,然后通过如下计算获得要求的新特征向量 z ( i ) z^{(i)} z(i):
z ( i ) = U r e d u c e T ∗ x ( i ) z^{(i)}=U^{T}_{reduce}*x^{(i)} z(i)=UreduceT∗x(i)
其中 x x x是 n × 1 n×1 n×1维的,因此结果为 k × 1 k×1 k×1维度。注,我们不对方差特征进行处理。
14.5 选择主成分的数量(先看下一节,再看这节课)
参考视频: 14 - 5 - Choosing The Number Of Principal Components (13 min).mkv
上图中手写的第一行表示点到投影点距离的平方
主要成分分析是减少投射的平均均方误差:
训练集的方差为: 1 m ∑ i = 1 m ∥ x ( i ) ∥ 2 \dfrac {1}{m}\sum^{m}_{i=1}\left\| x^{\left( i\right) }\right\| ^{2} m1∑i=1m x(i) 2
我们希望在平均均方误差与训练集方差的比例尽可能小的情况下选择尽可能小的 k k k值。
如果我们希望这个比例小于1%,就意味着原本数据的方差有99%都保留下来了,如果我们选择保留95%的方差,便能非常显著地降低模型中特征的维度了。==》这里其实就是方差越大有越多的特征被保留了?
我们可以先令 k = 1 k=1 k=1,然后进行主要成分分析,获得 U r e d u c e U_{reduce} Ureduce和 z z z,然后计算比例是否小于1%。如果不是的话再令 k = 2 k=2 k=2,如此类推,直到找到可以使得比例小于1%的最小 k k k 值(原因是各个特征之间通常情况存在某种相关性)。
还有一些更好的方式来选择 k k k,当我们在Octave 中调用"svd "函数的时候,我们获得三个参数:[U, S, V] = svd(sigma)
。
其中的 S S S是一个 n × n n×n n×n的矩阵,只有对角线上有值,而其它单元都是0,我们可以使用这个矩阵来计算平均均方误差与训练集方差的比例:
1 m ∑ i = 1 m ∥ x ( i ) − x a p p r o x ( i ) ∥ 2 1 m ∑ i = 1 m ∥ x ( i ) ∥ 2 = 1 − Σ i = 1 k S i i Σ i = 1 m S i i ≤ 1 % \dfrac {\dfrac {1}{m}\sum^{m}{i=1}\left\| x^{\left( i\right) }-x^{\left( i\right) }{approx}\right\| ^{2}}{\dfrac {1}{m}\sum^{m}{i=1}\left\| x^{(i)}\right\| ^{2}}=1-\dfrac {\Sigma^{k}{i=1}S_{ii}}{\Sigma^{m}{i=1}S{ii}}\leq 1\% m1∑i=1m x(i) 2m1∑i=1m x(i)−xapprox(i) 2=1−Σi=1mSiiΣi=1kSii≤1%
也就是: Σ k i = 1 s i i Σ n i = 1 s i i ≥ 0.99 \frac {\Sigma{k}{i=1}s{ii}}{\Sigma{n}{i=1}s{ii}}\geq0.99 Σni=1siiΣki=1sii≥0.99
在压缩过数据后,我们可以采用如下方法来近似地获得原有的特征: x ( i ) a p p r o x = U r e d u c e z ( i ) x^{\left( i\right) }{approx}=U{reduce}z^{(i)} x(i)approx=Ureducez(i)
总结一下:我经常选择k,当我用pca压缩数据时,在协方差矩阵上调用svd函数,然后用上图的公式选择最小的k值,如果你要手动选择k值,例如你有1000个特征,但是你只想选k=100,你需要告诉别人上面的公式计算出来的你保留的方差百分比是多少,通过这个数值可以了解到你和原始数据的相似程度。
14.6 重建的压缩表示
参考视频: 14 - 6 - Reconstruction from Compressed Representation (4 min).mkv
在以前的视频中,我谈论PCA作为压缩算法。在那里你可能需要把1000维的数据压缩100维特征,或具有三维数据压缩到一二维表示。所以,如果这是一个压缩算法,应该能回到这个压缩表示,回到你原有的高维数据的一种近似。
所以,给定的 z ( i ) z^{(i)} z(i),这可能100维,怎么回到你原来的表示 x ( i ) x^{(i)} x(i),这可能是1000维的数组?
PCA 算法,我们可能有一个这样的样本。如图中样本 x ( 1 ) x^{(1)} x(1), x ( 2 ) x^{(2)} x(2)。我们做的是,我们把这些样本投射到图中这个一维平面。然后现在我们需要只使用一个实数,比如 z ( 1 ) z^{(1)} z(1),指定这些点的位置后他们被投射到这一个三维曲面。给定一个点 z ( 1 ) z^{(1)} z(1),我们怎么能回去这个原始的二维空间呢? x x x为2维, z z z为1维, z = U r e d u c e T x z=U^{T}{reduce}x z=UreduceTx,相反的方程为: x a p p o x = U r e d u c e ⋅ z x{appox}=U_{reduce}\cdot z xappox=Ureduce⋅z, x a p p o x ≈ x x_{appox}\approx x xappox≈x。如图:
如你所知,这是一个漂亮的与原始数据相当相似。所以,这就是你从低维表示 z z z回到未压缩的表示。我们得到的数据的一个之间你的原始数据 x x x,我们也把这个过程称为重建原始数据。
当我们认为试图重建从压缩表示 x x x 的初始值。所以,给定未标记的数据集,您现在知道如何应用PCA ,你的带高维特征 x x x和映射到这的低维表示 z z z。这个视频,希望你现在也知道如何采取这些低维表示 z z z,映射到备份到一个近似你原有的高维数据。
现在你知道如何实施应用PCA ,我们将要做的事是谈论一些技术在实际使用PCA 很好,特别是,在接下来的视频中,我想谈一谈关于如何选择 k k k。
14.7 主成分分析法的应用建议
参考视频: 14 - 7 - Advice for Applying PCA (13 min).mkv
假使我们正在针对一张 100×100像素的图片进行某个计算机视觉的机器学习,即总共有10000 个特征。
- 第一步是运用主要成分分析将数据压缩至1000个特征
- 然后对训练集运行学习算法
- 在预测时,采用之前学习而来的 U r e d u c e U_{reduce} Ureduce将输入的特征 x x x转换成特征向量 z z z,然后再进行预测
注:如果我们有交叉验证集合测试集,也采用对训练集学习而来的 U r e d u c e U_{reduce} Ureduce。
错误的主要成分分析情况:一个常见错误使用主要成分分析的情况是,将其用于减少过拟合(减少了特征的数量)。这样做非常不好,不如尝试正则化处理。原因在于主要成分分析只是近似地丢弃掉一些特征,它并不考虑任何与结果变量有关的信息,因此可能会丢失非常重要的特征。然而当我们进行正则化处理时,会考虑到结果变量,不会丢掉重要的数据。
另一个常见的错误是,默认地将主要成分分析作为学习过程中的一部分,这虽然很多时候有效果,最好还是从所有原始特征开始,只在有必要的时候(算法运行太慢或者占用太多内存)才考虑采用主要成分分析。
作业练习
知识补充
作业描述
在本练习中,您将实现K-means聚类算法,并将其应用于压缩图像。在第二部分中,您将使用主成分分析来找到人脸图像的低维表示。在开始编程练习之前,我们强烈建议您观看视频讲座,并完成相关图片的复习问题。ex7data1.mat-主成分分析的示例数据集
ex7data2.mat-K-means的示例数据集
ex7faces.mat-面数据集
bird small.png-示例图像
均值聚类法(K-means Clustering)
在本练习中,您将实现K-means算法并将其用于图像压缩。您将首先从一个示例2D数据集开始,该数据集将帮助您获得K-means算法如何工作的直觉。之后,您将使用K-means算法进行图像压缩,将图像中出现的颜色数量减少到该图像中最常见的颜色。这部分练习将使用ex7.m。
实施K均值
K-means算法是一种自动将相似数据示例聚类在一起的方法。具体地说,给你一个训练集 { x ( 1 ) , x ( 2 ) , . . . , x ( m ) } \{x^{(1)},x^{(2)},...,x^{(m)}\} {x(1),x(2),...,x(m)}(其中 x ( i ) ∈ R n x^{(i)} \in \R^n x(i)∈Rn),并希望将数据分组为几个有凝聚力的"聚类"。K-means背后的直觉是一个迭代过程,从猜测初始质心开始,然后通过重复将示例分配给它们最近的质心,然后根据分配重新计算质心来细化这种猜测。
K-means算法如下:
python
% Initialize centroids
centroids = kMeansInitCentroids(X, K);
for iter = 1:iterations
% Cluster assignment step: Assign each data point to the
% closest centroid. idx(i) corresponds to cˆ(i), the index
% of the centroid assigned to example i
idx = findClosestCentroids(X, centroids);
% Move centroid step: Compute means based on centroid
% assignments
centroids = computeMeans(X, idx, K);
end
该算法的内环重复执行两个步骤:(i)将每个训练示例 x ( i ) x^{(i)} x(i)分配给其最近的质心,以及(ii)使用分配给它的点重新计算每个质心的平均值。K-means算法将始终收敛到质心的某个最终均值集。注意,收敛的解可能并不总是理想的,并且取决于质心的初始设置。因此,在实践中,K-means算法通常在不同的随机初始化下运行几次。在来自不同随机初始化的这些不同解决方案之间进行选择的一种方法是选择具有最低成本函数值(失真)的解决方案。
在接下来的章节中,您将分别实现K-means算法的两个阶段。
寻找最近的质心
在K均值算法的"聚类分配"阶段,该算法根据当前聚类中心的位置,将每个训练样本 x ( i ) x^{(i)} x(i)分配给距离其最近的质心。具体而言,对于每个样本 i,我们将其分配给最近的质心。
其中, c ( i ) c^{(i)} c(i)是最接近 x ( i ) x^{(i)} x(i)的质心的索引, µ j µ_j µj是第j个质心的位置(值)。请注意, c ( i ) c^{(i)} c(i)对应于启动器代码中的idx(i)。
您的任务是完成findClosestCentroids.m中的代码。此函数获取数据矩阵X和质心内所有质心的位置,并应输出一个一维数组idx,该数组保存与每个训练示例最近质心的索引( { 1 , . . . . , K } \{1,....,K\} {1,....,K},其中K是质心的总数)。
您可以在每个训练示例和每个质心上使用循环来实现这一点。
一旦您在findClosestCentroids.m中完成了代码,脚本ex7.m将运行您的代码,您应该会看到与前3个示例的质心分配相对应的输出[1 3 2]。
计算质心均值(Centroid Means)
在给定每个点到质心的分配后,算法的第二阶段重新计算每个质心所分配的点的均值。具体来说,对于每个质心 k,我们进行如下设置:
其中, C k C_k Ck 表示被分配给质心 k 的示例集合。具体来说,如果两个示例 x ( 3 ) x^{(3)} x(3)和 x ( 5 ) x^{(5)} x(5) 被分配给质心 k = 2,则应该更新 µ 2 = 1 2 ( x ( 3 ) + x ( 5 ) ) µ_2 = \frac{1}{2}(x^{(3)} + x^{(5)}) µ2=21(x(3)+x(5))。
您现在需要完成 computeCentroids.m 中的代码。您可以使用循环来遍历质心,也可以使用循环遍历示例;但是,如果您可以使用向量化的实现方式而不使用这样的循环,您的代码可能会运行得更快。
一旦您完成了 computeCentroids.m 中的代码,脚本 ex7.m 将运行您的代码,并在 Kmeans 的第一步之后输出质心。
示例数据集上的K-均值
完成两个函数(findClosestCentroids和computeCentroids)后,ex7.m中的下一步将在玩具2D数据集上运行K-means算法,以帮助您了解K-means是如何工作的。函数是从runKmeans.m脚本内部调用的。我们鼓励您查看该函数以了解其工作原理。请注意,代码调用了您在循环中实现的两个函数。
当您运行下一步时,K-means代码将生成一个可视化,在每次迭代中逐步了解算法的进度。按enter键多次可以查看K-means算法的每一步如何更改质心和簇指定。最后,您的图应该如图1所示。
随机初始化
ex7.m中示例数据集的质心的初始分配是为了让您看到与图1中相同的图而设计的。在实践中,初始化质心的一个好策略是从训练集中随机选择示例。
在练习的这一部分中,您应该使用以下代码完成函数kMeansInitCentroids.m:
python
% Initialize the centroids to be random examples
% Randomly reorder the indices of examples
randidx = randperm(size(X, 1));
% Take the first K examples as centroids
centroids = X(randidx(1:K), :);
上面的代码首先随机排列示例的索引(使用randperm)。然后,它基于索引的随机排列来选择前K个示例。这允许随机选择示例,而不存在两次选择同一示例的风险。
用K均值进行图像压缩
在本练习中,您将把K-means应用于图像压缩。在图像的直接24位颜色表示中,每个像素表示为三个8位无符号整数(范围从0到255),指定红色、绿色和蓝色强度值。这种编码通常被称为RGB编码。我们的图像包含数千种颜色,在这部分练习中,您将把颜色的数量减少到16种。
通过进行这种缩小,可以以有效的方式表示(压缩)照片。具体来说,您只需要存储16种选定颜色的RGB值,对于图像中的每个像素,您现在只需要存储该位置的颜色索引(其中仅需要4位来表示16种可能性)。
在本练习中,您将使用K-means算法来选择将用于表示压缩图像的16种颜色。具体来说,您将把原始图像中的每个像素都作为数据示例,并使用K-means算法来找到在三维RGB空间中对像素进行最佳分组(聚类)的16种颜色。计算出图像上的簇质心后,将使用16种颜色替换原始图像中的像素。
像素上的K-均值
在Octave/MATLAB中,可以按如下方式读取图像:
python
% Load 128x128 color image (bird small.png)
A = imread('bird small.png');
% You will need to have installed the image package to used
% imread. If you do not have the image package installed, you
% should instead change the following line to
% %
load('bird small.mat'); % Loads the image into the variable A
这创建了三维矩阵A,其前两个索引标识像素位置,其最后一个索引表示红色、绿色或蓝色。例如,A(50,33,3)给出行50和列33处的像素的蓝色强度。
ex7.m中的代码首先加载图像,然后对其进行整形,以创建像素颜色的m×3矩阵(其中m=16384=128×128),并对其调用K-means函数。
在找到表示图像的前K=16种颜色后,现在可以使用findClosestCentroids函数将每个像素位置分配给其最近的质心。这允许您使用每个像素的质心指定来表示原始图像。请注意,您已经显著减少了描述图像所需的位数。原始图像对于128×128个像素位置中的每一个都需要24个比特,因此总大小为128×128×24=393,216位。新的表示需要16种颜色的字典形式的一些开销存储,每种颜色需要24位,但图像本身每个像素位置只需要4位。因此,使用的最终位数为16×24+128×128×4=65,920比特,这对应于将原始图像压缩大约6倍。
最后,您可以通过仅基于质心指定重建图像来查看压缩的效果。具体来说,你可以用分配给它的质心的平均值来替换每个像素位置。图3显示了我们获得的重建。即使生成的图像保留了原始图像的大部分特征,我们也会看到一些压缩伪影。
可选(未分级)练习:使用自己的图片
在本练习中,修改我们提供的代码,以便在您自己的一个图像上运行。请注意,如果您的图像非常大,那么K-means可能需要很长时间才能运行。因此,我们建议您在运行代码之前将图像调整为可管理的大小。您也可以尝试更改K以查看压缩效果。
主成分分析
在本练习中,您将使用主成分分析(principal component analysis **,**PCA)来执行降维。您将首先对一个示例2D数据集进行实验,以获得PCA如何工作的直觉,然后在5000个人脸图像数据集的更大数据集上使用它。
数据集示例
为了帮助您了解主成分分析是如何工作的,您将首先从一个2D数据集开始,该数据集有一个大变化方向和一个小变化方向。脚本ex7 pca.m将绘制训练数据(图4)。在练习的这一部分中,您将看到使用主成分分析将数据从2D减少到1D时会发生什么。在实践中,您可能希望将数据从256维减少到50维;但是在这个例子中使用低维数据使我们能够更好地可视化算法。
实施PCA
在练习的这一部分中,您将实现PCA。主成分分析包括两个计算步骤:首先计算数据的协方差矩阵。然后,使用Octave/MATLAB的SVD函数计算特征向量 U 1 , U 2 , . . . . , U n U_1,U_2,....,U_n U1,U2,....,Un。这些将对应于数据变化的主要组成部分。
在使用主成分分析之前,重要的是首先通过从数据集中减去每个特征的平均值来归一化数据,并缩放每个维度,使它们处于相同的范围内。在提供的脚本ex7 pca.m中,已经使用featureNormalize函数为您执行了此规范化。
在对数据进行标准化之后,可以运行PCA来计算主成分。您的任务是完成pca.m中的代码,以计算数据集的主要组件。首先,您应该计算数据的协方差矩阵,该矩阵由以下公式给出:
其中X是以行为单位的示例的数据矩阵,m是示例的数量。注意∑是一个n×n矩阵,而不是求和算子。
计算协方差矩阵后,可以对其运行SVD来计算主分量。在Octave/MATLAB中,您可以使用以下命令运行SVD:[U,S,V]=SVD(Sigma),其中U将包含主成分,S将包含对角矩阵。
完成pca.m后,ex7 pca.m脚本将在示例数据集上运行pca,并绘制找到的相应主组件(图5)。该脚本还将输出找到的顶部主分量(特征向量),您应该会看到大约为[0.707-0.707]的输出。(Octave/MATLAB可能会输出其负值,因为U1和−U1对第一个主分量是同等有效的选择。)
PCA降维
在计算主成分后,您可以使用它们来减少数据集的特征维度,方法是将每个示例投影到较低维度的空间 x ( i ) − > z ( i ) x^{(i)}->z^{(i)} x(i)−>z(i)(例如将数据从2D投影到1D)。在练习的这一部分中,您将使用PCA返回的特征向量,并将示例数据集投影到一维空间中。
在实践中,如果你使用线性回归或神经网络等学习算法,你现在可以使用投影数据而不是原始数据。通过使用投影数据,可以更快地训练模型,因为输入中的维度更少。
将数据投影到主要组件上
您现在需要完成 projectData.m
中的代码。具体来说,您将获得数据集 X、主成分 U 和希望降低到的维数 K。您需要将 X 中的每个示例投影到 U 的前 K 个主成分上。请注意,U 中的前 K 个主成分由 U 的前 K 列给出,即 U_reduce = U(:, 1:K)。
完成了 projectData.m 中的代码后,ex7_pca.m 将把第一个示例投影到第一个维度上,您应该会看到一个约为 1.481 的值(或者如果您得到的是 -U1 而不是 U1,则可能会是 -1.481)。
重建数据的近似值
将数据投影到低维空间后,可以通过将数据投影回原始高维空间来大致恢复数据。您的任务是完成recoverData.m,将Z中的每个示例投影回原始空间,并返回X rec中恢复的近似值。
一旦您完成了recoverData.m中的代码,ex7 pca.m将恢复第一个示例的近似值,您应该会看到大约为[1.047-1.047]的值。
可视化投影
在完成projectData和recoverData之后,ex7 pca.m现在将执行投影和近似重建,以显示投影如何影响数据。在图6中,原始数据点用蓝色圆圈表示,而投影数据点用红色圆圈表示。投影有效地仅保留U1给出的方向上的信息。
人脸图像数据集
在练习的这一部分中,您将对人脸图像运行主成分分析,以了解如何在实践中使用主成分分析进行降维。数据集ex7faces.mat包含一个3 X个人脸图像的数据集,每个图像的灰度为32×32。X的每一行对应于一个面部图像(长度为1024的行矢量)。ex7 pca.m中的下一步将加载并可视化这些人脸图像中的前100张(图7)。
PCA on Faces
要在人脸数据集上运行主成分分析,我们首先通过从数据矩阵X中减去每个特征的平均值来归一化数据集。脚本ex7 PCA.m将为您执行此操作,然后运行您的主成分分析代码。运行PCA后,您将获得数据集的主要组件。请注意,U中的每个主分量(每行)都是长度为n的向量(其中,对于人脸数据集,n=1024)。事实证明,我们可以通过将这些主成分中的每一个重塑为对应于原始数据集中像素的32×32矩阵来可视化这些主成分。脚本ex7 pca.m显示了描述最大变化的前36个主要组件(图8)。如果需要,还可以更改代码以显示更多的主要组件,以查看它们如何捕获越来越多的细节。
降维
既然已经计算了人脸数据集的主要组件,就可以使用它来减少人脸数据集。这允许您使用较小输入大小(例如,100个维度)的学习算法,而不是原始的1024个维度。这有助于加快你的学习算法。
ex7 pca.m中的下一部分将人脸数据集仅投影到前100个主成分上。具体地,现在通过向量 z ( i ) ∈ R 100 z^{(i)}\in \R^{100} z(i)∈R100来描述每个面部图像。
为了了解降维过程中损失了什么,您可以仅使用投影的数据集来恢复数据。在ex7 pca.m中,对数据进行近似恢复,并并排显示原始和投影的人脸图像(图9)。从重建中,你可以观察到面部的总体结构和外观得到了保留,而精细的细节却丢失了。这是数据集大小的显著减少(超过10倍),有助于显著加快学习算法。例如,如果你正在训练一个神经网络来执行人物识别(对人脸图像进行识别,预测人物的身份),你可以使用仅100个维度的降维输入,而不是原始像素。
可选(未分级)练习:用于可视化的PCA
在前面的K-means图像压缩练习中,您在三维RGB空间中使用了K-means算法。在ex7 pca.m脚本的最后一部分中,我们提供了使用scatter3函数可视化该3D空间中的最终像素分配的代码。每个数据点都根据其分配到的簇进行着色。您可以在图上拖动鼠标来旋转和检查三维数据。
事实证明,在三维或更大维度上可视化数据集可能很麻烦。因此,即使以丢失一些信息为代价,通常也希望仅以2D显示数据。在实践中,主成分分析通常用于降低数据的维度,以实现可视化目的。在ex7 pca.m的下一部分中,脚本将把pca的实现应用于三维数据,将其简化为二维数据,并将结果可视化为二维散点图。主成分分析投影可以被认为是选择最大化数据分布的视图的旋转,该视图通常对应于"最佳"视图。
作业提交路径
总结
网上有很多动态的演示效果能够帮助我们理解,具体的可以自行搜索。
- 演示网站:传送门