1.1 无监督学习与聚类算法
“有监督学习”的一部分,即是说,模型在训练的时候,即需要特征矩阵X,也需要真实标签y
有相当一部分算法属于“无监督学习”,无监督的算法在训练的时候只需要特征矩阵X,不需要标签。
![](https://i-blog.csdnimg.cn/blog_migrate/2bf222277e3a8ef40474d2391b179289.png)
![](https://i-blog.csdnimg.cn/blog_migrate/eed2e586ab8c2c80925b9c5cb5121b60.png)
1.2 sklearn中的聚类算法
聚类算法在sklearn中有两种表现形式,一种是类(和我们目前为止学过的分类算法以及数据预处理方法们都一样),需要实例化,训练并使用接口和属性来调用结果。另一种是函数(function),只需要输入特征矩阵和超参数,即可返回聚类的结果和各种指标。
![](https://i-blog.csdnimg.cn/blog_migrate/3c897e930b61956f73f5c036cbd1007a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8ac0df6faf2e8031b0aab4cefe373f42.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4a1f973c4e9ebbb8477c06b4851d8872.png)
意思就是录入的数据可以是有多种特征矩阵的方式,而不是监督学习中的列才是特征;在KMEAN中行和列都是特征
2 KMeans
2.1 KMeans是如何工作的
关键概念:簇与质心
![](https://i-blog.csdnimg.cn/blog_migrate/2903033627f79893d218ede1ba1dce92.png)
在KMeans算法中,簇的个数K是一个超参数,需要我们人为输入来确定。KMeans的核心任务就是根据我们设定好的K,找出K个最优的质心,并将离这些质心最近的数据分别分配到这些质心代表的簇中去
![](https://i-blog.csdnimg.cn/blog_migrate/c5b3042cd8b72eb414ba10fc5527acc5.png)
那什么情况下,质心的位置会不再变化呢?当我们找到一个质心,在每次迭代中被分配到这个质心上的样本都是一致的,即每次新生成的簇都是一致的,所有的样本点都不会再从一个簇转移到另一个簇,质心就不会变化了。
![](https://i-blog.csdnimg.cn/blog_migrate/9e318da782b9c89216464346834de861.png)
![](https://i-blog.csdnimg.cn/blog_migrate/983e6cbebbc666bd7b69bb898cf62605.png)
2.2 簇内误差平方和的定义和解惑
被分在同一个簇中的数据是有相似性的,而不同簇中的数据是不同的,当聚类完毕之后,我们就要分别去研究每个簇中的样本都有什么样的性质,从而根据业务需求制定不同的商业或者科技策略。
。这个听上去和我们在上周的评分卡案例中讲解的“分箱”概念有些类似,即我们分箱的目的是希望,一个箱内的人有着相似的信用风险,而不同箱的人的信用风险差异巨大,以此来区别不同信用度的人,因此我们追求“组内差异小,组间差异大”
聚类算法也是同样的目的,我们追求“簇内差异小,簇外差异大”。而这个“差异“,由样本点到其所在簇的质心的距离来衡量。
![](https://i-blog.csdnimg.cn/blog_migrate/c6b5c9847f5e2bcb404d7911a64963b9.png)
如我们采用欧几里得距离,则一个簇中所有样本点到质心的距离的平方和为:
![](https://i-blog.csdnimg.cn/blog_migrate/544291c282c023e33a4e3d8d9c11e1cd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6b13a80c077414b7bdaf3273bbc2666f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b5fd41221c3c9acff981422a2d8fb70f.png)
理解:损失函数针对的是对逻辑回归之类的有参数的求解,是求参数产生的;
如果不是求参数产生的,而是要整体平方和最小,则不称为损失函数。
![](https://i-blog.csdnimg.cn/blog_migrate/5b8513c0066874e61b93490c5fbf6f72.png)
而这些组合,都可以由严格的数学证明来推导。在sklearn当中,我们无法选择使用的距离,只能使用欧式距离。因此,我们也无需去担忧这些距离所搭配的质心选择是如何得来的了。
2.3 KMeans算法的时间复杂度
除了模型本身的效果之外,我们还使用另一种角度来度量算法:算法复杂度。
算法的复杂度分为时间复杂度和空间复杂度,时间复杂度是指执行算法所需要的计算工作量,常用大O符号表述;而空间复杂度是指执行这个算法所需要的内存空间。
也就是付出与收获的问题
![](https://i-blog.csdnimg.cn/blog_migrate/fb630c5422ddcffbee2848f7ef962008.png)
3 sklearn.cluster.KMeans
![](https://i-blog.csdnimg.cn/blog_migrate/9609f3e4b8f7a294a8db39ca36fbfd64.png)
3.1 重要参数n_clusters
n_clusters是KMeans中的k,表示着我们告诉模型我们要分几类。这是KMeans当中唯一一个必填的参数,默认为8类,但通常我们的聚类结果会是一个小于8的结果。通常,在开始聚类之前,我们并不知道n_clusters究竟是多少,因此我们要对它进行探索。
————也就是说不会默认为8,而是会手工调整
3.1.1 先进行一次聚类看看吧
首先,我们来自己创建一个数据集。这样的数据集是我们自己创建,所以是有标签的。
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
#自己创建数据集
X, y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)