在之前的文章中了解一些基本的聚类分析知识后,现在我们来看看用代码怎么实现它吧。 (在jupyter notebook中实现;其中使用的数据集均从UCI上下载)
层次聚类 1、需要导入pandas库,用于读取文件。 (这里使用的是有关心脏病的数据集,现在取患者年龄和对应的静息血压两列进行分析)
import pandas as pd
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堆
from sklearn.cluster import KMeans
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_
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'])
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)
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
结果:
plt.plot(list(range(2,20)),scores)
plt.xlabel('Number')
plt.ylabel('Score')
结果: DBSCAN聚类 同样的导入库from sklearn.cluster import DBSCAN,用于进行聚类
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的相似,可以进行数据标准化,再继续聚类,构图。
|