机器学习聚类分析算法——python详细代码解析(sklearn)
聚类分析算法是一种非监督式学习算法,它旨在将数据集中的样本划分为若干个组或“簇”,使得同一个簇内的样本相似度较高,而不同簇之间的样本相似度较低。针对的是没有响应变量而仅有特征变量的数据集,其主要作用就是快速分类。虽然是非监督式学习算法,但聚类分析也有很多应用场景,比如电商平台系统对具有相似购买行为的用户进行聚类,针对划分好的客户类别,将某用户购买的产品在同一类别用户内进行推荐,实现精准促销;或者根据以往销售记录及其他特征对产品进行聚类,若某用户购买了一款产品,则继续向他推送同一类别的其他产品。我们讲解聚类分析算法的基本原理,并结合具体实例讲解该算法在Python中的实现与应用。
聚类分析方法:
划分聚类分析是一种将数据样本分配到预定义的、不重叠的组中的方法。它主要有两种形式:K均值聚类和K中位数聚类。
K均值聚类是一种流行的方法,它通过以下步骤实现:
层次聚类分析也称为系统聚类分析。与划分聚类分析方法的原理不同,层次聚类分析的基本原理是根据选定的特征来识别相对均一的个案(变量)组,使用的算法是首先将每个个案(或变量)都视为一类,然后根据类与类之间的距离或相似程度将最近的类加以合并,再计算新类与其他类之间的相似程度,并选择最相似的加以合并,这样每合并一次就减少一类,不断继续这一过程,最终实现完全聚类,即把所有的观测样本汇集到一个组中。
在实际分析中常用到的一个层次聚类分析工具是树状图,那么,到底分成了多少类呢?这取决于研究的需要和实际的情况,需要用户加入自己的判断,确定好分类需求后,从聚类分析树状图最上面使用分割框往下进行分割。例如需要把所有样本观测值分成两类时。与划分聚类分析方法相比,层次聚类分析方法的计算过程更为复杂,计算速度相对较慢,但是它不要求事先指定需要分类的数量,这一点是符合聚类分析探索性的本质特点的,所以这种聚类分析方法应用也非常广泛。
样本距离的测度
无论是划分聚类分析还是层次聚类分析,本质都是按照一定的距离对样本进行分割,在一定标准距离范围以内的样本被划分为一个类别,所以如何测度样本数据之间的距离就变得非常重要。现就常用的距离测度方法介绍如下:
1.针对连续特征变量数据的距离标准
2.针对分类特征变量数据的距离标准
针对聚类分析算法,同样要求首先对特征变量数据进行标准化,之所以这么做,是因为如果不进行标准化,少数变量可能会对距离影响过大,使得分析结果严重失真。
案例
1 载入分析所需要的库和模块
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.cluster import KMeans
from sklearn.cluster import AgglomerativeClustering
from sklearn.preprocessing import StandardScaler
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
2 变量设置及数据处理
data=pd.read_csv(r"数据12.1.csv")
X = data.iloc[:,[2,5,6,7]]#设置分析所需要的特征变量
X.info()
len(X.columns)
X.columns
X.shape
X.dtypes
X.isnull().values.any()
X.isnull().sum()
X.head(10)
scaler = StandardScaler()
scaler.fit(X)
X_s = scaler.transform(X)
X_s = pd.DataFrame(X_s, columns=X.columns)
#相关性分析
print(X_s.corr(method='pearson'))
plt.subplot(1,1,1)
sns.heatmap(X_s.corr(), annot=True)
plt.title('相关性热力图')
plt.show()
plt.savefig('相关性热力图.png')
3 划分聚类分析算法
#1使用K均值聚类分析方法对样本示例进行聚类(K=2)
model = KMeans(n_clusters=2, random_state=2)
model.fit(X_s)
model.labels_
pd.DataFrame(model.labels_.T, index=data.V1,columns=['聚类'])
print(model.cluster_centers_)
print(model.inertia_)
#2使用K均值聚类分析方法对样本示例进行聚类(K=3)
model = KMeans(n_clusters=3, random_state=2)
model.fit(X_s)
model.labels_
pd.DataFrame(model.labels_.T, index=data.V1,columns=['聚类'])
np.set_printoptions(suppress=True)#不以科学计数法显示,而是直接显示数字
print(model.cluster_centers_)
print(model.inertia_)
#绘图
plt.scatter(X_s.iloc[:,0],X_s.iloc[:,1],c=model.labels_)
plt.scatter(model.cluster_centers_[:,0],model.cluster_centers_[:,1],marker='x',color='red')
plt.xlabel('V5')
plt.ylabel('V6')
plt.title('K=2均值聚类分析结果')
plt.show()
plt.savefig('K均值聚类分析结果.png')
#3使用K均值聚类分析方法对样本示例进行聚类(K=4)
model = KMeans(n_clusters=4, random_state=3)
model.fit(X_s)
model.labels_
pd.DataFrame(model.labels_.T, index=data.V1,columns=['聚类'])
print(model.cluster_centers_)
print(model.inertia_)
4 层次聚类方法
#1最短联结法聚类分析
linkage_matrix = linkage(X_s, 'single')
plt.rcParams['font.sans-serif'] = ['SimHei']#解决图表中中文显示问题
dendrogram(linkage_matrix)
plt.title('最短联结法聚类分析树状图')
plt.show()
plt.savefig('最短联结法聚类分析树状图.png')
model = AgglomerativeClustering(n_clusters=3, linkage='single')
model.fit(X_s)
model.labels_
pd.DataFrame(model.labels_.T, index=data.V1,columns=['聚类'])
#2最长联结法聚类分析
linkage_matrix = linkage(X_s , 'complete')
dendrogram(linkage_matrix)
plt.title('最长联结法聚类分析树状图')
plt.show()
plt.savefig('最长联结法聚类分析树状图.png')
model = AgglomerativeClustering(n_clusters=3, linkage='complete')
model.fit(X_s )
model.labels_
pd.DataFrame(model.labels_.T, index=data.V1,columns=['聚类'])
#3平均联结法聚类分析
linkage_matrix = linkage(X_s, 'average')
dendrogram(linkage_matrix)
plt.title('平均联结法聚类分析树状图')
plt.show()
plt.savefig('平均联结法聚类分析树状图.png')
model = AgglomerativeClustering(n_clusters=3, linkage='average')
model.fit(X_s)
model.labels_
pd.DataFrame(model.labels_.T, index=data.V1,columns=['聚类'])
#4 ward联结法聚类分析
linkage_matrix = linkage(X_s, 'ward')
dendrogram(linkage_matrix)
plt.title('ward联结法聚类分析树状图')
plt.show()
plt.savefig('ward联结法聚类分析树状图.png')
model = AgglomerativeClustering(n_clusters=3,linkage='ward')
model.fit(X_s)
model.labels_
pd.DataFrame(model.labels_.T, index=data.V1,columns=['聚类'])
#5 重心联结法聚类分析
linkage_matrix = linkage(X_s, 'centroid')
dendrogram(linkage_matrix)
plt.title('重心联结法聚类分析树状图')
plt.show()
plt.savefig('重心联结法聚类分析树状图.png')
labels = fcluster(linkage_matrix, t=3, criterion='maxclust')
labels
pd.DataFrame(labels.T, index=data.V1,columns=['聚类'])
作者:python机器学习ML