文章目录
- 一、简介
- 二、k-means算法
* - 2.1 模型参数
- 2.2 常用模型方法
- 2.3 实际例子
– - 三、mini batch k-means算法
* - 3.1 模型参数
- 四、层次聚类算法
* - 4.1 模型参数
- 4.2 模型常用方法
- 4.3 实际例子
– - 五、DBSCN算法
* - 5.1 模型参数
- 5.2 模型常用方法
- 六、聚类指标
* - 6.1 RI 与 ARI
– - 6.2 NMI
– - 6.3 Jaccard系数
– - 6.4 轮廓系数
– - 6.5 CH指标
–
一、简介
这里较为详细介绍了聚类分析的各种算法和评价指标,本文将简单介绍如何用python里的库实现它们。
二、k-means算法
和其它机器学习算法一样,实现聚类分析也可以调用 sklearn
中的接口。
from sklearn.cluster import KMeans
2.1 模型参数
KMeans(
n_clusters=8,
*,
init='k-means++',
n_init=10,
max_iter=300,
tol=0.0001,
precompute_distances='deprecated',
verbose=0,
random_state=None,
copy_x=True,
n_jobs='deprecated',
algorithm='auto',
)
2.2 常用模型方法
fit(X)
——对数据X进行聚类predict(X)
——对新数据X进行类别的预测cluster_centers_
——获取聚类中心labels_
——获取训练数据所属的类别,比设置的聚类中心个数少1inertia_
——获取每个点到聚类中心的距离和fit_predict(X)
——先对X进行训练并预测X中每个实例的类,等于先调用fit(X)后调用predict(X),返回X的每个类transform(X)
——将X进行转换,转换为K列的矩阵,其中每行为一个实例,每个实例包含K个数值(K为传入的类数量),第i列为这个实例到第K个聚类中心的距离fit_transform(X)
——先进行fit之后进行transformscore(X)
——输入样本(这里的样本不是训练样本,而是其他传入的测试样本)到他们的类中心距离和,然后取负数
2.3 实际例子
from sklearn.datasets import make_blobs
X, y = make_blobs(random_state=1)
Kmeans = KMeans(n_clusters=3)
Kmeans.fit(X)
2.3.1 获取聚类中心:
Kmeans.cluster_centers_
输出:
array([[ -1.4710815 , 4.33721882],
[ -6.58196786, -8.17239339],
[-10.04935243, -3.85954095]])
2.3.2 获取类别
Kmeans.labels_
输出:我们设置了3个聚类中心,所以输出3个类别。
array([0, 2, 2, 2, 1, 1, 1, 2, 0, 0, 2, 2, 1, 0, 1, 1, 1, 0, 2, 2, 1, 2,
1, 0, 2, 1, 1, 0, 0, 1, 0, 0, 1, 0, 2, 1, 2, 2, 2, 1, 1, 2, 0, 2,
2, 1, 0, 0, 0, 0, 2, 1, 1, 1, 0, 1, 2, 2, 0, 0, 2, 1, 1, 2, 2, 1,
0, 1, 0, 2, 2, 2, 1, 0, 0, 2, 1, 1, 0, 2, 0, 2, 2, 1, 0, 0, 0, 0,
2, 0, 1, 0, 0, 2, 2, 1, 1, 0, 1, 0], dtype=int32)
2.3.3 获取每个点到聚类中心的距离和
Kmeans.inertia_
输出:
156.28289251170003
三、mini batch k-means算法
mini batch k-means的用法和k-means类似。
from sklearn.cluster import MiniBatchKMeans
3.1 模型参数
MiniBatchKMeans(
n_clusters=8,
*,
init='k-means++',
max_iter=100,
batch_size=100,
verbose=0,
compute_labels=True,
random_state=None,
tol=0.0,
max_no_improvement=10,
init_size=None,
n_init=3,
reassignment_ratio=0.01,
)
四、层次聚类算法
同样使用sklearn接口
from sklearn.cluster import AgglomerativeClustering
4.1 模型参数
AgglomerativeClustering(
n_clusters=2,
*,
affinity='euclidean',
memory=None,
connectivity=None,
compute_full_tree='auto',
linkage='ward',
distance_threshold=None,
compute_distances=False,
)
4.2 模型常用方法
fit(X)
——对数据X进行聚类labels_
——获取训练数据所属的类别,比设置的聚类中心个数少1n_leaves_
——层次树中的叶子数children_
——一个大小为[n_samples-1,2]的数组,给出了每个非叶结点中的子节点数量fit_predict(X)
——先对X进行训练并预测X中每个实例的类,等于先调用fit(X)后调用predict(X),返回X的每个类,该模型不能对新的数据点进行预测n_components_
——一个整数,给出了连接图中的连通分量的估计
4.3 实际例子
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_blobs
X, y = make_blobs(random_state=1)
agg = AgglomerativeClustering(n_clusters=3)
agg.fit_predict(X)
输出:对数据训练并预测
array([0, 2, 2, 2, 1, 1, 1, 2, 0, 0, 2, 2, 1, 0, 1, 1, 1, 0, 2, 2, 1, 2,
1, 0, 2, 1, 1, 0, 0, 1, 0, 0, 1, 0, 2, 1, 2, 2, 2, 1, 1, 2, 0, 2,
2, 1, 0, 0, 0, 0, 2, 1, 1, 1, 0, 1, 2, 2, 0, 0, 2, 1, 1, 2, 2, 1,
0, 1, 0, 2, 2, 2, 1, 0, 0, 2, 1, 1, 0, 2, 0, 2, 2, 1, 0, 0, 0, 0,
2, 0, 1, 0, 0, 2, 2, 1, 1, 0, 1, 0])
4.3.1 获取层次树中的叶子数
agg.n_leaves_
输出:
100
4.3.2 获取每个非叶结点中的子节点数量
agg.children_
输出:
array([[ 33, 68],
[ 35, 39],
[ 18, 21],
[ 30, 92],
[ 54, 58],
[ 49, 100],
[ 26, 55],
[ 23, 27],
[ 20, 45],
[ 3, 82],
[ 1, 71],
[ 16, 52],
[ 24, 38],
[ 22, 77],
[ 9, 59],
[ 44, 69],
[ 40, 106],
[ 15, 90],
[ 36, 94],
[ 53, 61],
[ 72, 108],
[ 37, 43],
[ 17, 78],
[ 60, 70],
[ 50, 102],
[ 76, 98],
[107, 114],
[ 56, 93],
[ 7, 110],
[ 63, 112],
[ 8, 66],
[ 11, 109],
[ 42, 84],
[ 5, 6],
[ 19, 121],
[ 97, 104],
[ 91, 105],
[ 79, 88],
[ 46, 73],
[113, 116],
[ 89, 132],
[ 85, 87],
[ 10, 41],
[ 29, 51],
[ 12, 96],
[ 34, 118],
[ 32, 144],
[115, 123],
[ 31, 48],
[ 62, 125],
[ 13, 130],
[ 81, 134],
[103, 135],
[ 0, 28],
[ 75, 142],
[120, 133],
[ 65, 117],
[ 47, 99],
[127, 137],
[101, 139],
[122, 136],
[ 74, 138],
[140, 148],
[ 80, 161],
[111, 119],
[155, 156],
[124, 129],
[131, 147],
[ 64, 151],
[141, 157],
[ 83, 95],
[143, 146],
[ 2, 168],
[ 67, 164],
[149, 170],
[ 86, 150],
[ 4, 14],
[128, 154],
[158, 167],
[ 25, 171],
[159, 165],
[160, 162],
[153, 169],
[ 57, 145],
[126, 152],
[163, 184],
[166, 177],
[173, 180],
[178, 183],
[175, 185],
[174, 187],
[176, 179],
[172, 188],
[181, 189],
[186, 192],
[190, 191],
[182, 193],
[194, 195],
[196, 197]])
4.3.3 可视化
目前 scikit-learn
没有绘制树状图的功能,但可以利用 SciPy
轻松生成树状图。 SciPy
的聚类算法接口与 scikit-learn
的聚类算法稍有不同。 SciPy
提供了一个函数,接受数据数组 X
并计算出一个链接数组(linkage array),它对层次聚类的相似度进行编码。然后我们可以将这个链接数组提供给 scipy
的 dendrogram
函数来绘制树状图。
from scipy.cluster.hierarchy import dendrogram, ward
X, y = make_blobs(random_state=0, n_samples=12)
linkage_array = ward(X)
dendrogram(linkage_array)
ax = plt.gca()
bounds = ax.get_xbound()
ax.plot(bounds, [7.25, 7.25], '--', c='k')
ax.plot(bounds, [4, 4], '--', c='k')
ax.text(bounds[1], 7.25, ' two clusters', va='center', fontdict={'size': 15})
ax.text(bounds[1], 4, ' three clusters', va='center', fontdict={'size': 15})
plt.xlabel("Sample index")
plt.ylabel("Cluster distance")
输出:
五、DBSCN算法
from sklearn.cluster import DBSCAN
5.1 模型参数
DBSCAN(
eps=0.5,
*,
min_samples=5,
metric='euclidean',
metric_params=None,
algorithm='auto',
leaf_size=30,
p=None,
n_jobs=None,
)
5.2 模型常用方法
fit(X)
——对数据X进行聚类labels_
——获取训练数据所属的类别,噪声点为-1fit_predict(X)
——先对X进行训练并预测X中每个实例的类,等于先调用fit(X)后调用predict(X),返回X的每个类,该模型不能对新的数据点进行预测
六、聚类指标
6.1 RI 与 ARI
from sklearn.metrics.cluster import rand_score
from sklearn.metrics.cluster import adjusted_rand_score
6.1.1 模型参数
rand_score(labels_true, labels_pred)
adjusted_rand_score(labels_true, labels_pred)
6.1.2 示例
rand_score([0, 0, 1, 1], [1, 1, 0, 0])
adjusted_rand_score([0, 0, 1, 1], [1, 1, 0, 0])
输出:
1.0
1.0
6.2 NMI
from sklearn.metrics.cluster import normalized_mutual_info_score
6.2.1 模型参数
normalized_mutual_info_score(
labels_true,
labels_pred,
*,
average_method='arithmetic',
)
6.2.2 示例
normalized_mutual_info_score([0, 0, 1, 1], [1, 1, 0, 0])
输出:
1.0
6.3 Jaccard系数
from sklearn.metrics import jaccard_score
6.3.1 模型参数
jaccard_score(
y_true,
y_pred,
*,
labels=None,
pos_label=1,
average='binary',
sample_weight=None,
zero_division='warn',
)
6.3.2 示例
jaccard_score([0, 0, 1, 1], [0, 0, 1, 1])
jaccard_score([0, 0, 1, 1], [1, 1, 0, 0])
输出:在使用前,需要转化为相同的类别标识
1.0
0.0
6.4 轮廓系数
from sklearn.metrics.cluster import silhouette_score
6.4.1 模型参数
silhouette_score(
X,
labels,
*,
metric='euclidean',
sample_size=None,
random_state=None,
**kwds,
)
6.4.2 示例
silhouette_score(X, agg.labels_)
输出: agg.labels_
为用 AgglomerativeClustering
算法对数据集 X
进行的聚类
0.5811444237627902
6.5 CH指标
from sklearn.metrics.cluster import calinski_harabasz_score
6.5.1 模型参数
calinski_harabasz_score(X, labels)
6.5.2 示例
calinski_harabasz_score(X, agg.labels_)
输出:
26.268277404270318
Original: https://blog.csdn.net/TSzero/article/details/116265151
Author: 诡秘愚者
Title: 用python实现聚类分析
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/549404/
转载文章受原作者版权保护。转载请注明原作者出处!