无监督学习与有监督学习的本质区别是什么_深度学习使用无监督学习检测模式...

无监督学习是指在不使用标注的训练数据的情况下构建机器学习模型的过程。无监督学习在不同的研究领域中得到应用,包括市场细分,股票市场,自然语言处理,计算机视觉等。

66bf18924ca44a30b420d64fc2adde2a.png

当我们给训练数据贴上标签后,算法就会根据这些标签对数据进行分类。在现实世界中,我们可能并不总是能够访问有标签的数据。有时候,我们有很多数据,我们需要以某种方式对它们进行分类。这就是无监督学习发挥作用的地方。无监督学习算法试图建立学习模型,使用一些相似性度量在给定的数据集中找到子组。

我们来看看如何在无监督学习中解决学习问题。当我们有一个没有任何标签的数据集时,我们假设数据是由于以某种方式控制分布的潜在变量而生成的。然后,学习过程可以从各个数据点开始以分层方式进行。我们可以为数据构建更深层次的表示。

使用K-Means算法聚类数据

聚类是最流行的无监督学习技术之一。该技术用于分析数据并在该数据中查找聚类。为了找到这些聚类,我们使用某种相似性度量,如欧几里德距离,来找到子群。该相似性度量可以估计集群的紧密度。我们可以说聚类是将数据组织成子元素的过程,子元素的元素彼此相似。

我们的目标是确定数据点的内在属性,使它们属于同一个子组。没有适用于所有情况的通用相似性度量标准。例如,我们可能对查找每个子组的代表性数据点感兴趣,或者对查找数据中的异常值感兴趣。根据具体情况,我们最终会选择适当的指标。

K-Means算法是一种著名的数据聚类算法。为了使用该算法,我们需要假设集群的数量是预先知道的。然后,我们使用不同的数据属性将数据分割成K个子组。我们首先确定集群的数量,然后根据它对数据进行分类。这里的核心思想是我们需要在每次迭代时更新这些K质心的位置。我们继续迭代,直到我们将质心放在最佳位置。

我们可以看到质心的初始位置在算法中起着重要作用。这些质心应该以巧妙的方式放置,因为这会直接影响结果。一个好的策略是尽可能地放在远离彼此的地方。基本的K-Means算法随机地放置这些质心,K-Means++从数据点的输入列表中算法地选择这些点。它试图将初始质心彼此远离,以便它快速收敛。然后,我们遍历训练数据集,并将每个数据点分配给最近的质心。

一旦我们遍历整个数据集,我们就说第一次迭代结束了。我们根据初始化的质心对点进行了分组。我们现在需要根据在第一次迭代结束时获得的新聚类重新计算质心的位置。一旦我们获得了新的K的质心集,我们再次重复该过程,我们遍历数据集并将每个点分配给最近的质心。

当我们不断重复这些步骤时,质心继续移动到它们的平衡位置。经过一定次数的迭代后,质心不再改变它们的位置。这意味着我们到达了质心的最终位置。

让我们对二维数据应用K-Means聚类,看看它是如何工作的。

创建一个新的Python文件并导入以下库:

import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn import metrics
1ec27bdc717936950556aedc0b3889cb.png

从文件加载输入数据:

# Load input data X = np.loadtxt('data_clustering.txt', delimiter=',')
aee64f6b65c6333ce915bc7126bffa4b.png

在应用K-Means算法之前,我们需要定义集群的数量:

num_clusters = 5

可视化输入数据以查看扩展的外观:

# Plot input data plt.figure() plt.scatter(X[:,0], X[:,1], marker='o', facecolors='none',  edgecolors='black', s=80) x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 plt.title('Input data') plt.xlim(x_min, x_max) plt.ylim(y_min, y_max) plt.xticks(()) plt.yticks(())
c12dcbe3f760b46765198701d40e775b.png

我们可以直观地看到这些数据中有五个组。K-Means使用初始化参数创建对象。init参数表示初始化方法以选择集群的初始中心。我们使用k-means++以更智能的方式选择这些中心,而不是随机选择它们。这保证了算法快速收敛。n_clusters参数指的是集群的数量。n_init参数是指算法在决定最佳结果之前应运行的次数:

# Create KMeans object kmeans = KMeans(init='k-means++', n_clusters=num_clusters, n_init=10)
82bc46166cb9be31a4277447682f56b6.png

使用输入数据训练K-Means模型:

# Train the KMeans clustering model kmeans.fit(X)
332b2c582a7f0ae69e04baf93689b221.png

为了可视化边界,我们需要创建一个点网格并在所有这些点上评估模型。让我们定义这个网格的步长:

# Step size of the mesh step_size = 0.01
b10b993d5c6ea14335dd9fa795efb96d.png

我们定义点网格并确保我们覆盖输入数据中的所有值:

# Define the grid of points to plot the boundaries x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 x_vals, y_vals = np.meshgrid(np.arange(x_min, x_max, step_size),  np.arange(y_min, y_max, step_size))
1ec2b0e7d966b4f0f0898836f59baa1b.png

