去年暑假综合老师给的ppt和《统计学习方法》一周内对nlp入门时写的笔记,本来放在github上,放在这里方便自己未来回顾。嘎嘎。
KNN
算法基本步骤
- 预先准备数据:[features],[label]
- 无需训练,只需要求数据足够大(同类样本多)
- 输入样本计算其与所有储存数据的特征距离
∑ l = 1 n ( x i l − x j l ) 2 \sqrt{\sum_{l=1}^n(x_i^l-x_j^l)^2 } l=1∑n(xil−xjl)2
l为特征,i为样本 - 根据输入k,排序后从k个样本中选取频率最高类别作为输出
优化方法:KD树
- KD树建立:
- 与搜索树及其相似,采用中位数进行划分,每次特征选择由 depth_j%features_num 决定。每个节点可理解为一片区域,其两个分支则为切割划分的一刀结果,每一刀之间互相垂直(和guilintine cutting中树搜索接近,根节点为第一刀全区域,第二层为第二刀上下两部分)
- KD树搜索:
-
类似于搜索树的查找过程,但通常不会匹配出相同坐标的节点,故需要在递归返回的过程中对子区域进行判断。
-
预先保留叶子节点与样本距离,并作为最近样本点
-
递归向上回退:计算节点距离,若小于,更新最近样本点。
-
对最近样本点兄弟节点区域查找,若区域与圆形不相交(按节点对应维度比较大小即可)则回退,若相交则继续搜索其区域内子节点。
每一次递归回退是会计算其父母节点距离的,如果父母更近则无需管兄弟,若兄弟更近则去找其子节点–>到叶子节点,再递归向上回退重复。
-
朴素贝叶斯法
极大似然估计
- 训练样本中,频率视为概率,先验概率为:
P = ∑ i = 1 N I ( y i = c k ) N P=\frac{\sum_{i=1}^NI(y_i=c_k)}{N} P=N∑i=1NI(yi=ck) - 同样可用指示函数表示条件概率
- 测试样本直接套用训练样本中计算出的概率代入贝叶斯公式相加计算。选取其中概率最大者即为分类
贝叶斯估计
- 极大似然估计出现一种情况:条件概率为0/先验概率为0
- 解决方法: 拉普拉斯平滑
p ( X = a l ∣ Y = c k ) = ∑ i = 1 N I ( x i = a l , y i = c k ) + λ ∑ i = 1 N I ( y i = c k ) + S j λ p(X=a_l|Y=c_k)=\frac{\displaystyle \sum_{i=1}^{N}I(x_i=a_l,y_i=c_k)+\lambda}{\displaystyle \sum_{i=1}^{N}I(y_i=c_k)+S_j\lambda} p(X=al∣Y=ck)=i=1∑NI(yi=ck)+Sjλi=1∑NI(xi=al,yi=ck)+λ
先验概率同上,且可通过计算验证得其满足概率定义。
决策树
采用C4.5算法实现基本步骤
- 若当前集合属于同一类,置其为单节点树,并将当前分类作为类别,返回
- 若 A = ∅ A=\emptyset A=∅,取其中数目最多的类别作为类别返回
- 计算各特征A的熵:
H A ( X ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ l o g 2 ∣ D i ∣ ∣ D ∣ H_A(X)=-\sum_{i=1}^n\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|} HA(X)=−i=1∑n∣D∣∣Di∣log2∣D∣∣Di∣
D i 表 示 此 特 征 的 样 本 数 D_i表示此特征的样本数 Di表示此特征的样本数 - 统计出各类在各特征下的数目 ∣ D i k ∣ |D_{ik}| ∣Dik∣,此时可得出: H ( D ∣ A ) , 信 息 增 益 为 g ( D , A ) = H ( D ) − H ( D ∣ A ) H(D|A),信息增益为g(D,A)=H(D)-H(D|A) H(D∣A),信息增益为g(D,A)=H(D)−H(D∣A)
- 计算出信息增益比:
g R ( D , A ) = g ( D K , A ) H A ( D ) g_R(D,A)=\frac{g(DK,A)}{H_A(D)} gR(D,A)=HA(D)g(DK,A) - 如果信息增益比小于设定阈值,设定数目最多的类别作为类别返回
- 否则将其子集按最大数目类别标记
- 删除已分类的特征集 A g A_g Ag后递归调用
剪枝策略
- 可作预剪枝和后剪枝,预剪枝算法复杂度更小,后剪枝更精确。
- 引入损失函数: C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ , ∣ T ∣ 是 叶 节 点 , N t 是 t 叶 节 点 下 的 样 本 点 C_\alpha(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha|T|,|T|是叶节点,N_t是t叶节点下的样本点 Cα(T)=∑t=1∣T∣NtHt(T)+α∣T∣,∣T∣是叶节点,Nt是t叶节点下的样本点
- 计算每个节点的经验熵后递归计算损失函数值,若父母的损失函数更小,则剪枝
感知机和SVM
感知机对偶形式学习策略
- α = 0 , β = 0 \alpha=0,\beta=0 α=0,β=0
- 选取 ( x i , y i ) (x_i,y_i) (xi,yi)
- 计算 y i ( ∑ j = 1 N α y j x j ⋅ x i + b ) y_i(\sum_{j=1}^N\alpha y_jx_j·x_i+b) yi(∑j=1Nαyjxj⋅xi+b),若小于等于0则为误分类,更新 α , β \alpha,\beta α,β(此时为随机梯度下降)
- 直到无误分类数据
训练数据直接使用Gram矩阵可提速(计算时有个点积)
线性SVM
-
为了最大化margin ( 2 / ∣ ∣ w ∣ ∣ ) (2/||w||) (2/∣∣w∣∣) 且不存在误差点(和感知机策略相似)引入如下表达式:
-
m i n w , b ∣ ∣ w ∣ ∣ 2 2 ( 除 2 便 于 计 算 ) min_{w,b} \frac{||w||^2}{2}(除2便于计算) minw,b2∣∣w∣∣2(除2便于计算)
s . t . y i ( ( w ⋅ x i ) + b > = 1 ) s.t. y_i((w·x_i)+b>=1) s.t.yi((w⋅xi)+b>=1) -
通过lagrange函数转换后:
m i n α 1 2 ∑ i = 1 n ∑ j = 1 n y i y j α i α j ( x i x j ) − ∑ j = 1 n α j min_\alpha \frac{1}{2}\sum_{i=1}^n\sum_{j=1}^ny_iy_j\alpha_i\alpha_j(x_ix_j)-\sum_{j=1}^n\alpha_j minα21i=1∑nj=1∑nyiyjαiαj(xixj)−j=1∑nαj
s . t . ∑ i = 1 n y i α i = 0 , α i > = 0 s.t. \sum_{i=1}^n y_i\alpha_i=0,\alpha_i>=0 s.t.i=1∑nyiαi=0,αi>=0 -
最终的决策函数: f ( x ) = s g n ( ) f(x)=sgn() f(x)=sgn(),支持向量即在间隔边界上
非线性
-
通过核函数将数据升维,升维后再利用SVM分类 (计算将变复杂,神经网络可替代)
-
可用SMO算法解决最优化计算问题
本人没有深入研究此处
logistic回归
引入
从线性回归和阶跃函数启发,引入sigmoid函数实现非线性形式:
-
1
1
+
e
−
(
w
x
+
b
)
,
其
中
w
为
向
量
形
式
\frac{1}{1+e^{-(wx+b)}},其中w为向量形式
1+e−(wx+b)1,其中w为向量形式
即可模拟阶跃函数,实现0/1分类预测 - 优化策略:对0的概率和1的概率相乘再取对数(实现极大似然估计),最小化损失函数:
- m i n L ( w , b ) = − ∑ i = 1 m ( y i l o g y i − + ( 1 − y i ) l o g ( 1 − y i − ) ) m min L(w,b)=-\frac{\sum_{i=1}^m(y_ilog y_i^-+(1-y_i)log(1-y_i^-))}{m} minL(w,b)=−m∑i=1m(yilogyi−+(1−yi)log(1−yi−))
- 防止过拟合:引入L2范数正则化
学习步骤
- init(w,b)
- 根据sigmoid(z)计算y_hat
- 根据损失函数偏导方向更新w,b.(可用数值方法按相差更新/解析方法直接根据导数计算)
- 更新后重新计算损失函数,若cost与上一次迭代相差小于指定参数即可跳出迭代
Adaboost
引入
“三个诸葛亮顶个臭皮匠”,弱学习算法组合起来是否能形成强学习算法?
步骤
- 初始化训练数据权值分布
- 计算误差率e,更新此次迭代弱分类器对应权重为: α = 1 2 l n ( 1 − e e ) ) \alpha=\frac{1}{2}ln(\frac{1-e}{e})) α=21ln(e1−e))
- 根据 α \alpha α更新样本权重:正确样本权重下降,错误样本权重上升
思想主要是:此次错误样本在下一次权重提升,而最终各分类器组合时权重则为正确率越高权重越高
扩展:随机森林
数据重抽样的方法建立多颗决策树,最终按频率决定数据类别
NLP
中文分词方法
基于词典匹配
-
双向匹配:正反向各匹配一次,计算:
- 非字典词:越少越好
- 单字字典词:越少越好
- 总词数:越少越好
在两种分词中选择(通常逆向匹配准确率高)
基于统计的分词方法
-
n-gram
P ( w 1 , . . . , w m ) = ∏ i = 1 m P ( w i ∣ w 1 , . . . , w i − 1 ) ≈ ∏ i = 1 m P ( w i ∣ w i − ( n − 1 ) , . . . , w i − 1 ) P(w1,...,w_m)=\prod_{i=1}^mP(w_i|w1,...,w_{i-1})\approx\prod_{i=1}^mP(w_i|w_{i-(n-1),...,w_{i-1}}) P(w1,...,wm)=i=1∏mP(wi∣w1,...,wi−1)≈i=1∏mP(wi∣wi−(n−1),...,wi−1)采用极大似然估计计算:频率代替概率
设 S = w i − ( n − 1 ) , . . . , w i − 1 设S=w_{i-(n-1)},...,w_{i-1} 设S=wi−(n−1),...,wi−1
P ( w i ∣ S ) = P ( S , w i ) P ( S ) P(w_i|S)=\frac{P(S,w_i)}{P(S)} P(wi∣S)=P(S)P(S,wi)-
Eg:
Tri-gram: P ( I , s a w , r e d , h o u s e ) ≈ P ( I ∣ ( s ) , ( s ) ) P ( s a w ∣ ( s ) , I ) P ( t h e ∣ I , s a w ) . . . P ( ( s ) ∣ r e d , h o u s e ) P(I,saw,red,house)\approx P(I|(s),(s))P(saw|(s),I)P(the|I,saw)...P((s)|red,house) P(I,saw,red,house)≈P(I∣(s),(s))P(saw∣(s),I)P(the∣I,saw)...P((s)∣red,house)
P ( 红 色 ) ≈ P ( 红 ∣ ( s ) ) P ( 色 ∣ 红 ) P ( ( s ) ∣ 色 ) P(红色)\approx P(红|(s))P(色|红)P((s)|色) P(红色)≈P(红∣(s))P(色∣红)P((s)∣色)
概率越大越可能成为词
-
歧义识别
-
n-gram可用于交集型歧义识别
- Eg:
bi-gram: P ( 化 妆 / 和 服 / 装 ) ≈ P ( 化 妆 ∣ ( s ) ) P ( 和 服 ∣ 化 妆 ) P ( 装 ∣ 和 服 ) P ( ( s ) ∣ 装 ) P(化妆/和服/装)\approx P(化妆|(s))P(和服|化妆)P(装|和服)P((s)|装) P(化妆/和服/装)≈P(化妆∣(s))P(和服∣化妆)P(装∣和服)P((s)∣装)
和P(化妆/和/服装)概率进行对比计算
通常n越大消除歧义效果越好
- Eg:
-
组合型歧义识别
结合上下文语境判断
-
新词识别
歧义消解
- 基于互信息和t测试差(相关性反映)
相关性越小越适于分词
词性标注
假设前提
- Markov假设
- 独立输出假设
即假设满足马尔科夫图(词性标志通常为线性链模型,容易满足)
HMM/CRF
CRF实际上可以替代HMM(特征综合)
-
Veterbi算法适用于词性标志(即状态输出)
- initial:
δ 1 ( i ) = π i b i ( o 1 ) \delta_1(i)=\pi_ib_i(o_1) δ1(i)=πibi(o1)
i 1 = 0 i_1=0 i1=0 - DP:对每个状态判断只计算从上一时刻到这一时刻此状态max( δ t − 1 ( i ) ∗ P i j ∗ 输 出 观 测 值 概 率 ) \delta_{t-1}(i)* P{ij}*输出观测值概率) δt−1(i)∗Pij∗输出观测值概率),保留上一时刻计算结果最大的 δ t − 1 \delta_{t-1} δt−1对应节点
- 最终回溯可得最优路径,并直接取 m a x δ T max \delta_T maxδT得到此路径对应概率
- initial:
命名实体识别
基于统计的方法:HMM&CRF
- 从文本中选取特征加入特征向量(特征挖掘)
- 采用前向-后向算法学习(HMM)/采用最小化损失函数(CRF)学习
- 预测,可得出命名实体识别结果
向量空间模型
TF-IDF和DF
- DF直接计算各单词词频作为向量: d i = [ t 1 , t 2 , . . . , t m ] d_i=[t_1,t_2,...,t_m] di=[t1,t2,...,tm]
- TF-IDF计算各单词对文档的贡献程度:
w i = t f − i d f ( x i , S ) = t f ( x i , d i ) ∗ i d f ( x i , d i ) w_i=tf-idf(x_i,S)=tf(x_i,d_i)*idf(x_i,d_i) wi=tf−idf(xi,S)=tf(xi,di)∗idf(xi,di)
词 频 − l o g ( 当 前 文 档 出 现 词 频 ) 词频-log(当前文档出现词频) 词频−log(当前文档出现词频)
TF-IDF可用于特征选择
文档相似度计算
- Dot
- Cosine
- Dice
- Jaccard
LDA(无监督)
- 输入:词语-文档矩阵(词频)
- 用Gibbs采样
- α \alpha α分布取样产生文档i的主题分布 θ i \theta_i θi(多项式分布)
- 主题分布中取样生成文档i第j个词主题 z i , j z_{i,j} zi,j
- β \beta β分布取样生成主题 z i , j z{i,j} zi,j对应词语分布(多项式分布)
- 词语分布中取样生成词语
- 输出:主题-词语矩阵,文档-主题矩阵
词向量
传统:词典对应
Word2Vec:CBOW+Skip-Gram
-
思想:一个词可由其上下文特征表示
-
CBOW+哈夫曼树
- 输入:2c个词向量(每一个词多特征)
- 投影:对向量累加(同特征相加)
- 构建哈夫曼树,把语料库中出现过的词全部按词频构建
- 更新:按照logistic回归,梯度下降法更新每一个非叶节点向量,并保存 Δ \Delta Δ值(左负类1右正类0)
- 最终对叶子节点按累计 Δ \Delta Δ更新词向量
- 输出:哈夫曼树,按softmax计算只需沿树走
综合词频、词特征及其上下文结合概率,占用空间将远小于按词典表示词向量
聚类
距离
- Minkowski
- 马氏距离(协方差+均值标准化):
D M ( x ) = ( x − μ ) T ∑ − 1 ( x − μ ) D_M(x)=\sqrt{(x-\mu)^T\sum-1(x-\mu)} DM(x)=(x−μ)T∑−1(x−μ)x为待识别样本
- 余弦相似度(常用)
- 无序属性:
V D M p ( a , b ) = ∑ i = 1 k ∣ m u , a , i m u , a − m u , b , i m u , b ∣ p VDM_p(a,b)=\sum_{i=1}^k|\frac{m_{u,a,i}}{m_{u,a}}-\frac{m_{u,b,i}}{m_{u,b}}|^p VDMp(a,b)=i=1∑k∣mu,amu,a,i−mu,bmu,b,i∣pm u , a m_{u,a} mu,a表示属性u上取值为a的样本数, m u , a , i m_{u,a,i} mu,a,i为第i个样本簇中属性u上取值为a的样本数。
k-means聚类
- 随意选k个中心
- 每个样本计算离各中心距离,选最近点对应类别作为自己类别
- 计算结束,每个类别更新中心为其均值,重新迭代直到稳定
层次聚类
- 两两计算样本距离,选最近两点作为一簇
- 向上层按簇间距离计算:可用最小距离/最大距离/平均距离
- 直到只剩k类停止
密度聚类
-
DBSCAN算法
- 输入:邻域值(半径),MinPTs(定义核心对象的邻域数目值))
第一阶段:确定核心节点集合
1. initial:空集 2. 遍历各节点确定其邻域节点(存储) 3. 判断数目是否大于MinPTs->是:加入核心对象集合
第二阶段:聚类
1. initial:簇数->0,未访问集合->全集 2. 随机选取核心对象o,初始化队列 3. 未访问集合-o 4. 队列中依次访问并判断邻域是否大于MinPTs,是则取其邻域中未访问点加入队列,未访问集合-n 5. k递增,簇可用上一次迭代未访问集合-这一次迭代未访问集合,数据集删除掉已分类集合
高斯模型聚类
高斯混合模型(GMM)
p M ( x ) = ∑ i = 1 k α i ⋅ p ( x ∣ μ i , ∑ i ) p_M(x)=\sum_{i=1}^k \alpha_i·p(x|\mu_i,\sum_i) pM(x)=i=1∑kαi⋅p(x∣μi,i∑)
k个高斯分布
步骤
EM算法典型应用
- E:遍历样本点,计算属于j分布的概率
w j ( i ) = p ( x ( i ) ∣ z ( i ) = j ) w_j^{(i)}=p(x^{(i)}|z^{(i)}=j) wj(i)=p(x(i)∣z(i)=j) - M:根据计算结果更新各分布均值和协方差
- 收敛即停止
- 用学习所得混合模型遍历所有样本,样本归于计算出概率最大的一类
优劣势
O(tkn)
局部最优
关联规则分析
概念
- 置信度:在数据集中已经出现A时,B发生的概率.条件概率P(B|A)
- 支持度:联合概率
Aprior算法
- 扫描item,按最小支持度除去item
- 两两组合(过程中可通过分析其子集是否存在于上一次迭代,否则剪枝)
- 重新扫描
FP-tree算法
提速