Python人工智能-无监督学习:聚类

Python人工智能-无监督学习:聚类

无监督的机器学习算法没有任何监督者提供任何形式的指导。这就是为什么它们与一些人所说的真正的人工智能紧密相连。

在无监督学习中,不会有正确的答案,也没有老师的指导。算法需要在数据中发现有趣的模式进行学习。

什么是聚类

基本上,它是一种无监督的学习方法,也是许多领域中常用的统计数据分析技术。聚类主要是将观测数据集划分为子集,称为聚类,其方式是同一聚类中的观测数据在某种意义上是相似的,而它们与其他聚类中的观测数据是不相似的。简单地说,我们可以说聚类的主要目的是在相似性和不相似性的基础上对数据进行分组。

例如,下图显示了不同聚类中的同类数据 —

使用Python的人工智能--无监督学习之聚类

数据聚类的算法

以下是几种常见的数据聚类算法

K-Means算法

K-means聚类算法是著名的数据聚类算法之一。我们需要假设聚类的数量已经知道。这也被称为平面聚类。它是一种迭代式聚类算法。这个算法需要遵循以下步骤– 1.

第1步 - 我们需要指定所需的K个子群的数量。

第2步 --固定聚类的数量,并将每个数据点随机分配到一个聚类。或者换句话说,我们需要根据聚类的数量来对我们的数据进行分类。

在这一步,应该计算聚类中心点。

由于这是一个迭代算法,我们需要在每次迭代中更新K中心点的位置,直到我们找到全局最优,或者换句话说,中心点达到最佳位置。

下面的代码将有助于在Python中实现K-means聚类算法。我们将使用Scikit-learn模块。

让我们导入必要的包–

import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans
Python

下面这行代码将有助于通过使用 sklearn.dataset 包中的 make_blob 生成二维数据集,其中包含四个 blob

from sklearn.datasets.samples_generator import make_blobs

X, y_true = make_blobs(n_samples = 500, centers = 4,
            cluster_std = 0.40, random_state = 0)
Python

我们可以通过使用以下代码来实现数据集的可视化 —

plt.scatter(X[:, 0], X[:, 1], s = 50);
plt.show()
Python

使用Python的人工智能--无监督学习之聚类

在这里,我们将kmeans初始化为KMeans算法,所需参数为多少个集群(n_clusters)。

kmeans = KMeans(n_clusters = 4)
Python

我们需要用输入数据训练K-means模型。

kmeans.fit(X)
y_kmeans = kmeans.predict(X)
plt.scatter(X[:, 0], X[:, 1], c = y_kmeans, s = 50, cmap = 'viridis')

centers = kmeans.cluster_centers_
Python

下面给出的代码将帮助我们根据我们的数据绘制和可视化机器的发现,以及根据要找到的集群数量进行的配合。

plt.scatter(centers[:, 0], centers[:, 1], c = 'black', s = 200, alpha = 0.5);
plt.show()
Python

使用Python的人工智能--无监督学习之聚类

平均移位算法

这是另一种流行的、强大的聚类算法,用于无监督学习。它不做任何假设,因此它是一种非参数算法。它也被称为分层聚类或平均移位聚类分析。以下是该算法的基本步骤

  • 首先,我们需要把数据点分配到它们自己的一个聚类中。

  • 现在,它计算中心点并更新新中心点的位置。

  • 通过重复这个过程,我们向集群的峰值靠近,即向高密度的区域移动。

  • 这个算法在中心点不再移动的阶段停止。

在以下代码的帮助下,我们在Python中实现了平均移动聚类算法。我们将使用Scikit-learn模块。

让我们导入必要的包–

import numpy as np
from sklearn.cluster import MeanShift
import matplotlib.pyplot as plt
from matplotlib import style
style.use("ggplot")
Python

下面的代码将有助于通过使用 sklearn.dataset 包中的 make_blob 生成二维数据集,包含四个blob。

from sklearn.datasets.samples_generator import make_blobs
Python

我们可以用下面的代码将数据集可视化

centers = [[2,2],[4,5],[3,10]]
X, _ = make_blobs(n_samples = 500, centers = centers, cluster_std = 1)
plt.scatter(X[:,0],X[:,1])
plt.show()
Python

使用Python的人工智能--无监督学习之聚类

现在,我们需要用输入的数据来训练平均移动集群模型。

