K-Means 是一种无监督学习办法,用于将无标签的数据集进行聚类。其中 K 指集群的数量,Means 示意寻找集群中心点的伎俩。
一、无监督学习 K-Means
贴标签是须要花钱的。
所以人们钻研解决无标签数据集的办法。(笔者狭窄了)
面对无标签的数据集,咱们冀望从数据中找出肯定的法则。一种最简略也最疾速的聚类算法应运而生 —K-Means。
它的核心思想很简略:物以类聚。
用直白的话简略解释它的算法执行过程如下:
- 轻易抉择 K 个中心点(大哥)。
- 把间隔它足够近的数据(小弟)吸纳为成员,聚成 K 个集群(组织)。
- 各集群(组织)外部从新抉择中心点(大哥),抉择规范是依照间隔取 均值 作为中心点(大哥)。
- 反复 2、3 步骤直到收敛(组织成员绝对稳固)。
这就是 黑涩会造成 聚类的过程。
二、K-Means 代码实际
2.1 鸢尾花数据集
import numpy as np
import pandas as pd
import seaborn as sns
import 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 KMeans
k = 2
kmeans = 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_score
silhouette_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 BayesianGaussianMixture
bgm = 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 用法
- 前置机器学习(一):数学符号及希腊字母