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

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

非监督学习

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

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

聚类问题

聚类是指把相似的对象通过静态分类的方法分成不同组别的子集,使得同一子集中的成员都有相似的属性。
聚类算法主要有系统聚类,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()

在这里插入图片描述

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

在这里插入图片描述

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()

在这里插入图片描述
然后绘制一下系统聚类树,可以很好的看出聚类数目和系统聚类树形状数量之间的关系

#绘制系统聚类树
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()

在这里插入图片描述

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_))

在这里插入图片描述

#绘图找出最好的聚类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()

在这里插入图片描述

#由上图可知分为三类效果最好,所以把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()

在这里插入图片描述

总结:

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

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shelgi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值