简介
Kmeans是无监督学习算法,支持聚类任务,算法通过随机选取聚类中心,定义并更新点到聚类中心的距离,对聚类中心以及点的所属类别进行更新,最终形成较为稳定的K个类别;
定义距离
曼哈顿距离、欧氏距离、切比雪夫距离、闵可夫斯基距离等;
在knn算法笔记中已对上述距离进行公式说明,此处不再赘述;
基本步骤
- 随机选取K个聚类中心点,并计算其它点到不同中心点的距离;
- 每个点加入最近距离的中心类别,并将类别中样本各特征取均值,作为新的聚类中心点;
- 重复1、2步,直至聚类中心点不再变动,或到达迭代阈值;
k值选取
- 肘部法:对于不同k,计算各样本点到所属聚类中心的距离平方和s,观察(k,s)散点图中,s突变对应的k值;
- 轮廓系数法:略;
优缺点
- 优点:算法简单,收敛快;
- 缺点:受初始中心点以及离群点影响大,容易收敛到局部最优解;最终的聚类中心点不一定属于样本点;
sklearn实战
重要参数
class sklearn.cluster.KMeans(n_clusters=8
, init='k-means++'
, n_init=10
, max_iter=300
, tol=0.0001
, precompute_distances='auto'
, verbose=0
, random_state=None
, copy_x=True
, n_jobs=None
, algorithm='auto'):
# n_cluster int默认为8 生成的聚类数
# max_iter int默认300 迭代更新次数阈值上限
# init, n_init 聚类中心点初始化方法
# n_jobs int默认None -1表示用上所有cpu来计算
# tol float默认1e-4 距离收敛阈值
聚类任务
from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
# 葡萄酒数据
data = datasets.load_wine()
X_train, X_test = train_test_split(data["data"], test_size=0.3, random_state=41, shuffle=True)
# 记录不同k下的距离和
def cluster_k(features_input, min_k: int = 1, max_k: int = 10):
_sse = [] # 存放每次结果的误差平方和
for k in range(min_k, max_k+1):
_estimator = KMeans(n_clusters=k) # 构造聚类器
_estimator.fit(features_input)
_sse.append(_estimator.inertia_)
return _sse
# 肘部法选最优聚类数
sse = cluster_k(X_train, 10)
plt.plot(list(range(1, 11)), sse)
plt.show()
# 聚类模型
model = KMeans(n_clusters=2, random_state=41)
model.fit(X_train)
model.predict(X_test)
参考
https://blog.csdn.net/weixin_43983674/article/detail/129812249?spm=1001.2014.3001.5501