聚类算法出现的原因:手里没有标签,也就是没有Y值了,聚类是把相似的东西分为一组。
Kmeans算法输入的参数:
- 要得到的簇的个数,也就是分成几类,也就是需要指定K值
- 质心(不需要输入):各个向量维度取平均值
- 欧几里得距离。两个点之间的距离。
- 优化的目标就是,不同的质心与同一个点的距离,谁最近,这个店就属于哪一类。
Kmeans算法的执行流程
1.对于两类数据点,首先输入分类的k为2,会随机找到两个点作为质心。
2 对每个样本点计算欧几里得距离,然后算出属于哪一类
3 获取第一次迭代的分类结果
4 对第一次的结果寻找新的质心,重新聚类。
5 获得第二次的结果
6 依次不停循环往复,直到质心不再发生变化为止。
Kmeans算法的优劣性:
优点:简单快速, 适合常规数据集
缺点:K值难确定,复杂度与样本呈线性关系,很难发现任意形状的簇。
python实现对鸢尾花数据集进行聚类
from sklearn import datasets
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
iris=datasets.load_iris()
iris_x=iris.data[:,0:2]#z只取前两个维度
iris_x
#绘制数据分布图
plt.scatter(iris_x[:, 0], iris_x[:, 1], c = "green", marker='o', label='see')
plt.show()
结果如下:
接下来进行聚类:
estimator = KMeans(n_clusters=2)#构造聚类器
estimator.fit(iris_x)
label_pred = estimator.labels_ #获取聚类标签
#绘制k-means结果
x0 = iris_x[label_pred == 0]
x1 = iris_x[label_pred == 1]
plt.scatter(x0[:, 0], x0[:, 1], c = "red", marker='o', label='label0')
plt.scatter(x1[:, 0], x1[:, 1], c = "green", marker='*', label='label1')
plt.show()
聚类后结果如下
聚类的结果评估:
用轮廓系数去评估聚类的结果。
也就是说结果值越接近1,证明样本聚类合理。
from sklearn import metrics
score=metrics.silhouette_score(iris_x,label_pred)
score
结果值为0.46