目录
条件概率的拓展
极大似然估计
- 试验1:抛硬币出现2正2反,求正面概率
-
这里涉及到贝叶斯学派与频率学派理论
- 频率学派认为其正面概率可以通过统计得到,也就是说世界是确定的,假设抛N次硬币有m个正面那么:
p ( θ ) = m N p(\theta)=\frac{m}{N} p(θ)=Nm - 而贝叶斯学派则认为,概率本身也是有先验分布的,由于我们对硬币一无所知,因此假设正面概率为均匀分布:
θ ∼ U ( 0 , 1 ) p ( θ ) = 1 \begin{aligned} \theta \thicksim U(0, 1)\\ p(\theta)=1 \end{aligned} θ∼U(0,1)p(θ)=1
- 频率学派认为其正面概率可以通过统计得到,也就是说世界是确定的,假设抛N次硬币有m个正面那么:
-
设正面概率为o
-
p(2正2反|o)=o^2 (1-o)^2,可以使得p最大
-
为方便求导,对上式取log将累乘转换成累加: log [ o 2 ( 1 − o ) 2 ] = log ( o 2 ) + log [ ( 1 − o ) 2 ] \log [o^2(1-o)^2]=\log(o^2)+\log[(1-o)^2] log[o2(1−o)2]=log(o2)+log[(1−o)2]
-
可以解出o=0.5
-
将这个计算过程称为:极大似然估计
-
- 概念
- 首先估计样本的分布,假设各个样本的概率为 p ( x i ∣ w ) p(x_i|w) p(xi∣w)
- 算法的目的为:求合适的w使得 L = ∑ i log p ( x i ∣ w ) L=\sum_i \log p(x_i|w) L=∑ilogp(xi∣w) 最大
- 试验2:抛硬币出现了1正3反,求硬币是正面的概率?
-
以极大似然估计的角度来看是0.25。
-
与我们预估有差距,预估就是先验概率。做试验之前已经可以估计结果。
-
如何使用经验纠正误差?
-
贝叶斯理论:先验概率如何给出。p(p(正))=p(o=0.5)
p ( o ∣ 1 正 3 反 ) = p ( o ) p ( 1 正 3 反 ∣ o ) p ( 1 正 3 反 ) p(o|1正3反)=\frac{p(o)p(1正3反|o)}{p(1正3反)} p(o∣1正3反)=p(1正3反)p(o)p(1正3反∣o)
此为最大后验概率(相当于在极大似然估计的基础上添加的正则化项)
-
经过先验概率修正后结果为3/8。
-
- 先验概率可以纠正样本数量较少的偏差。
- 假设在试验2之前,试验1结果是50正50反。先验概率较强。
- 如果试验2的结果是50正150反。样本数量较多的时候可以纠正先验概率的错误。
- 机器学习问题,需要样本大量的样本。样本数量越多所得结果越准确。
EM(Expectation-Maximization)算法
- 例子:硬币ABC,先抛A,如果硬币A是正面则抛B,否则抛C,记录B或C为正面是1,反面为0。假设记录为0001111011,求硬币ABC为正面的概率。
- 此时为带有隐藏变量的极大似然估计问题。
- 依然用极大似然估计 L i = log p ( x i ) L_i=\log p(x_i) Li=logp(xi),希望 L i L_i Li之和最大。但 x i x_i xi受隐藏变量 z z z约束。
- 定义下界。 L L i = log p ( x i ) − ∫ q ( z ∣ x i ) log q ( z ∣ x i ) p ( z ∣ x i ) d z LL_i=\log p(x_i)-\int q(z|x_i)\log\frac{q(z|x_i)}{p(z|x_i)}dz LLi=logp(xi)−∫q(z∣xi)logp(z∣xi)q(z∣xi)dz
- L L i = ∫ q ( z ∣ x i ) log p ( x , z ) q ( z ∣ x i ) d z LL_i=\int q(z|x_i)\log\frac{p(x, z)}{q(z|x_i)}dz LLi=∫q(z∣xi)logq(z∣xi)p(x,z)dz
- 核心想法;
- (E步)若参数 θ \theta θ已知,则可根据训练数据推断出最优隐变量 Z Z Z的值
- (M步)反之,若 Z Z Z的值已知,则可方便地对参数 θ \theta θ做极大似然估计
- 设置随机的初始参数 θ 0 \theta^0 θ0,循环E步和M步,直至收敛或完成循环次数
- 衍生K-means算法
聚类算法
K-means(约束簇)
-
线性模型
-
将空间中的点划分为n簇。
-
首先随机选择簇的中心
-
以EM思想来看
- E步-估计隐藏变量的分布
- 估计现有数据点属于哪一簇。
- 根据距离簇中心的距离估计属于哪一簇。
- M步-使得参数最大化
- 估计簇中心的位置
- 根据现有距离结果估计中心位置。
- E步-估计隐藏变量的分布
-
算法展示:
-
适用范围:各个属性无关,方差相等的。在二维空间类似球状分布
-
优点:
- 适合处理大数据集,该算法是相对可伸缩和有效率的 O(nkt), n 是对象的总数,k 是簇的个数,t 是迭代次数 k<<n, t<<n
-
缺点:
- 当结果簇紧凑,且簇与簇之间明显分离时,它的效果较好
- 该算法经常终止于局部最优解
- 适用于簇均值有定义的情况,无法处理具有分类属性的数据
- 对噪声和离群点数据敏感
- 不适合于发现非凸形状的簇
- 用户必须事先给出要生成的簇的数目k
- 初始的簇中心的选择对聚类结果影响很大
-
改进:
- K-medoids:
- k-means 方法对于脏数据很敏感,改进的 k-medoids 方法选取一个对象叫做mediod 来代替 k 均值法中的中心的作用,这样的一个 medoid就标识了这个类
- K-means 核函数
- 高斯混合模型:
- 多元正态分布:
该分布每一簇不同方向上的方差是不同的,导致在某方向上会有较大或者较小的偏差,如下图所示。对于下面三簇,肉眼可以明显的分为三类(长条状)。而K-means聚类器根据距离中心点的距离进行距离,无法准确聚类。
- 而GMM(Gaussian Mixed Model高斯混合模型)解决了上述问题,每个簇都可以用参数概率分布数学描述,整个数据就是这些分布的混合
- 多元正态分布:
- K-medoids:
DSCAN(非约束簇)
- DBSCAN属于典型的基于密度的方法 Density-Based methods
- 指导思想:只要一个区域中的点的密度大过某个阀值,就把它加到与之相近的聚类中去
- 根本区别:基于密度的方法不是基于各种各样的距离的,而是基于密度的。这样就能克服基于距离的算法只能发现“类圆形”的聚类的缺点。因此也可以解决k-means中无法解决的“多元正态分布”问题
- 参数:
- eps:搜索半径
- minsample:搜索圆内的样本数量的阈值
- 原理:
- 随机取点,当搜索圆内样本数量大于minsample,称为中心点;反之,称为边界点。
- 具有连通性的中心点被归为一类,类别附近的边界点也会被归为该类
- 代码实现:
from sklearn.datasets import make_moons, make_circles, make_blobs from sklearn.cluster import DBSCAN import numpy as np import matplotlib.pyplot as plt centers = [[0, 1], [-1, -1], [1, -1]] X, y = make_blobs(n_samples=1500, random_state=170) trs = [[0.60834549, -0.63667341], [-0.40887718, 0.85253229]] X = np.dot(X, trs) clt = DBSCAN(eps=0.3, min_samples=5) yp = clt.fit_predict(X) plt.scatter(X[:, 0], X[:, 1], c=yp, edgecolors='k') plt.title('类别数量:'+str(len(set(yp)))) plt.axis("equal") plt.show()
层次聚类(非约束簇)
- 层次方法 Hierarchical methods
- 创建给定数据对象集的层次分解
- 根据层次分解的形成方式,该方法可以分为凝聚的(自底向上)或分裂的(自顶向下)
- 凝聚层次聚类:首先将每个对象作为其簇,然后合并这些原子簇为越来越大的簇,直到所有的对象都在一个簇中,或者某个终止条件满足
- 分裂层次聚类:首先将所有对象置于一个簇中,然后将它逐渐细分为越来越小的簇,直到每个对象自成一簇,或者达到某个终止条件
- 优点:
- 不需要预先指定聚类的簇数 k,可以对树状图进行修剪获得需要的聚类数目
- 聚类结果对应更好的有意义的分类准则(meaningful taxonomies)动物族谱、语系发展史等
- 对于纯粹的层次聚类方法,一旦合并或分裂执行,就不能修正
- 改进:
- 为了弥补合并或分裂的严格性,凝聚层次方法的聚类质量可以通过以下方法改进:
分析每个层次划分中的对象链接,或者首先执行微聚类(把数据划分为“微簇”),然后使用其它聚类技术对微簇聚类
- 为了弥补合并或分裂的严格性,凝聚层次方法的聚类质量可以通过以下方法改进:
AP(非约束簇)
-
算法
跟其他聚类算法的不同之处是,AP在开始时,将所有节点都看成潜在的聚类中心,然后通过节点之间的通信,去找出最合适的聚类中心,并将其他节点划分到这些中心下去,所以我们可以认为,AP算法所要做的事情就是去发现这些聚类中心。AP的输入是一个节点间的相似度矩阵,S,其中S(i,j)表示节点i和节点j之间的相似度,也表明了,j作为i的聚类中心的合适程度,这个相似度的计算可以根据具体应用场景,这里未免误导不作相似度的假设。其中S(k,k)表示节点k作为k的聚类中心的合适程度,可以理解为,节点k成为聚类中心合适度,在最开始时,这个值是初始化的时候使用者给定的值,会影响到最后聚类的数量。
-
算法流程
-
假设 { x 1 , x 2 , ⋯ , x n } \{ {x_1},{x_2}, \cdots ,{x_n}\} {x1,x2,⋯,xn}数据样本集,数据间没有内在结构的假设。令是一个刻画点之间相似度的矩阵,使得 s ( i , j ) > s ( i , k ) s(i,j) > s(i,k) s(i,j)>s(i,k)当且仅当 x i x_i xi与 x j x_j xj的相似性程度要大于其与 x k x_k xk的相似性。
AP算法进行交替两个消息传递的步骤,以更新两个矩阵:
- 吸引信息(responsibility)矩阵R: r ( i , k ) r(i,k) r(i,k)描述了数据对象k适合作为数据对象i的聚类中心的程度,表示的是从i到k的消息;
- 归属信息(availability)矩阵A: a ( i , k ) a(i,k) a(i,k)描述了数据对象i选择数据对象k作为其据聚类中心的适合程度,表示从k到i的消息。
两个矩阵R ,A中的全部初始化为0。这个算法通过以下步骤迭代进行:
首先,吸引信息(responsibility) r t + 1 ( i , k ) {r_{t + 1}}(i,k) rt+1(i,k)按照
r t + 1 ( i , k ) = s ( i , k ) − max k ′ ≠ k { a t ( i , k ′ ) + s ( i , k ′ ) } {r_{t + 1}}(i,k) = s(i,k) - \mathop {\max }\limits_{k' \ne k} \{ {a_t}(i,k') + s(i,k')\} rt+1(i,k)=s(i,k)−k′=kmax{at(i,k′)+s(i,k′)}
迭代。
然后,归属信息(availability) a t + 1 ( i , k ) {a_{t + 1}}(i,k) at+1(i,k)按照
a t + 1 ( i , k ) = min ( 0 , r t ( k , k ) + ∑ i ′ ∉ { i , k } max { 0 , r t ( i ′ , k ) } ) , i ≠ k {a_{t + 1}}(i,k) = \mathop {\min }\limits_{} \left( {0,{r_t}(k,k) + \sum\limits_{i' \notin \{ i,k\} } {\max \{ 0,{r_t}(i',k)\} } } \right),i \ne k at+1(i,k)=min⎝⎛0,rt(k,k)+i′∈/{i,k}∑max{0,rt(i′,k)}⎠⎞,i=k
和
a t + 1 ( k , k ) = ∑ i ′ ≠ k max { 0 , r t ( i ′ , k ) } {a_{t+1}}(k,k) = \sum\limits_{i' \ne k} {\max \{ 0,{r_t}(i',k)\} } at+1(k,k)=i′=k∑max{0,rt(i′,k)}
迭代。
对以上步骤进行迭代,如果这些决策经过若干次迭代之后保持不变或者算法执行超过设定的迭代次数,又或者一个小区域内的关于样本点的决策经过数次迭代后保持不变,则算法结束。
为了避免振荡,AP算法更新信息时引入了衰减系数 λ \lambda λ。每条信息被设置为它前次迭代更新值的 λ \lambda λ倍加上本次信息更新值的 1 − λ 1-\lambda 1−λ倍。其中,衰减系数 λ \lambda λ是介于0到1之间的实数。即第t+1次 r ( i , k ) r(i,k) r(i,k), a ( i , k ) a(i,k) a(i,k)的迭代值:
r t + 1 ( i , k ) ← ( 1 − λ ) r t + 1 ( i , k ) + λ r t ( i , k ) {r_{t + 1}}(i,k) \leftarrow (1 - \lambda ){r_{t + 1}}(i,k) + \lambda {r_t}(i,k) rt+1(i,k)←(1−λ)rt+1(i,k)+λrt(i,k)
a t + 1 ( i , k ) ← ( 1 − λ ) a t + 1 ( i , k ) + λ a t ( i , k ) {a_{t + 1}}(i,k) \leftarrow (1 - \lambda ){a_{t + 1}}(i,k) + \lambda {a_t}(i,k) at+1(i,k)←(1−λ)at+1(i,k)+λat(i,k)参考资料:https://en.wikipedia.org/wiki/Affinity_propagation
-
总结
聚类算法具有多解性,效果评估需要结合真实情况,进行测试。
对于二维数据聚类算法结果对比:
总结:在上图多种算法,可以很明显的看出DSCAN算法准确率和时间代价的效果都非常的好,而其他算法都在一些特殊的情况表现的比较好,对于真实情况时,应过做一些测试对比效果。
矩阵降维
- 属于无监督机器学习算法
稀疏自编码器
- 最简单的、最容易理解的降维算法
- 线性稀疏自编码器
- 以手写数字识别为例
- 输入矩阵形式:X[N, 784]
- 乘以降维矩阵:H=XW ->W[784, 64]
- 想让H保留X的信息
- 乘以升维矩阵:Y=HW ->W[64, 784]
- 定义损失函数 L=(Y-X)^2
- 将X->H 称为编码过程(到此使用的是数据压缩功能)
- 将H->X’称为解码过程(可能为了去噪)
- 模型称为编码-解码模型,解码后为原始输入:自编码器、稀疏自编码器。
- 线性稀疏自编码器:
- 线性:XW
- 稀疏:H(64)<X(784)
- 编码器:编码解码模型
- 线性稀疏自编码器:
- 自编码器本身就可以认为特征工程。
- 降低维度
- 提取特征
- 数据可用不可见
PCA算法
- 类似于PCA这样的无监督方法,提取的特征不会太差、但也不会太好,它最大的作用,是总结出一些关于X的较高层次的抽象知识、为之后的有监督训练提供一个比原始特征空间更好的起点。实际上,无监督最具优势之处,就在于它的通用性:不管y是什么,只要有X就行,之后可以在各种各样的y上进一步训练。有证据显示,人类在婴儿时期也是先有一个无监督学习阶段,然后才是各种有监督学习。
- 基础模型:线性模型;线性降维算法
- 将数据不同属性的线性相关性减弱
- KernelPCA:
- KernelPCA与SVM的kernel类似,均是对数据做非线性变换之后再进行常规的PCA,因此可以对一些非线性问题进行降维.
ICA算法
- 基础模型:线性模型;线性降维算法
- 独立成分分析
- 盲源分析
- 通常用在工程科学中
- 线性变换后,不同属性的分布尽可能不同。
- 相比于PCA约束弱
字典学习
- 基础模型:线性模型;线性降维算
- 约束:让变换后的矩阵尽可能的稀疏。
- 三种降维大同小异,均是线性模型。所能达到的上限是线性模型。
线性判别分析(LDA)(与下文LDA有区别,但不常用)
- 线性模型;线性降维;有监督;
- 有监督的数据降维方法。
LDA(隐狄利克雷分配模型)
- 用于文本的降维模型:以线性模型为主。
- 基础模型:线性模型,从概率角度构建模型
- 用于文本降维。
- 如何去看待一段文本:
- 常用词语可能有几万个。
- 但是这些文本可能属于不同主题。体育主题、实事类主题,汽车类主题。主题就是不同词的频率。不同主题词的频率是不同的。
- 如何生成一段文本:现在 国家 还是 在 大力发展 纯电动
- 第一步根据文章主题的概率选择主题:(实事),(体育),(汽车),(汽车),(体育),(汽车)
- 第二步根据主题选择对应的词:现在(实事) 国家(体育) 还是 在 大力发展 纯电动(汽车)
- 求解每篇文章不同主题的概率就是文本降维的过程。
- 写成矩阵形式
- 首先需要进行文本向量化,形成稀疏矩阵X。
- X[N, 20000] = T[N, 36] W[36, 20000]
- 模型应用过程
- 首先读取文本数据
- 对于中文数据需要文本分词
- jieba.cut
- 对分词后的文本进行向量化,得到稀疏向量
- CountVect
- TfidfVect
- 使用LDA算法进行降维。得到向量v。
- LDA
- 使用向量v进行文本分类、进行文本聚类。
- 到此流程自行尝试
向量化,形成稀疏矩阵X。
- 到此流程自行尝试
- X[N, 20000] = T[N, 36] W[36, 20000]
- 模型应用过程
- 首先读取文本数据
- 对于中文数据需要文本分词
- jieba.cut
- 对分词后的文本进行向量化,得到稀疏向量
- CountVect
- TfidfVect
- 使用LDA算法进行降维。得到向量v。
- LDA
- 使用向量v进行文本分类、进行文本聚类。
- 到此流程自行尝试