简而言之,聚类的目标是将相似的项目聚集在一起形成簇。例如,假设和朋友们去山里徒步旅行,发现了一种从未见过的美丽蝴蝶。又遇到了一些,它们并不完全相同,但足够相似,让知道它们属于同一物种。在这种情况下,不需要专家来识别相似的一组项目,这种识别相似对象/项目的方法被称为聚类。
聚类是一种无监督任务。无监督意味着没有提供任何用于训练数据的标签或分数。在左侧的上图中,可以看到每个实例都标记有不同的标记,这意味着它是一个标记的数据集,可以使用SVM、逻辑回归、决策树或随机森林等分类算法。在右侧,如果观察到的是相同的数据集但没有标签,那么分类算法的故事就结束了(即不能在这里使用它们)。这就是聚类算法发挥作用的地方!在上图中,用眼睛识别三个簇是相当明显和容易的,但在处理真实和复杂的数据集时,情况并非如此。
1. 搜索引擎:可能熟悉谷歌提供的图像搜索概念。这个系统首先对数据库中的所有图像应用聚类算法。之后,相似的图像将落入同一个簇。当特定用户提供一个图像作为参考时,它将对图像应用训练有素的聚类模型以识别其簇,一旦完成,它就会返回这个簇中的所有图像。
2. 客户细分:还可以基于客户的购买历史和他们在网站上的活动来聚类客户。这非常重要且有用,以了解客户是谁以及他们需要什么,以便系统可以适应他们的要求,并相应地向每个细分市场推荐产品。
3. 半监督学习:当在半监督学习中工作时,只提供了一些标签,可以执行聚类算法并为所有落入同一簇的实例生成标签。这种技术对于增加标签数量非常有效,之后可以使用监督学习算法,其性能会得到提升。
4. 异常检测:任何亲和力低(衡量一个实例适应特定簇的程度)的实例可能是异常。例如,如果根据网站上每分钟的请求对用户进行聚类,可以检测到行为异常的用户。这种技术在检测任何制造缺陷或欺诈检测中特别有用。
5. 图像分割:如果根据颜色对所有像素进行聚类,然后可以将每个像素替换为其簇的平均颜色,这在需要减少图像中不同颜色数量时可能会有所帮助。图像分割在目标检测和跟踪系统中起着重要作用。
让快速了解一下K均值算法到底是什么。首先,让生成一些数据点,以便更好地理解未标记的数据集。
import numpy as np
from sklearn.datasets import make_blobs
blob_centers = np.array([[ 0.2, 2.3], [-1.5 , 2.3], [-2.8, 1.8], [-2.8, 2.8], [-2.8, 1.3]])
blob_std = np.array([0.4, 0.3, 0.1, 0.1, 0.1])
X, y = make_blobs(n_samples=2000, centers=blob_centers, cluster_std=blob_std, random_state=7)
现在让绘制它们:
plt.figure(figsize=(8, 4))
plt.scatter(X[:, 0], X[:, 1], c=None, s=1)
save_fig("blobs_plot")
plt.show()
这就是一个未标记数据集的样子,可以看到有五个数据点簇。K均值算法是一个简单的算法,能够高效快速地对这类数据集进行聚类。
from sklearn.cluster import KMeans
k = 5
kmeans = KMeans(n_clusters=k, random_state=101)
y_pred = kmeans.fit_predict(X)
请记住,需要指定算法需要找到的簇数k。在示例中,这是相当直接的,但通常情况并非如此。训练后,每个实例将被分配到五个簇中的一个。
请记住,这里的实例标签是簇的索引,不要将其与分类中的类标签混淆。
让看看算法找到的五个中心点:
kmeans.cluster_centers_
这些是索引为0,1,2,3,4的簇的中心点。现在可以轻松地分配新实例,模型将把它分配给最接近的簇中心。
new = np.array([[0, 2], [3, 2], [-3, 3], [-3, 2.5]])
kmeans.predict(new)
这就是K均值的全部内容,将在其他博客中详细讨论K均值的工作方式和类型。敬请期待!
1. 使用聚类进行图像分割:图像分割是将图像划分为多个部分的任务。例如,在自动驾驶汽车的目标检测系统中,所有属于交通信号图像的像素可能会被分配到“交通信号”部分。今天,基于CNN(卷积神经网络)的最先进的模型使用复杂的架构进行图像处理。但将做一些更简单的事情,即颜色分割。将简单地根据颜色将像素分配给特定的簇。这种技术可能足以满足某些应用,例如分析卫星图像以测量某个区域的森林覆盖面积,颜色分割可能就足够了。
from matplotlib.image import imread
image = imread('lady_bug.png')
image.shape
现在让将数组重塑为RGB颜色的长列表,然后使用K均值对它们进行聚类:
X = image.reshape(-1, 3)
kmeans = KMeans(n_clusters=8, random_state=101).fit(X)
segmented_img = kmeans.cluster_centers_[kmeans.labels_]
segmented_img = segmented_img.reshape(image.shape)
这里发生的情况是,例如,它尝试为所有绿色阴影识别一个颜色簇。之后,对于每种颜色,它寻找像素颜色簇的平均颜色。意思是,它将所有绿色阴影替换为浅绿色,假设平均颜色是浅绿色。最后,它将这个颜色的长列表重塑为图像的原始尺寸。