使用经过训练好的K-Means模型预测网格上所有点的输出:

# Predict output labels for all the points on the grid output = kmeans.predict(np.c_[x_vals.ravel(), y_vals.ravel()])
5a02a7071ca7c694cb97fb961a4b33ec.png

绘制所有输出值并为每个区域着色:

# Plot different regions and color them output = output.reshape(x_vals.shape) plt.figure() plt.clf() plt.imshow(output, interpolation='nearest',  extent=(x_vals.min(), x_vals.max(),  y_vals.min(), y_vals.max()),  cmap=plt.cm.Paired,  aspect='auto',  origin='lower')
1bc59b079a4fe0d790c17fc997db7aa4.png

在这些彩色区域上叠加输入数据点:

# Overlay input points plt.scatter(X[:,0], X[:,1], marker='o', facecolors='none',  edgecolors='black', s=80)
5714ae52e9f71c501bea6117e6ad547d.png

绘制使用K-Means算法获得的聚类的中心:

# Plot the centers of clusters cluster_centers = kmeans.cluster_centers_ plt.scatter(cluster_centers[:,0], cluster_centers[:,1],  marker='o', s=210, linewidths=4, color='black',  zorder=12, facecolors='black')  x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 plt.title('Boundaries of clusters') plt.xlim(x_min, x_max) plt.ylim(y_min, y_max) plt.xticks(()) plt.yticks(()) plt.show()
ecb23c67dcd6cf7a6a7ea14e9c165ba7.png

如果您运行代码,您将看到两个屏幕截图。第一个屏幕截图是输入数据:

e6abe527ea69b3639dfd6b93effe4e2e.png

第二个屏幕截图表示使用K-Means获得的边界:

cf45c5dd57dba3230dfd14bae0e7c6cf.png

每个集群中心的黑色圆圈表示该集群的质心。

使用Mean Shift算法估计簇的数量

Mean Shift是一种用于无监督学习的强大算法。它是一种经常用于聚类的非参数算法。它是非参数的,因为它没有对基础分布做任何假设。这与参数技术形成对比,在参数技术中我们假设基础数据遵循标准概率分布。Mean Shift在对象跟踪和实时数据分析等领域中找到了很多应用。

在Mean Shift算法中,我们将整个特征空间视为概率密度函数。我们从训练数据集开始,并假设它们是从概率密度函数中采样的。在此框架中,集群对应于底层分布的局部最大值。如果存在K个集群,那么在基础数据分布中存在K个峰值,并且Mean Shift将识别这些峰值。

Mean Shift的目标是识别质心的位置。对于训练数据集中的每个数据点,它定义了一个围绕它的窗口。然后,计算这个窗口的质心并将位置更新为此新质心。然后,它通过在其周围定义一个窗口来重复此新位置的过程。随着我们继续这样做,我们越来越接近集群的峰值。每个数据点将移向它所属的集群。该运动朝向更高密度的区域。

我们不断将质心(也称为平均值)移向每个集群的峰值。因为我们一直在移动平均值,因此称为Mean Shift!我们一直这样做,直到算法收敛,此时质心不再移动。

让我们看看如何使用Mean Shift来估计给定数据集中的最佳聚类数。

创建一个新的Python文件并导入以下库:

import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import MeanShift, estimate_bandwidth from itertools import cycle
799dff3a20b66c3eeb33dda96b36ddb7.png

加载输入数据:

# Load data from input file X = np.loadtxt('data_clustering.txt', delimiter=',')
dc6d71f7df13a8002c1d8eb92ae7cffa.png

估计输入数据的带宽。带宽是Mean Shift算法中使用的基础核密度估计过程的参数。带宽会影响算法的整体收敛速度以及我们最终将最终得到的集群数量。因此这是一个至关重要的参数。如果带宽很小,则可能导致群集太多,而如果值很大,则会合并不同的群集。

quantile参数会影响带宽的估算方式。分位数的较高值将增加估计的带宽,从而导致较少数量的群集:

# Estimate the bandwidth of X bandwidth_X = estimate_bandwidth(X, quantile=0.1, n_samples=len(X))
a2f0fd0ea35e9afca6ff7fc93afac653.png

让我们使用估计带宽训练Mean Shift聚类模型:

# Cluster data with MeanShift meanshift_model = MeanShift(bandwidth=bandwidth_X, bin_seeding=True) meanshift_model.fit(X)
43919e60217065ac2b5a0701a8b3b3a3.png

提取所有集群的质心:

# Extract the centers of clusters cluster_centers = meanshift_model.cluster_centers_ print('Centers of clusters:', cluster_centers)
51d42e8c98cd6849e094ab15bb67d5ca.png

提取集群数量:

# Estimate the number of clusters labels = meanshift_model.labels_ num_clusters = len(np.unique(labels)) print("Number of clusters in input data =
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值