ms = MeanShift()
ms.fit(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_
Python

下面的代码将根据输入的数据打印集群中心和预期的集群数量:

print(cluster_centers)
n_clusters_ = len(np.unique(labels))
print("Estimated clusters:", n_clusters_)
[[ 3.23005036 3.84771893]
[ 3.02057451 9.88928991]]
Estimated clusters: 2
Python

下面给出的代码将有助于根据我们的数据绘制和可视化机器的发现,并根据要找到的集群数量进行拟合。

colors = 10*['r.','g.','b.','c.','k.','y.','m.']
   for i in range(len(X)):
   plt.plot(X[i][0], X[i][1], colors[labels[i]], markersize = 10)
plt.scatter(cluster_centers[:,0],cluster_centers[:,1],
   marker = "x",color = 'k', s = 150, linewidths = 5, zorder = 10)
plt.show()
Python

使用Python的人工智能--无监督学习之聚类

衡量聚类的性能

现实世界的数据并不自然地被组织成一些独特的聚类。由于这个原因,它不容易被可视化并得出推论。这就是为什么我们需要测量聚类的性能和质量。这可以在剪影分析的帮助下完成。

轮廓分析

这种方法可以通过测量聚类之间的距离来检查聚类的质量。基本上,它提供了一种方法,通过给出一个剪影分数来评估集群的数量等参数。这个分数是一个衡量一个聚类中的每个点与相邻聚类中的每个点的接近程度的指标。

剪影分数的分析

这个分数的范围是[-1, 1]。Following is the analysis of this score −

  • 分数 为+1 – 分数接近+1表示样本离相邻的聚类很远。

  • 0 分–0分表示样本在两个相邻聚类之间的决策边界上或非常接近。

  • 分数为 -1 - 负分表示样本被分配到了错误的聚类中。

计算剪影分数

在本节中,我们将学习如何计算剪影分数。

剪影得分可通过以下公式计算 −

silhouettescore=(pq)max(p,q)silhouette score = \frac{\left ( p-q \right )}{max\left ( p,q \right )}

这里,𝑝是与数据点不属于的最近聚类中的点的平均距离。而且,𝑞是与它自己的聚类中的所有点的平均聚类内距离。

为了找到最佳的聚类数量,我们需要从 sklearn 包中导入 度量 模块,再次运行聚类算法。在下面的例子中,我们将运行K-means聚类算法来找到最优的簇数–

导入必要的包,如图所示 —

import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans
Python

在以下代码的帮助下,我们将通过使用 sklearn.dataset 包中的 make_blob 生成二维数据集,其中包含四个blob。

from sklearn.datasets.samples_generator import make_blobs

X, y_true = make_blobs(n_samples = 500, centers = 4, cluster_std = 0.40, random_state = 0)
Python

如图所示,初始化变量-

scores = []
values = np.arange(2, 10)
Python

我们需要通过所有的值来迭代K-means模型,也需要用输入数据来训练它。

for num_clusters in values:
kmeans = KMeans(init = 'k-means++', n_clusters = num_clusters, n_init = 10)
kmeans.fit(X)
Python

现在,使用欧氏距离指标估计当前聚类模型的剪影分数–

score = metrics.silhouette_score(X, kmeans.labels_,
metric = 'euclidean', sample_size = len(X))
Python

下面这行代码将有助于显示集群的数量以及Silhouette得分。

print("\nNumber of clusters =", num_clusters)
print("Silhouette score =", score)
scores.append(score)
Python

你将收到以下输出 −

Number of clusters = 9
Silhouette score = 0.340391138371

num_clusters = np.argmax(scores) + values[0]
print('\nOptimal number of clusters =', num_clusters)
Python

现在,最佳集群数量的输出将如下—-。

Optimal number of clusters = 2
Python

寻找最近的邻居

如果我们想建立推荐系统,如电影推荐系统,那么我们就需要了解寻找最近的邻居的概念。这是因为推荐系统利用了最近的邻居的概念。

寻找近邻的概念 可以被定义为从给定的数据集中寻找与输入点最接近的点的过程。这种KNN(K-nearest neighbors)算法的主要用途是建立分类系统,根据输入数据点与各种类别的接近程度对数据点进行分类。

下面给出的Python代码有助于找到一个给定数据集的K-近邻-

如下图所示,导入必要的包。这里,我们使用的是 sklearn 包中的 NearestNeighbors 模块。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import NearestNeighbors
Python

现在让我们来定义输入数据–

A = np.array([[3.1, 2.3], [2.3, 4.2], [3.9, 3.5], [3.7, 6.4], [4.8, 1.9], 
             [8.3, 3.1], [5.2, 7.5], [4.8, 4.7], [3.5, 5.1], [4.4, 2.9],])
Python

现在,我们需要定义最近的邻居–。

k = 3
Python

我们还需要给出测试数据,从中找到最近的邻居:

test_data = [3.3, 2.9]
Python

下面的代码可以将我们定义的输入数据可视化并绘制出来:

plt.figure()
plt.title('Input data')
plt.scatter(A[:,0], A[:,1], marker = 'o', s = 100, color = 'black')
Python

使用Python的人工智能--无监督学习之聚类

现在,我们需要建立K最近的邻居。该对象也需要被训练

knn_model = NearestNeighbors(n_neighbors = k, algorithm = 'auto').fit(X)
distances, indices = knn_model.kneighbors([test_data])
Python

现在,我们可以打印K个最近的邻居,如下所示

print("\nK Nearest Neighbors:")
for rank, index in enumerate(indices[0][:k], start = 1):
   print(str(rank) + " is", A[index])
Python

我们可以将最近的邻居与测试数据点一起可视化。

plt.figure()
plt.title('Nearest neighbors')
plt.scatter(A[:, 0], X[:, 1], marker = 'o', s = 100, color = 'k')
plt.scatter(A[indices][0][:][:, 0], A[indices][0][:][:, 1],
   marker = 'o', s = 250, color = 'k', facecolors = 'none')
plt.scatter(test_data[0], test_data[1],
   marker = 'x', s = 100, color = 'k')
plt.show()
Python

使用Python的人工智能--无监督学习之聚类

输出

K最近的邻居

1 is [ 3.1 2.3]
2 is [ 3.9 3.5]
3 is [ 4.4 2.9]
Python

K-最近的邻居分类器

K-Nearest Neighbors(KNN)分类器是一种分类模型,它使用最近的邻居算法来对给定的数据点进行分类。我们在上一节已经实现了KNN算法,现在我们要用该算法建立一个KNN分类器。

KNN分类器的概念

K-近邻分类的基本概念是找到一个预定义的数字,即’k’–与新样本距离最近的训练样本,该样本必须被分类。新样本将从邻居本身获得它们的标签。KNN分类器有一个固定的用户定义的常数来决定邻居的数量。对于距离,标准的欧氏距离是最常见的选择。KNN分类器直接在学习的样本上工作,而不是创建学习的规则。KNN算法是所有机器学习算法中最简单的一种。它在大量的分类和回归问题上相当成功,例如,字符识别或图像分析。

例子

我们正在建立一个KNN分类器来识别数字。为此,我们将使用MNIST数据集。我们将在Jupyter笔记本中编写这段代码。

如下图所示,导入必要的包。

在这里,我们使用 sklearn.neighbors 包中的 KNeighborsClassifier 模块-

from sklearn.datasets import *
import pandas as pd
%matplotlib inline
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
import numpy as np
Python

下面的代码将显示数字的图像,以验证我们要测试的图像:

def Image_display(i):
   plt.imshow(digit['images'][i],cmap = 'Greys_r')
   plt.show()
Python

现在,我们需要加载MNIST数据集。实际上,总共有1797张图片,但我们使用前1600张图片作为训练样本,剩下的197张将被保留用于测试。

digit = load_digits()
digit_d = pd.DataFrame(digit['data'][0:1600])
Python

现在,在显示图像时,我们可以看到输出如下-

Image_display(0)
Python

Image_display(0)

0的图像显示如下 –

使用Python的人工智能--无监督学习之聚类

Image_display(9)

9的图像显示如下

使用Python的人工智能--无监督学习之聚类

digit.keys()

现在,我们需要创建训练和测试数据集,并向KNN分类器提供测试数据集。

train_x = digit['data'][:1600]
train_y = digit['target'][:1600]
KNN = KNeighborsClassifier(20)
KNN.fit(train_x,train_y)
Python

下面的输出将创建K近邻分类器构造器-

KNeighborsClassifier(algorithm = 'auto', leaf_size = 30, metric = 'minkowski',
   metric_params = None, n_jobs = 1, n_neighbors = 20, p = 2,
   weights = 'uniform')
Python

我们需要通过提供任何大于1600的任意数字来创建测试样本,这些样本是训练样本。

test = np.array(digit['data'][1725])
test1 = test.reshape(1,-1)
Image_display(1725)
Python

Image_display(6)

6的图像显示如下 –

使用Python的人工智能--无监督学习之聚类

现在我们将预测测试数据,如下所示 −

KNN.predict(test1)
Python

上述代码将产生以下输出 –

array([6])
Python

现在,请考虑以下几点 −

digit['target_names']
Python

上述代码将产生以下输出 –

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Python

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程