【阿旭机器学习实战】【18】KMeans聚类中的常见问题
2022-11-24 本文已影响0人
阿旭123
【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流。
本文对机器学习中的KMeans聚类中常见的几个问题进行说明介绍。
目录
KMeans聚类中的常见问题
使用make_blobs创建样本点
samples,targets = datasets.make_blobs(n_samples=150,n_features=2,centers=3,random_state=1)
plt.scatter(samples[:,0],samples[:,1],c=targets)
在这里插入图片描述
1、K值不合适
km = KMeans(n_clusters=2)
km.fit(samples)
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
n_clusters=2, n_init=10, n_jobs=1, precompute_distances='auto',
random_state=None, tol=0.0001, verbose=0)
y_ = km.predict(samples)
metrics.adjusted_rand_score(targets,y_)
0.5681159420289855
metrics.silhouette_score(samples,km.labels_)
0.7802809392385796
一般综合考虑ARI指标和轮廓系数来决定划分几个聚类。
更多优质内容可关注公众号:
“阿旭算法与机器学习”
,共同学习交流
2、数据偏差较大
samples,target = datasets.make_blobs(n_features=2,n_samples=150,centers=3,random_state=5)
plt.scatter(samples[:,0],samples[:,1],c=target)
<matplotlib.collections.PathCollection at 0x26d999ec940>
在这里插入图片描述
km = KMeans(n_clusters=2)
y_ = km.fit_predict(samples)
metrics.adjusted_rand_score(y_,target)
0.5681159420289855
metrics.silhouette_score(samples,km.labels_)
0.7744057193895231
对于偏差比较大的数据,可以引入一个修正矩阵来对特征进行修正
trans = np.array([[0.6,-0.6],[-0.4,0.8]])
sam1 = np.dot(samples,trans)
plt.scatter(sam1[:,0],sam1[:,1],c=target)
<matplotlib.collections.PathCollection at 0x26d99a47208>
在这里插入图片描述
km = KMeans(n_clusters=2)
y_ = km.fit_predict(sam1)
metrics.adjusted_rand_score(y_,target)
0.5681159420289855
metrics.silhouette_score(sam1,km.labels_)
0.8527525114558019
3、各个类别内部数据的标准差差别很大
samples,target= datasets.make_blobs(n_features=2,n_samples=150,centers=3,
cluster_std=[0.5,2,10])
plt.scatter(samples[:,0],samples[:,1],c=target)
在这里插入图片描述
km = KMeans(n_clusters=3)
y_ = km.fit_predict(samples)
plt.scatter(samples[:,0],samples[:,1],c=y_)
在这里插入图片描述
metrics.adjusted_rand_score(y_,target)
0.530328438685834
metrics.silhouette_score(samples,km.labels_)
0.5932400629187524
4、样本量差别很大
samples,target = datasets.make_blobs(n_samples=1500,n_features=2,centers=3,random_state=0)
train1 = samples[target==0][:10]
train2 = samples[target==1][:100]
train3 = samples[target==2][:500]
train = np.concatenate([train1,train2,train3])
# 用train作为训练数据
train.shape
(610, 2)
# 生成标签
target = [0]*10 + [1]*100 + [2]*500
plt.scatter(train[:,0],train[:,1],c=target)
在这里插入图片描述
km = KMeans(n_clusters=3)
y_ = km.fit_predict(train)
plt.scatter(train[:,0],train[:,1],c=y_)
在这里插入图片描述
metrics.adjusted_rand_score(y_,target)
0.3479149392627809
metrics.silhouette_score(train,km.labels_)
0.35994070955867
如果内容对你有帮助,感谢点赞+关注哦!
更多干货内容持续更新中…