十七、支持向量机(SVM)
试图寻找能够获得最大间距的线性分类边界。
y = kx +b
kx -y + b = 0
w1x1+w2x2 + w3 = 0
wx + b = 0
寻找特定的w和b能够使得所有支持向量到分类边界的间距相等且最大,同时该分类边界能够正确区分不同类别的样本。
d & 1/||w||^2
| |
v v
max max
||w||^2 -> min
wx+b = 0
wx + b = 1
wx + b = -1
蓝:wx + b >= 1, y = 1
红:wx + b <= -1, y = -1
在满足y[i](wx[i] + b) >= 1的条件下,使得||w||^2最小的w和b是什么?
依据拉格朗日乘子法,等价转换求以下函数的最小值问题:
m
L(w,b) = 1/2 ||w||^2 - sigma(a[i](y[i](wx[i]+b)-1))
i=1
dL/dw = 0
m
w = sigma(a[i]y[i]x[i])
i=1
dL/db = 0
m
sigma(a[i]y[i]) = 0
i=1
预测函数:y = wx + b
使y >0的样本属于1类,时y < 0的样本属于-1类。
y = sigma(a[i]y[i]x[i])x + b
= sigma(a[i]y[i]x[i]x) + b
= sigma(a[i]y[i]k(x[i], x)) + b
k(x[i], x)称为核函数
当核函数表现为向量的内积形式时,其分类边界必为线性。
相似性函数:x'=f(x)
k(x[i], x)非内积形式,线性不可分
通过相似性函数将x升维变换为x'
k(x'[i], x')=f(x[i])f(x)
一般而言相似性函数与具体业务相关,但也存在一些相对通用的相似性函数,可以使核函数表现为内积,即升维线性可分。
sklearn中将这些相对固定的通用核函数定义为算法模型的参数,可供选择:线性核函数、多项式核函数、高斯(径向基)核函数。
代码:svm_line.py、svm_poly.py、svm_rbf.py
C: 松弛因数,正则化强度的倒数,该值越大,模型越迁就于未被最大间距规则的样本,过大形成过拟合。
degree:多项式核函数的次数,缺省3。
gamma:高斯核函数的标准差平方的倒数,缺省1。
class_weight:是否对所占比例不同的类别做权重均衡。
代码:svm_bal.py
置信概率:针对位置输出的输入,给出模型计算出来的可相信概率,该值有模型根据样本距离分类边界的距离确定。
为了让模型能够在分类的同时计算样本的置信概率,需要为分类器指定probability=True参数,而后通过模型的predict_proba方法,获得与每个输入样本相对应的置信概率矩阵,矩阵中的每一行对应一个输入样本,每一列对应一个输出类别。
代码:svm_prob.py
十八、最优超参数
sklearn.model_selection.GridSearchCV(模型对象,
参数列表, cv=交叉验证数)->基于最佳超参数组合实例化的模型对象
根据参数列表每一种超参数则组合进行cv次交叉验证,返回每次验证的f1得分。通过模型对象的cv_results_属性可以获得针对每种超参数组合的验证分值,该对象的best_params_属性为最佳超参数组合。
代码:bhp.py
十九、k-means聚类算法
1.算法步骤
1)给聚类中心分配点。计算所有的训练样本,把每个训练样本分配到距离其最近的聚类中心所在的类别里;
2)移动聚类中心。将聚类的中心移动到其所在聚类中各样本的平均值处。
3)一直重复以上步骤,直到聚类中心和聚类中各样本的平均值足够接近为止。
2.前提:聚类的个数,根据应用场景的业务特征确定。如果聚类个数设定与实际样本的分布状态不符,最终的聚类的结果可以能因初始中心的选择而异。
3.k-means算法只负责聚类和划分,类别标签(0,1,2,...)是随机分配的,多次重复可能会有差别。
4.k-means算法的初始中心是随机挑选的,每次运行算法所获得最终收敛位置可能因初始位置的不同而不同,可以通过n_init参数指定取若干次聚类中心的平均值,提高稳定性。
代码:km.py
centers: [100 200 50 80]
y: 0 0 0 1 1 1 0 0 2 2 3
centers[y]: 100 100 100 200 200 200 100 100 50 50 80
基于k-means聚类的矢量量化
代码:quant.py
二十、均值漂移聚类算法
1.算法思想
均值漂移聚类算法把数据样本看成是符合某种概率规则的随机分布,该算法试图在特征空间中根据既有的概率密度函数找出与已知样本相匹配的模式,并从这些模式中找到局部密度最大的区域,以此作为聚类的中心,服从该模式的样本即取与中心相同的聚类标签。
代码:shift.py
二十一、凝聚层次聚类算法
1.算法思想
假设每个样本都是独立的聚类,如果实际聚类数大于预期聚类数,在立足每个样本寻找其它未聚类样本中距离该样本最近的样本,合并为一类,使实际聚类数减少,重复以上过程,直到实际聚类数达到预期位置。
2.凝聚层次算法和k-means算法一样需要预先给定聚类数,但是没有聚类中心,因此不能对非训练集中的样本进行预测。
代码:agglo.py
3.因为凝聚层次算法不是基于中心和概率峰值寻求聚类,而是以及每个样本与其邻居的相似程度,因此它可以支持对连续性的特殊约束。
閱讀更多 小悅 的文章