Python中的无监督学习k-means族聚类算法

Tavish Aggarwal.

在这里,我们再次回来讨论无人监督的学习。我们将讨论K-Means聚类算法来解决无监督的学习问题。

在以前的帖子中,

  1. Python监督学习的k-最近邻域算法

  2. 使用Python机器学习中的回归模型

我们看到了解决监督学习问题的技术,我们正在标记北京快3app。

在这篇文章中,我们将研究解决与未标记北京快3app相关的问题的技术(即目标变量不在北京快3app集中)。我们的任务是搜索北京快3app中的模式。

无人监督的学习

使用既不分类的信息也没有标记并允许该算法在没有指导的情况下对该信息作用的信息训练。

这里,机器的任务是根据相似性,模式和差异对未进行的信息进行组,而无需任何先前的北京快3app训练。

要解决无人监督的学习问题,我们基本上有两种方法:

  1. 聚类
    • 群集问题是您要在北京快3app的基础上发现北京快3app中的固有分组,例如将鲜花分组。
    • 在分段对相同标准上分段北京快3app时,相同的北京快3app点不应落在不同的段下。
    • 有像Kmeans,EWKM,分层,Bicluster等的算法,以解决此类问题。
    • 聚类的一些实际应用是客户洞察或客户分割,营销,社交媒体,医疗等。
  2. 协会
    • 一个关联规则学习问题是您想要发现描述北京快3app的大量部分的规则的地方,例如购买X的人​​也倾向于购买Y.
    • 有像Apriori,Eclat等的算法,以解决这种问题。

在此帖子中,我们将谈论用于创建群集的技术和算法,并尝试预测给定北京快3app集中的模式。让我们开始吧。

簇倾向

在直接离开并将聚类技术应用于北京快3app集之前,检查群集趋势非常重要,即给定的北京快3app集具有任何有意义的群集。要检查群集趋势,我们使用Hopkins测试。

霍普金斯测试 检查北京快3app点是否与多维空间中的均匀分布式北京快3app显着不同。从霍普金斯测试中靠近1的值,测试指出北京快3app具有可能的群集。

K表示聚类

K-means算法使用了概念 封面 创建K集群。其中N个北京快3app点的质心表示为:

$$(X_1 + X_2 ...... + X_N / N,Y_1 + Y_2 ...... + Y_N / N)$$

既然我们知道k表示算法适用于质心的概念,让我们进一步挖掘,看看K表示聚类算法中涉及的步骤:

  1. 我们首先随机分配质心。并且质心的数量取决于k值。
  2. 我们计算从K质心的每个点的欧几里德距离,并分配点到具有最短欧几里德距离的簇。
  3. 更改聚类我们再次重新计算质心并重复步骤2。
  4. 除非以及直到集群的质心不再改变,我们重复步骤2和3。解决方案会聚。

在理解K表示聚类算法的直观后,让我们来看看算法算法的解决方案融合过程。

笔记: 可视化演示K表示解决方案如何融合: //www.naftaliharris.com/blog/visualizing-k-means-clustering/

在高水平上,K表示聚类算法涉及两个步骤。这些都是:

  • 任务: 将每个观察分配给最近的集群质心。赋值步骤的等式是\(z_i = argmin || x_i - \ mu_k || \),它指出,我们计算来自所有K质心和分配的\(i ^ {th} \)北京快3app点的距离距离最小的点。
  • 优化: 将每个质心更新为分配给它的点的平均值。优化的方程由\(\ mu_k = {1 \ over n_k} \ sum_ {i:z_i = k} x_i \)给出,这使我们占据分配给群集的所有点,并按编号划分它们积分。这将是一个新的质心。

这里的目的是最大化群集间距离并最小化簇内距离。

成本函数表示为,

$$ j = \ sum_ {i = 1} ^ n {|| x_i - \ mu_ {k(i)} ||}}} ^ 2 = \ sum_ {k = 1} ^ k \ sum_ {i \ epsilon c_k} {|| x_i - \ mu_k ||} ^ 2 $$

