聚类分析(简单代码实现)

在上一篇文章中学习了一些基本的聚类分析知识之后,现在让我们看看如何在代码中实现它。
(在jupyter notebook中实现;其中使用的数据集均从UCI上下载)

层次聚类
1、需要导入pandas库,用于读取文件。
(这里使用的是关于心脏病的数据集,现在取患者年龄和对应的静息血压两列进行分析)

import pandas as pd

#这两行表示在jupyter中显示所有行和列
pd.set_option("display.max_rows",None)
pd.set_option("display.max_columns",None)

df=pd.read_csv('heartdisease_cleveland.csv',nrows=50,usecols=[0,3])
df.head()

结果:
聚类分析(简单代码实现)
2、接下来将每一行数据转换为array结构。

samples=df.values
samples

结果:
聚类分析(简单代码实现)
3、导入scipy.cluster.hierarchy.linkage(y, method=’ ‘, metric=’ ‘, optimal_ordering=False),以进行层次聚类。y:y: 可以是1维压缩向量(距离向量),也可以是2维观测向量(坐标矩阵)。若y是1维压缩向量,则y必须是n个初始观测值的组合,n是坐标矩阵中成对的观测值;linkage方法用于计算两个聚类簇之间的距离d(x1,x2);method:计算新形成的聚类簇u和v之间距离的方法,参数有single,complete,average,weighted,centroid,median,ward;optimal_ordering:bool,若为true,linkage矩阵则被重新排序,以便连续叶子间距最小。当数据可视化时,这将使得树结构更为直观。默认为false,因为数据集非常大时,执行此操作计算量将非常大。
导入import matplotlib.pyplot as plt,以构建树状图。

#计算距离,树状图
from scipy.cluster.hierarchy import linkage,dendrogram
import matplotlib.pyplot as plt

#进行层次聚类
mergings=linkage(samples,method='complete')
mergings

结果:
聚类分析(简单代码实现)
4、绘制图像

fig=plt.figure(figsize=(20,20))
dendrogram(mergings,leaf_rotation=90,leaf_font_size=6)
plt.xticks(fontproperties='Times New Roman', size=17)
plt.show()

结果:
聚类分析(简单代码实现)
最后,可以看到层次聚类组成的图像。

K-Means聚类
(这里使用鸢尾花数据集,标签为萼片长度、萼片宽度、花瓣长度、花瓣宽度)
1、导入数据集

data=pd.read_csv('iris.csv',nrows=100,usecols=[0,1,2,3])
data

结果:
聚类分析(简单代码实现)
2、导入sklearn库,from sklearn.cluster import KMeans,用于实现K-Means聚类,
n_clusters表示簇值,想要聚成多少堆,这里分别聚成2堆,3堆

#K-Means clustering
from sklearn.cluster import KMeans

#n_clusters表示簇值,想要聚成多少堆
km=KMeans(n_clusters=3).fit(data)
km2=KMeans(n_clusters=2).fit(data)

3、查看一下当簇值为3时,各个数据分别属于哪一个簇。

km.labels_

结果:聚类分析(简单代码实现)

data['cluster']=km.labels_
data['cluster2']=km2.labels_
data.sort_values('cluster')

结果:聚类分析(简单代码实现)
4、导入pandas.plotting,绘制散点图。cluster_centers_计算数据对应的中心点

from pandas.plotting import scatter_matrix
%matplotlib inline

cluster_centers=km.cluster_centers_
cluster_center_2=km2.cluster_centers_
#查看对应不同的cluster每个参数的均值,看它们的差异性
data.groupby('cluster').mean()

结果:
聚类分析(简单代码实现)

data.groupby('cluster2').mean()

结果:聚类分析(简单代码实现)
5、可以绘制几个标签的数据来看看

import numpy as np
plt.rcParams['font.size']==14
colors=np.array(['red','blue','yellow','green'])
#画出swidth和pwidth相关的数据点

plt.scatter(data['swidth'],data['pwidth'],c=colors[data['cluster']])

#各个数据的中心点
plt.scatter(centers.swidth,centers.pwidth,linewidths=3,marker='*',s=30,c='black')

plt.xlabel('swidth')
plt.ylabel('pwidth')

结果:聚类分析(简单代码实现)

#画出所有数据相互之间的特征关系
scatter_matrix(data[[' slength','swidth','plength','pwidth']],s=100,alpha=1,c=colors[data['cluster']],figsize=(7,6))
plt.suptitle('cluster')

结果:聚类分析(简单代码实现)
Scaled data
注意重点:机器学习中对数据的处理是重中之重,需要对数据进行归一化和标准化,以消除特征之间的差异。
1、导入sklearn.preprocessing,,使用StandardScaler进行数据标准化。

#聚类之间先对数据进行归一化,标准化一下
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
X_scaled=scaler.fit_transform(data)
#消除数值之间的差异性
X_scaled

结果:聚类分析(简单代码实现)

km=KMeans(n_clusters=3).fit(X_scaled)

data["scaled_cluster"]=km.labels_
data.sort_values("scaled_cluster")

结果:
聚类分析(简单代码实现)
2、画出图形

scatter_matrix(data[[' slength','swidth','plength','pwidth']],s=100,alpha=1,c=colors[data['scaled_cluster']],figsize=(7,6))
plt.suptitle('scaled_cluster')

结果:聚类分析(简单代码实现)
(此时可以比较归一化和非归一化数据的区别)

轮廓因子
简单地说,就是寻找合适的参数来评价分类结果的准确性或适应度。

#计算轮廓系数的值
from sklearn import metrics
#归一化之后的
score_scaled=metrics.silhouette_score(data,data.scaled_cluster)
#没有归一化
score=metrics.silhouette_score(data,data.cluster)

#这里判断k值怎么选择是最合适的,选择系数较高的
scores=[]
for k in range(2,20):
    labels=KMeans(n_clusters=k).fit(data).labels_
    score=metrics.silhouette_score(data,labels)
    scores.append(score)
scores

结果:
聚类分析(简单代码实现)

#画一个图直观看出哪一个k最合适
plt.plot(list(range(2,20)),scores)
plt.xlabel('Number')
plt.ylabel('Score')

结果:聚类分析(简单代码实现)
DBSCAN聚类
同样的导入库from sklearn.cluster import DBSCAN,用于进行聚类

#想要知道哪一些参数比较合适,可以进行轮廓系数的求解
#eps即半径,min_samples即密度
from sklearn.cluster import DBSCAN 
db=DBSCAN(eps=6,min_samples=2).fit(data)
labels=db.labels_
data['cluster_db']=labels
data.sort_values('cluster_db')

之后的操作与K-Means的相似,可以进行数据标准化,再继续聚类,构图。

版权声明:本文为博主熊️兔原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/qq_52669357/article/details/123233344

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2022年3月3日 下午6:26
下一篇 2022年3月4日 上午10:14

相关推荐