K-Means是一种无监督学习办法,用于将无标签的数据集进行聚类。其中K指集群的数量,Means示意寻找集群中心点的伎俩。
一、 无监督学习 K-Means
贴标签是须要花钱的。
所以人们钻研解决无标签数据集的办法。(笔者狭窄了)
面对无标签的数据集,咱们冀望从数据中找出肯定的法则。一种最简略也最疾速的聚类算法应运而生---K-Means。
它的核心思想很简略:物以类聚。
用直白的话简略解释它的算法执行过程如下:
- 轻易抉择K个中心点(大哥)。
- 把间隔它足够近的数据(小弟)吸纳为成员,聚成K个集群(组织)。
- 各集群(组织)外部从新抉择中心点(大哥),抉择规范是依照间隔取均值作为中心点(大哥)。
- 反复2、3步骤直到收敛(组织成员绝对稳固)。
这就是黑涩会造成聚类的过程。
二、 K-Means代码实际
2.1 鸢尾花数据集
import numpy as npimport pandas as pdimport seaborn as snsimport matplotlib.pyplot as plt# 大家不必在意这个域名df = pd.read_csv('https://blog.caiyongji.com/assets/iris.csv')sns.scatterplot(x='petal_length',y='petal_width',data=df,hue='species')
咱们失去带标签的数据如下:
2.2 K-Means训练数据
咱们移除数据标签,仅应用花瓣长、宽作为数据输出,并应用无监督学习办法K-Means进行训练。
X = df[['petal_length','petal_width']].to_numpy() from sklearn.cluster import KMeansk = 2kmeans = KMeans(n_clusters=k, random_state=42)y_pred = kmeans.fit_predict(X)plt.plot(X[y_pred==1, 0], X[y_pred==1, 1], "ro", label="group 1")plt.plot(X[y_pred==0, 0], X[y_pred==0, 1], "bo", label="group 0")# plt.legend(loc=2)plt.show()
失去分类数据如下,咱们并不知道下方数据类别别离代表什么意义。
咱们将K别离取1-6的值,可失去如下图所示分类后果:
那么K值的抉择有什么意义呢?咱们如何抉择?
三、K的抉择
3.1 惯性指标(inertia)
K-Means的惯性计算形式是,每个样本与最靠近的集群中心点的均方间隔的总和。
kmeans_per_k = [KMeans(n_clusters=k, random_state=42).fit(X) for k in range(1, 10)]inertias = [model.inertia_ for model in kmeans_per_k]plt.figure(figsize=(8, 3.5))plt.plot(range(1, 10), inertias, "bo-")plt.xlabel("$k$", fontsize=14)plt.ylabel("Inertia", fontsize=14)plt.annotate('Elbow', xy=(2, inertias[2]), xytext=(0.55, 0.55), textcoords='figure fraction', fontsize=16, arrowprops=dict(facecolor='black', shrink=0.1) )plt.axis([1, 8.5, 0, 1300])plt.show()
以上代码中model.inertia_
即K-Means办法中的惯性指标。
个别地,惯性越小模型越好,但随同K值的增大,惯性降落的速度变的很慢,因而咱们抉择“肘部”的K值,作为最优的K值抉择。
3.2 轮廓系数指标(silhouette)
K-Means的轮廓系数计算形式是,与集群内其余样本的均匀间隔记为a,与内部集群样本的均匀间隔记为b,轮廓系数(b-a)/max(a,b)。
from sklearn.metrics import silhouette_scoresilhouette_scores = [silhouette_score(X, model.labels_) for model in kmeans_per_k[1:]]plt.figure(figsize=(8, 3))plt.plot(range(2, 10), silhouette_scores, "bo-")plt.xlabel("$k$", fontsize=14)plt.ylabel("Silhouette score", fontsize=14)plt.axis([1.8, 8.5, 0.55, 0.8])plt.show()
以上代码中silhouette_score
办法可获得K-Means的轮廓系数值。
个别地,轮廓系数指标越大越好,咱们能够看到当K为2、3时均可获得不错的聚类成果。
四、主动抉择K值(拓展)
4.1 简略了解贝叶斯定理
文言解释贝叶斯:当有新的证据呈现时,不确定的事件更加确信了。 这里的“确信”是指对不确定的事件的信念水平。
公式(可疏忽):
$$ P(A|B) = \frac{P(A)P(B|A)}{P(B)} $$
其中,P(A) 示意事件A产生的概率,P(A|B)示意事件B产生时事件A产生的概率。下面的公式中B就是所谓的证据。这里要留神的是,P(B)的呈现让P(A|B)变的更确定了,并不是说概率变高了或者变低了。概率的高或者低都是一种确定。它是一种信念水平的体现。
4.2 贝叶斯高斯混合模型
咱们应用BayesianGaussianMixture
办法,而无需指定明确的K值。
from sklearn.mixture import BayesianGaussianMixturebgm = BayesianGaussianMixture(n_components=10, n_init=10, random_state=42)y_pred = bgm.fit_predict(X)np.round(bgm.weights_, 2)
输入: array([0.4 , 0.33, 0.27, 0. , 0. , 0. , 0. , 0. , 0. , 0. ])
以上代码的执行逻辑是,初始化10个集群,一直调整无关集群数贝叶斯先验常识,来将不必要的集群权重设为0(或靠近0),来确定最终K值。
五、总结(系列完结)
5.1 机器学习系列完结
我置信,截至到目前,大家对机器学习曾经有了一个根本的意识。最重要的是,大家亲手实际了机器学习的代码。无论你对机器学习有如许含糊的意识,都能近距离的接触到机器学习,这一点很重要。
当初,我发现市面上大部分的教程都对数学有强依赖,让很多人敬而远之。我感觉,无论顶尖的科学研究还是普罗公众的教育科普都有其不可代替的微小价值。流于外表的宽泛未必没有其意义,因而我抉择了舍弃谨严,贴近艰深。
当然,想要深耕于AI畛域,数学是充沛且必要的条件。如果付得起工夫和机会成本,请认真且致力,绝不会辜负你。
5.2 深度学习系列开始
深度学习是一台结构复杂的机器,但它的操作却绝对简略。甚至,会给你比传统机器学习算法更简略的感触。
咱们刮目相待!感激大家!
往期文章:
- 机器学习(五):通俗易懂决策树与随机森林及代码实际
- 机器学习(四):艰深了解反对向量机SVM及代码实际
- 机器学习(三):了解逻辑回归及二分类、多分类代码实际
- 机器学习(二):了解线性回归与梯度降落并做简略预测
- 机器学习(一):5分钟了解机器学习并上手实际
- 前置机器学习(五):30分钟把握罕用Matplotlib用法
- 前置机器学习(四):一文把握Pandas用法
- 前置机器学习(三):30分钟把握罕用NumPy用法
- 前置机器学习(二):30分钟把握罕用Jupyter Notebook用法
- 前置机器学习(一):数学符号及希腊字母