其中,\(x_i \)是\(i ^ {th} \)北京快3app点,\(k(i)\)是属于k集群的\(i ^ {th} \)北京快3app点。

成本函数的目标是最小化属于K群集的\(I ^ {th} \)北京快3app点与k集群的质心的距离。

成本函数是非凸函数,因此它不保证,而不是坐标血统将收敛到全局最小值,并且成本函数可以收敛到局部最小值。因此,选择K质心的初始值可以影响K-Means算法及其最终结果。

为了找到k-means的凸面解决方案,存在一种称为支持向量群集的技术。 (我将在未来的帖子中解释这一点)

K表示++算法

K-means的问题是初始化群集中心以巧妙地实现全局最小值,这是使用K表示++算法进行解决的。

在K-Means ++中,使用尝试初始化相距远远差异的算法来选择初始质心。它只是k-means的初始化过程。

在K-means ++算法中,

  1. 我们选择一个中心作为随机的北京快3app点之一。
  2. 对于每个北京快3app点\(x_i \),我们计算已选择的\(x_i \)和已选择的最近中心之间的距离。
  3. 现在,我们使用加权概率分布选择下一个群集中心,其中点x被选中概率与\(d(x)^ 2 \)成比例。
  4. 重复步骤2和3,直到所选择的K中心。

Python实现

让我们来看看演示在Python中使用kmeans算法的示例:

from sklearn.cluster import KMeans
from sklearn.datasets import load_wine

# Loading data
data = load_wine()
X = data.data
y = data.target

model = KMeans(n_clusters=3)
model.fit(X)
labels = model.predict(X)

print(labels)

笔记: Here instead of using fit and predict method seprately, we could have also used fit_predict() method.

在上面所示的示例中,我们正在尝试将北京快3app分类为三个集群。我们还可以计算每个集群的质心。请参阅下面显示的代码:

from sklearn.cluster import KMeans
from sklearn.datasets import load_wine

# Loading data
data = load_wine()
X = data.data
y = data.target

model = KMeans(n_clusters=3)
model.fit(X)
labels = model.predict(X)

xs = X[:,0]
ys = X[:,-1]

plt.scatter(xs, ys, c=labels, alpha=0.5)
plt.xlabel('Alcohol')
plt.ylabel('Proline')

centroids = model.cluster_centers_
centroids_x = centroids[:,0]
centroids_y = centroids[:,-1]

plt.scatter(centroids_x, centroids_y, marker='D', s=100, c='black')
plt.show()

输出:

无监督的学习群集

惊人的。我们创建了第一个无人监督的学习模式。但在上面所示的例子中,我们如何知道选择3个集群是最佳选择?有多种方法可以这样做:

  1. 剪影分析
  2. 肘部曲线方法
  3. 性能与群集情节

商业知识也在决定集群的数量方面发挥着一种非常重要的作用。

剪影分析

剪影系数是与其他簇(分离)相比,北京快3app点与其自身群集的群集相似的衡量标准(即,群集中的点之间的距离)。

所以要计算轮廓度量,我们需要计算两种措施即(i)和b(i)在哪里

  • (i)是从自己的群集(内聚力)的平均距离,它应该尽可能小。
  • B(i)是距离最近邻群(分离)的平均距离,它应该尽可能大。

我们将凝聚力和分离结合起来计算定义为以下内容的轮廓度量:

