freeCodeCamp/guide/chinese/machine-learning/clustering-algorithms/index.md

131 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
title: Clustering Algorithms
localeTitle: 聚类算法
--- # 聚类算法
群集是将数据划分为单独的组(群集)的过程,同时确保:
* 每个群集包含类似的对象
* 不属于相同群集的对象不相似
聚类算法有助于在未标记数据集合中查找结构,并属于无监督学习的范畴。
难点在于定义可以按照您想要的方式分离数据的相似性度量。例如,一群人可以按性别,头发颜色,体重,种族等分开。
聚类算法的任务是对一组对象进行分组,使得同一组(称为集群)中的对象(在某种意义上或某种意义上)彼此之间的对象比对其他组(集群)中的对象更相似。它是探索性数据挖掘的主要任务,也是统计数据分析的常用技术。它被用于许多领域,包括机器学习,模式识别,图像分析,信息检索,生物信息学,数据压缩和计算机图形学。
聚类算法的一些应用包括:
* 根据消费者的购买模式对消费者进行分组
* 将同类动物的照片分组在一起
* 不同类型文件的分类
## 聚类算法的类型:
1. 基于连接的聚类(层次聚类)
2. 基于质心或点分配聚类k均值聚类
3. 基于分布的群集
4. 基于密度的聚类
聚类算法的一些示例是:
1. Alogmerative聚类
2. K均值聚类
3. K-mediods聚类
4. 分区聚类
### 分层聚类
有一些聚类方法只使用实例的相似性,而对数据没有任何其他要求;目的是找到组,使得组中的实例彼此更相似,而不是不同组中的实例。这是分层聚类所采用的方法。
这需要使用在实例之间定义的相似性或等效距离度量。通常使用欧几里德距离,其中必须确保所有属性具有相同的比例。
### 点分配
此方法维护一组聚类,并将点放置到最近的聚类。
## 特定的聚类算法
### K-Means聚类
K-means算法是一种流行的聚类算法因为它相对简单和快速与其他聚类算法相反。算法定义如下
1. 决定输入参数k簇数
2. 选择k个随机数据点作为质心
3. 计算每个k质心的所有数据点的距离并将每个数据点分配给包含最近质心的簇
4. 对所有数据点进行分类后,计算每个聚类的所有点的中点并指定为新的质心
5. 重复步骤3和4直到质心收敛到某些k点。
由于我们只需要计算kxn距离而不是knn算法的nn-1距离因此该算法具有很强的可扩展性。
这是Python中使用[Iris数据集](https://www.kaggle.com/uciml/iris)的聚类示例
```python
import pandas as pd
import numpy as np
iris = pd.read_csv('Iris.csv')
del iris['Id']
del iris['SepalLengthCm']
del iris['SepalWidthCm']
from matplotlib import pyplot as plt
# k is the input parameter set to the number of species
k = len(iris['Species'].unique())
for i in iris['Species'].unique():
# select only the applicable rows
ds = iris[iris['Species'] == i]
# plot the points
plt.plot(ds[['PetalLengthCm']],ds[['PetalWidthCm']],'o')
plt.title("Original Iris by Species")
plt.show()
from sklearn import cluster
del iris['Species']
kmeans = cluster.KMeans(n_clusters=k, n_init=10, max_iter=300, algorithm='auto')
kmeans.fit(iris)
labels = kmeans.labels_
centroids = kmeans.cluster_centers_
for i in range(k):
# select only data observations from the applicable cluster
ds = iris.iloc[np.where(labels==i)]
# plot the data observations
plt.plot(ds['PetalLengthCm'],ds['PetalWidthCm'],'o')
# plot the centroids
lines = plt.plot(centroids[i,0],centroids[i,1],'kx')
# make the centroid x's bigger
plt.setp(lines,ms=15.0)
plt.setp(lines,mew=2.0)
plt.title("Iris by K-Means Clustering")
plt.show()
```
由于数据点通常属于高维空间因此相似性度量通常被定义为两个向量之间的距离EuclideanManhathanCosineMahalanobis ......
### 混合密度
我们可以写_混合密度_为 ![混合密度](https://latex.codecogs.com/gif.latex?p%28x%29%20%3D%20%5Csum_%7Bi%3D1%7D%5E%7Bk%7Dp%28x%7CG_%7Bi%7D%29p%28G_%7Bi%7D%29) 其中Gi是混合物成分。它们也被称为组或集群。 px | Gi是组分密度PGi是混合比例。组件数k是超参数应事先指定。
### 期望最大化EM
在这种方法中是概率性的,我们寻找最大化样品可能性的组分密度参数。
EM算法是在存在丢失或隐藏数据的情况下计算最大似然ML估计的有效迭代过程。在ML估计中我们希望估计观测数据最可能的模型参数。
EM算法的每次迭代都包括两个过程E步和M步。
1. 在期望或E步骤中在给定观察数据和模型参数的当前估计的情况下估计缺失数据。这是使用条件期望来实现的解释了术语的选择。
2. 在M步骤中在假设缺失数据已知的情况下似然函数最大化。使用来自E步骤的丢失数据的估计来代替实际丢失的数据。
由于保证算法在每次迭代时增加可能性,因此确保了收敛。
## 更多信息:
* [维基百科集群分析文章](https://en.wikipedia.org/wiki/Cluster_analysis)
* [集群和相关算法简介](https://www.analyticsvidhya.com/blog/2016/11/an-introduction-to-clustering-and-different-methods-of-clustering/)
* [聚类算法 - 斯坦福大学幻灯片](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)
* [聚类算法:从开始到现有技术](https://www.toptal.com/machine-learning/clustering-algorithms)
* [聚类分析:基本概念和算法](https://www-users.cs.umn.edu/~kumar/dmbook/ch8.pdf)
* [K均值聚类](https://www.datascience.com/blog/k-means-clustering)
* [期望最大化算法](https://www.cs.utah.edu/~piyush/teaching/EM_algorithm.pdf)
* [在Python中使用K-Means聚类](https://code.likeagirl.io/finding-dominant-colour-on-an-image-b4e075f98097)