听了菜菜的sklearn算法而写的学习笔记
概述
无监督学习与有监督学习
无监督学习
- 定义:模型在训练时,只需要输入特征矩阵X,不需要输入标签y;
- 典型无监督算法:PCA,聚类算法
有监督学习
- 定义:模型在训练时,既需要X又需要y;
- 典型有监督算法:决策树,随机森林,逻辑回归等
结构化数据与非结构化数据
- 结构化数据也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理;
- 非结构化数据是数据结构不规则或不完整,没有预定义的数据模型,不方便用数据库二维逻辑表来表现的数据。包括所有格式的办公文档、文本、图片、XML, HTML、各类报表、图像和音频/视频信息等等。
聚类算法与分类算法
聚类算法(无监督分类)
- 目的:将其划分为多个有意义/有用的簇;
- 功能:
- 基于业务需求或建模需求进行划分;
- 单纯地探索数据的自然结构和分布,即数据之间的联系;
- 降维和矢量量化:将高维特征压缩到一列当中,常常用于图像、声音、视频等非结构化数据的处理,大幅压缩数据量;
- 学习类型:无监督学习;
- 典型算法:k-means,DBSCAN,层次聚类,光谱聚类;
- 输出:
- 聚类结果不确定,分出来的类不一定就是数据的真实分类;
- 同样的聚类,根据业务需求的不同,结果可能是好的,也可能不好。
分类算法
- 目的:将数据进行单纯的分类;
- 功能:对已经分类好的数据进行学习,学习好后再将新数据放入分类模型中对新数据进行分类;
- 学习类型:有监督学习;
- 典型算法:决策树,贝叶斯,逻辑回归;
- 输出:
- 分类的结果是确定的,不根据业务或建模需求决定;
- 分类后模型的优劣客观易判断。
sklearn中的聚类算法
聚类算法在sklearn中有两种表现形式:
- 类:通过实例化、训练并使用接口或属性调用结果;
- 函数:只需要数据特征矩阵X和超参数就可以得出结果,就像数学中的函数一样,只要有自变量就能得出因变量;
这篇blog中用的聚类算法就是:(中括号中的参数就是可填可不填)
- 类:cluster.KMeans([n_clusters,init,…])
- 函数:cluster.k_means(X,n_clusters,[,…])
输入数据应注意:
- 模块的算法可以采用不同类型的矩阵作为输入
- 所有方法可以输入[n_samples,n_features]的标准特征矩阵,该矩阵可从sklearn.feature_extraction模块中的类中获得;
- 对于亲和力传播、光谱聚类和DBSCAN,可以输入[n_samples,n_samples]的相似性矩阵,该矩阵可用sklearn.metrics.pairwise模块中的函数来获得。
KMeans一最简单的聚类算法
KMeans算法工作原理
先导概念
- 簇:聚类的结果表现,将一个N样本的特征矩阵X分为k个簇,一个簇中的数据就被认为是一类;
- 质心:簇中所有数据的均值μj即为"质心";(所有数据在每个轴坐标上的均值即为质心在该轴上的坐标)
核心任务
找出k个质心,将离这些质心最近的数据分到这些之心所代表的簇中。
算法步骤
- 随机抽取k个质心;
- {将样本点分给距离最近的质心,生成k个簇;
对于每个簇,以每个簇的样本点的均值作为新质心;} - 循环执行步骤2,直至质心位置不变。(当簇不再改变时,质心位置就不变)
eg:kmeans将数据分为4个簇
衡量KMeans算法效果的指标
簇内误差平方和
聚出的类应该有什么性质,有什么用处?
- 簇内差异小(数据相似),簇间差异大(数据不同);类似于分箱应该达到的效果;
- 研究每个簇中有什么性质,可根据这些性制定不同的策略。
什么是差异?
样本到其所在簇的质心的距离
注:余弦距离通常用来衡量文本和文本之间的差异。
以欧几里得距离为例衡量差异
簇内平方和(又叫"inertia"):
整体平方和(又叫"total inertia"):
total inertia越小,簇内样本越相似,聚类效果越好。
因此,kmeans希望找到让total inertia最小的质心 一 最优化问题。
- 当质心不断变化时,total inertia越来越小,当total inertia最小时,质心不再改变。
注:kmeans中的total inertia类似于别的方法中的损失函数,但是要注意的是kmeans并没有损失函数这个概念。
不同的距离对应着不同的质心和inertia
距离 ~ 质心 ~ inertia:
欧几里得距离~ 均值 ~最小化每个样本点到质心的欧式距离之和;
曼哈顿距离 ~ 中位数 ~最小化每个样本点到质心曼哈顿距离之和;
余弦距离~ 均值 ~最小化每个样本点到质心的余弦距离之和
注:实验证明,使用不同的距离,就应该选用不同的质心和不同的inertia搭配,只要选对,就可以达到不错的聚类效果。
算法复杂度
时间复杂度
- 平均时间复杂度:O(knT),其中,k:簇数,n:样本数,T:迭代次数;(相比之下,KNN的平均复杂度为O(n))
- 最坏时间复杂度:O(n^((k+2)/p)),其中,n:样本数,p:特征总数;
空间复杂度
~
类:sklearn.cluster.KMeans
class sklearn.cluster.KMeans (n_clusters=8, init=’k-means++’, n_init=10, max_iter=300, tol=0.0001,
precompute_distances=’auto’, verbose=0, random_state=None, copy_x=True, n_jobs=None, algorithm=’auto’)
下面的参数的使用在例代码中都能看到(除了选看的那一部分参数)
重要参数
- n_clusters:簇数k,默认为8,但一般我们都会取一个比8小的数;
- init:初始化质心的方法,可取值如下
- “k-means++”:默认,以k-means++的方法为聚类选取更优秀的初始质心,以加速聚类;
- “random”:随机选取k个质心;
- 一个n维数组:数组的形状应该是(n_clusters,n_features)并给出初始质心。
plus = KMeans(n_clusters = 10).fit(X)
plus.n_iter_ #明显看出,k-means++迭代的次数小
#12
random = KMeans(n_clusters = 10,init="random",random_state=420).fit(X)
random.n_iter_
#19
- random_state:控制每次质心随机初始化的随机数种子,random_state一样,初始化的质心就是一样的;
- n_init:整数,默认10,若n_init的值是n,就选n个不同的随机种子并依次运行k-means算法,最终以输出最优的那个随机数种子作为n_init的值进行运算;
- max_iter:最大迭代次数,会出现迭代次数用完但没有聚类完或没达到最大迭代次数就聚类完的情况,可以调用n_iter属性来得出真是迭代次数;
random = KMeans(n_clusters = 10,init="random",max_iter=10,random_state=420).fit(X)
y_pred_max10 = random.labels_
silhouette_score(X,y_pred_max10)
#0.3952586444034157
random.n_iter_
#9
random = KMeans(n_clusters = 10,init="random",max_iter=20,random_state=420).fit(X)
y_pred_max20 = random.labels_
silhouette_score(X,y_pred_max20)
#0.3401504537571701
random.n_iter_
#19
- tol:浮点数,默认1e-4,两次迭代间的Inertia下降的量如果小于tol值,则停止迭代;
k-means++寻找优秀初始化质心的原理
-
随机初始化质心,聚类结果易受初始化质心的影响;(eg:选取了一个质心,但是其距离其他的质心都很远,是个孤立点)
-
思想:逐个选取k kk个簇中心,且离其它簇中心越远的样本点越有可能被选为下一个簇中心。
-
具体实现步骤:
1.从数据集X中随机(均匀分布)选取一个样本点作为第一个初始聚类中心ci;
2.接着计算每个样本与当前已有聚类中心之间的最短距离,用D ( x )表示;然后计算每个样本点被选为下一个聚类中心的概率P ( x ),最后选择最大概率值所对应的样本点作为下一个簇中心;
3.重复步骤2,直至选出k个质心;
一些其他的参数(选看)
重要属性
- labels:每个样本点对应的标签;
- cluster_centers_:收敛到的质心的坐标;
- inertia:簇内平方和;
- n_iter_:实际迭代次数;
重要接口
- fit(训练特征矩阵X,[训练用标签,sample_weight]):拟合训练模型;
- predict(测试特征矩阵X,[sample_weight]):拟合好后把新的样本分到相应的类中;
- fit_predict(训练特征矩阵X,[训练用标签,sample_weight]):相当于先fit后predict,只不过训练测试特征矩阵相同而已,计算质心,预测每个样本所在簇的索引并返回;
- transform(任意特征矩阵X):将X转化到簇距离空间中,在新空间中,每个维度是样本到集群中心的距离;
- fit_transform(训练特征矩阵X,[训练用标签,sample_weight]):相当于先fit后transform,聚类并将X转换到簇距离空间中并返回新空间的特征矩阵;
- score(测试特征矩阵X,[训练用标签,sample_weight]):返回簇内平方和,簇内平方和越小越好,最佳为0,是一种模型评估指标;
- get_params():获取类的参数;
- set_params(n_clusters=… ,init=… ,…):重新设置参数
eg.简单聚类
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
#自己创建数据集,创建好的数据集是已经被分好标签的
X, y