$$ s(i)= {{b(i) - a(i)} \ over {max \ {b(i),a(i)\}} $$

为所有北京快3app点计算S(i),我们采用s(i)的平均值。然后,我们可以计算平均S(i)对于k的不同值以及s(i)接近1或1的k的值将是k的理想值。

肘部曲线方法

使用肘曲线方法,我们测量形成不同的簇的程度。 Kmeans()将点的平方距离的总和作为惯性物质。

随着我们增加集群的数量,随着各个集群变得更加紧凑的,惯性值必然会减少。

性能与群集情节

我们可以通过计算N_Clusters的增量值的模型性能来执行此操作。请参阅下面显示的示例:

from sklearn.datasets import load_wine
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

data = load_wine()
X = data.data
y = data.target

ks = range(1, 6)
inertias = []
for k in ks:
    model = KMeans(n_clusters=k)
    model.fit(X)
    inertias.append(model.inertia_)

# Plot ks vs inertias
plt.plot(ks, inertias, '-o')
plt.xlabel('Number of Clusters')
plt.ylabel('Inertia')
plt.xticks(ks)
plt.show()

输出:

惯性曲线无人监督的学习

笔记:  我们应该选择间隔速度慢慢降低的位置。

K-Means聚类看起来很有希望解决无人监督的学习问题。不是吗?但等等有一个扭曲。

考虑我们的功能具有非常高的方差的示例。意味着北京快3app展开并结果重叠。那么如何适应模型?

在这样的场景中,我们需要将每个功能转换为具有均值和方差0。我们可以使用StandardScalar执行此操作。

standardscalar.

在StandardScalar中,我们首先将北京快3app标准化并将标准化的标准化到K-means聚类算法。请参阅下面显示的示例:

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
import pandas as pd


scaler = StandardScaler()
kmeans = KMeans(n_clusters=3)
pipeline = make_pipeline(scaler, kmeans)

pipeline.fit(X)
labels = pipeline.predict(X)

df = pd.DataFrame({'labels': labels, 'class': y})
ct = pd.crosstab(df['labels'], df['class'])
print(ct)

我们还可以使用规范化器()而不是使用StandardScaler()函数。

标准化器和标准级的关键差异是:

标准架子 通过删除平均值和缩放来标准化特征,以单位方差,而 规范化器 不通过偏差删除均值和缩放,但将整行缩放到单位规范。

请参阅下面显示的代码演示使用规范化器:

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import Normalizer
from sklearn.cluster import KMeans
import pandas as pd


scaler = Normalizer()
kmeans = KMeans(n_clusters=3)
pipeline = make_pipeline(scaler, kmeans)

pipeline.fit(X)
labels = pipeline.predict(X)

df = pd.DataFrame({'labels': labels, 'class': y})
ct = pd.crosstab(df['labels'], df['class'])
print(ct)

随着下划线算法的标准化北京快3app不同,标准化的输出将不同。选择是您选择正确的算法。

限制

在使用K表示算法解决业务问题之前,有一定的局限性和实际实现,需要记住,以便在算法解决业务问题:

  1. 要将北京快3app分成的群集数量,即必须预先确定k的值。
  2. 初始集群中心的选择可能会对最终集群形成产生影响。
  3. 聚类过程对北京快3app中的异常值的存在非常敏感。
  4. 由于群集过程中使用的距离度量是欧几里德距离,因此您需要在同一刻度上携带所有属性。这可以通过标准化实现。
  5. K-means算法不适用于分类北京快3app。
  6. 该过程可能不会收敛于给定的迭代次数。您应该始终检查收敛。

概括

在这篇文章中我们讨论过:

  1. 什么是无人监督的学习
  2. 使用k均值群集生成无监督的学习模型
  3. 使用StandaryScalar和Normalizer函数标准化北京快3app

惊人的。有了这个,我们已经完成了这篇文章。继续阅读并继续学习!不要忘记在下面的评论框中留下您的意见。如果你喜欢帖子,请给出竖起大拇指。

作者信息

Tavish Aggarwal.

网站: http://tavishaggarwal.com

Tavish Aggarwal.是一个北京快3app科学家 在一个海德拉巴工作,具有广泛的经验,在跨电子商务,财务,医疗保健等等不同领域解决现实世界的业务问题。 他对技术充满热情,喜欢在团队中工作。