沧海拾珠

机器学习之聚类分析(kMeans)

1. KMeans 算法

k-means 算法接受参数 k ;然后将事先输入的n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。
K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。

2. 利用iris数据进行聚类分析

导入相关库

1
2
3
4
5
6
7
8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import sklearn
from sklearn.cluster import KMeans
from sklearn.preprocessing import scale
from sklearn import datasets
from sklearn.metrics import confusion_matrix,classification_report

2. 导入iris数据集并进行scale。

1
2
3
4
5
iris = datasets.load_iris()
X = scale(iris.data)
y = pd.DataFrame(iris.target)
# iris.target 是iris数据集中按花的种类标注好的数值列表,由多个0,1,2组成,表示3类。

3. 利用模型进行聚类分析,设定分为三类。

1
2
clustering = KMeans(n_clusters = 3, random_state = 5)
clustering.fit(X)

4. 聚类可视化处理。

1
2
3
4
5
6
7
8
plt.figure(figsize=(7,4))
plt.subplot(1,2,1)
# 实际分类情况
plt.scatter(x = iris_df.Petal_Length, y = iris_df.Petal_Width, c = np.array(['r','g','b'])[iris.target])
plt.subplot(1,2,2)
# 模型预测的分类情况,clustering.labels_是模型预测的分类结果,总共三类,为多个0,1,2组成。
plt.scatter(x = iris_df.Petal_Length, y = iris_df.Petal_Width, c = np.array(['r','g','b'])[clustering.labels_])

结果如图所示:
20180711_kmeans1

因为颜色不一致,稍作调整。

1
2
3
4
5
relabel = np.choose(clustering.labels_,[2,0,1]).astype(np.int64)
plt.subplot(1,2,1)
plt.scatter(x = iris_df.Petal_Length, y = iris_df.Petal_Width, c = np.array(['r','g','b'])[iris.target])
plt.subplot(1,2,2)
plt.scatter(x = iris_df.Petal_Length, y = iris_df.Petal_Width, c = np.array(['r','g','b'])[relabel])

结果如图所示:
20180711_kmeans2

最后给出预测准确率。

1
2
3
4
5
6
7
8
9
print(classification_report(y, relabel))
precision recall f1-score support
0 1.00 1.00 1.00 50
1 0.74 0.78 0.76 50
2 0.77 0.72 0.74 50
avg / total 0.83 0.83 0.83 150