无监督学习 (聚类)
- 聚类是一种无监督学习方法,是将数据划分为若干个簇,使得簇内的点尽可能相似,簇间尽可能不相似。
k-means 聚类
- k-means 聚类算法是一种迭代算法,它会不断地寻找最佳的 k 值,然后将数据分配到这些簇中。
- 聚类算法的优点是简单,易于实现,并且对数据维度的要求不高。
from sklearn.cluster import KMeans
num_clusters = 4
kmeans = KMeans(init='k-means++', n_clusters=num_clusters, n_init=10)
kmeans.fit(data)
均值漂移聚类
- 把数据点的分布看成是概率密度函数, 希望在特征空间中根据函数分布特征找出数据点的"模式"(mode)
- 优点是不需要事先确定集群的数量
import numpy as np
from sklearn.cluster import MeanShift, estimate_bandwidth
bandwidth = estimate_bandwidth(X, quantile=0.1, n_samples=len(X))
meanshift_estimator = MeanShift(bandwidth=bandwidth, bin_seeding=True)
meanshift_estimator.fit(X)
labels = meanshift_estimator.labels_
centroids = meanshift_estimator.cluster_centers_
num_clusters = len(np.unique(labels))
print("Number of clusters in input data =", num_clusters)
凝聚层次聚类
- 层次聚类算法可以是自下而上的,也可以是自上而下
- 自下而上: 每个数据点都被看作一个簇,然后将簇进行合并,直到所有簇合并为一个簇
- 自上而下: 先将所有数据点看作一个簇,然后将簇进行分裂,直到所有簇分裂为一个簇
from sklearn.cluster import AgglomerativeClustering
plt.figure()
model = AgglomerativeClustering(linkage=linkage,
connectivity=connectivity, n_clusters=num_clusters)
model.fit(X)
labels = model.labels_
近邻传播聚类
- 找出数据点的相似度,然后根据相似度进行聚类
- 优点是不需要事先确定簇的数量
from sklearn.cluster import AffinityPropagation
_, labels = cluster.affinity_propagation(edge_model.covariance_)
num_labels = labels.max()
for i in range(num_labels + 1):
print("Cluster", i+1, "-->", ', '.join(names[labels == i]))