欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

机器学习---8.聚类问题

程序员文章站 2022-05-20 19:50:09
...

之前讲的都是监督学习,今天来说说非监督学习。而其中聚类问题作为非监督学习的代表,更要好好谈谈。

非监督学习

回顾一下,什么是非监督学习。非监督学习是指不受监督的学习,是一种*的学习方式,没有先验知识的指导。或者通俗一点地说就是不需要为训练集提供对应类别标签的学习方法

非监督学习主要分为两种:聚类和降维
所以下面聊聊几种聚类算法

聚类问题

聚类是指把相似的对象通过静态分类的方法分成不同组别的子集,使得同一子集中的成员都有相似的属性。
聚类算法主要有系统聚类,KMeans(K-均值聚类),密度聚类和Mean Shift聚类

1.系统聚类:

分为凝聚和分裂两种,凝聚就是由小的分类簇迭代成大的,而分裂则是大的簇分为小的簇

2.KMeans聚类:

把n个点划分到k个簇中,使得每个点都属于离它最近的均值对应的簇

3.密度聚类:

聚类结构依据样本分布密度的紧密程度而确定

4.Mean Shift聚类:

一般是指先算出当前点的偏移均值,然后以此为新的起始点,继续移动,直到满足一定的结束条件。
主要是一种无参密度估计的算法,Mean Shift是一个向量,它的方向是指向当前点上概率密度梯度的方向

下面主要讲讲最常见的系统聚类和KMeans的例子

对iris和葡萄酒数据集聚类的例子

1.对iris进行系统聚类
首先导入数据集,然后使用PCA对数据降维处理,使最后的聚类结果能很好的展现在二维平面上(后面对葡萄酒数据集的处理同理)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy as sp
from matplotlib import cm
import matplotlib as mpl
from sklearn import cluster,datasets
from sklearn.decomposition import PCA
plt.rcParams['axes.unicode_minus']=False
iris=datasets.load_iris()
df=pd.DataFrame(iris.data,columns=iris.feature_names)
df['species']=iris.target
pca=PCA(n_components=3)
newiris=pca.fit_transform(iris.data)
df.head()

机器学习---8.聚类问题

print("方差贡献率:",pca.explained_variance_ratio_)
print("累计方差贡献率:",np.sum(pca.explained_variance_ratio_))

机器学习---8.聚类问题

hicl=cluster.AgglomerativeClustering(n_clusters=3,affinity='euclidean',connectivity=None,linkage='ward')
hicl_pre=hicl.fit_predict(newiris)

newiris[iris.target==0,0]
fig=plt.figure(figsize=(12,5))
ax1=fig.add_subplot(121)
ax1.scatter(newiris[iris.target==0,0],newiris[iris.target==0,1],c='r',alpha=1,marker="*")
ax1.scatter(newiris[iris.target==1,0],newiris[iris.target==1,1],c='g',alpha=1,marker="s")
ax1.scatter(newiris[iris.target==2,0],newiris[iris.target==2,1],c='b',alpha=1,marker="d")
ax1.set_xlabel("主成分1")
ax1.set_ylabel("主成分2")
ax1.set_title("未聚类")

ax2=fig.add_subplot(122)
ax2.scatter(newiris[hicl_pre==0,0],newiris[hicl_pre==0,1],c="g",alpha=1,marker="s")
ax2.scatter(newiris[hicl_pre==1,0],newiris[hicl_pre==1,1],c="r",alpha=1,marker="*")
ax2.scatter(newiris[hicl_pre==2,0],newiris[hicl_pre==2,1],c="b",alpha=1,marker="d")
ax2.set_xlabel("主成分1")
ax2.set_ylabel("主成分2")
ax2.set_title("系统聚类")
plt.subplots_adjust(wspace=0.2)
plt.show()

机器学习---8.聚类问题
然后绘制一下系统聚类树,可以很好的看出聚类数目和系统聚类树形状数量之间的关系

#绘制系统聚类树
from scipy.cluster.hierarchy import dendrogram,linkage
z=linkage(newiris,method='ward',metric='euclidean')
fig=plt.figure(figsize=(30,12))
irisdn=dendrogram(z)
plt.axhline(y=10,color='k',linestyle='solid',label='three class')
plt.axhline(y=20,color='g',linestyle='dashdot',label='two class')
plt.title("层次聚类树")
plt.xlabel("ID")
plt.ylabel("距离")
plt.legend(loc=1)
plt.show()

机器学习---8.聚类问题

2.对葡萄酒数据集进行KMeans聚类

wine=datasets.load_wine(return_X_y=True)
wineX=wine[0]
pca=PCA(n_components=5)
newwine=pca.fit_transform(wineX)
print("累计方差贡献率:",np.sum(pca.explained_variance_ratio_))

机器学习---8.聚类问题

#绘图找出最好的聚类k值
k=np.arange(1,20)
error=[]
for i in k:
    kmeans=cluster.KMeans(n_clusters=i,random_state=1)
    kmeans.fit(newwine)
    error.append(kmeans.inertia_)
plt.figure(figsize=(10,5))
plt.plot(k,error,"r-o")
plt.xlabel("聚类数目")
plt.ylabel("类内误差平方和")
plt.title("K-Means聚类")
plt.xticks(np.arange(1,20,2))
plt.grid()
plt.show()

机器学习---8.聚类问题

#由上图可知分为三类效果最好,所以把k=3
kmean=cluster.KMeans(n_clusters=3,random_state=1)
k_pre=kmean.fit_predict(newwine)
fig=plt.figure(figsize=(6,5))
ax1=fig.add_subplot(111)
ax1.scatter(newwine[k_pre==0,0],newwine[k_pre==0,1],c='r',alpha=1,marker="*")
ax1.scatter(newwine[k_pre==1,0],newwine[k_pre==1,1],c='g',alpha=1,marker="s")
ax1.scatter(newwine[k_pre==2,0],newwine[k_pre==2,1],c='b',alpha=1,marker="d")

ax1.scatter(kmean.cluster_centers_[:,0],kmean.cluster_centers_[:,1],c='white',marker='o',s=80,edgecolor='k')#聚类的中心点,设成白色
ax1.set_xlabel("主成分1")
ax1.set_ylabel("主成分2")
ax1.set_title("KMeans聚类为三类的结果")
plt.show()

机器学习---8.聚类问题

总结:

聚类问题在日常生活中还是经常能遇到,毕竟很多东西本来就是没有自带标签的,然后例子中也是使用最普遍的算法,还有相关的其他算法以后会补充。

相关标签: KMeans