Step By Step
1、原理简介
2、Code测试
3、优缺点
一、原理简介
k-均值聚类的目的是:把n个点(可以是样本的一次观察或一个实例)划分到k个聚类中,使得每个点都属于离他最近的均值(此即聚类中心)对应的聚类,以之作为聚类的标准。
二、Code测试
- 2.1 Code Sample
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
# 获取数据集
iris_data = load_iris()
iris_df = pd.DataFrame(iris_data.data, columns = iris_data.feature_names) # creating dataframe
x = iris_df.iloc[:, [0, 1, 2, 3]].values
# 初始化&训练模型
kmeans = KMeans(n_clusters=3, init = 'k-means++', max_iter = 100, n_init = 10, random_state = 0) # Applying Kmeans classifier
y_kmeans = kmeans.fit_predict(x)
# 可视化展示
print(kmeans.cluster_centers_)
plt.scatter(x[y_kmeans == 0, 0], x[y_kmeans == 0, 1],s = 100, c = 'red', label = 'Iris-setosa') # x共有四列,这里取第一列的值作为横坐标的值,取第二列作为纵坐标的值
plt.scatter(x[y_kmeans == 1, 0], x[y_kmeans == 1, 1],s = 100, c = 'blue', label = 'Iris-versicolour')
plt.scatter(x[y_kmeans == 2, 0], x[y_kmeans == 2, 1],s = 100, c = 'green', label = 'Iris-virginica') # Visualising the clusters - On the first two columns
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:,1],s = 100, c = 'black', label = 'Centroids') # plotting the centroids of the clusters
plt.legend()
plt.show()
- 2.2 The Result
三、优缺点
优点
- 算法简单,容易实现;
- 算法速度很快;
- 对处理大数据集,该算法是相对可伸缩的和高效率的,因为它的复杂度大约是O(nkt),其中n是所有对象的数目,k是簇的数目,t是迭代的次数。通常k<<n。这个算法通常局部收敛。
- 算法尝试找出使平方误差函数值最小的k个划分。当簇是密集的、球状或团状的,且簇与簇之间区别明显时,聚类效果较好。
缺点
- 对数据类型要求较高,适合数值型数据;
- 可能收敛到局部最小值,在大规模数据上收敛较慢
- 分组的数目k是一个输入参数,不合适的k可能返回较差的结果。
- 对初值的簇心值敏感,对于不同的初始值,可能会导致不同的聚类结果;
- 不适合于发现非凸面形状的簇,或者大小差别很大的簇。
- 对于”噪声”和孤立点数据敏感,少量的该类数据能够对平均值产生极大影响。