1,040
社区成员




这是我参加朝闻道知识分享大赛的第40篇文章
聚类
聚类是一种无监督学习方法,用于将数据集中的对象分组到不同的类别中。常见的聚类算法包括K-means、层次聚类等。下面我将详细介绍如何使用K-means算法进行聚类,并展示如何可视化聚类结果。
K-means聚类模型
K-means是一种常用的聚类算法,它通过迭代优化来将数据点分配到K个簇中。
代码实现
python
import sklearn from sklearn import cluster from sklearn.preprocessing import StandardScaler import pandas as pd # 假设data2_1_2是你的数据集 # Kmeans聚类模型,四个聚类簇 model = cluster.KMeans(n_clusters=4) # 标准化模型 scaler = StandardScaler() # 标准化 data_ = scaler.fit_transform(data2_1_2.loc[:, ['总氮百分比', 'P2O5百分比', 'K2O百分比']]) # 模型训练 model.fit(data_) # 对数据进行聚类得到标签 labels = model.predict(data_) # 将标签加入到data数据中 data2_1_2['聚类标签'] = labels + 1 data2_1_2
可视化聚类结果
我们可以使用散点图、散点图矩阵和三维散点图来可视化聚类结果。
二维散点图
python
import seaborn as sns import matplotlib.pyplot as plt # 假设data是你的数据集 sns.set(font='SimHei') sns.scatterplot(data=data, x='本月内累计消费次数', y='平均每次刷卡消费金额', hue='labels', palette='rainbow') plt.title('七个消费群体散点图') plt.show()
散点图矩阵
python
plt.figure(figsize=(18, 7)) sns.set_palette(sns.color_palette("RdPu")) g = sns.PairGrid(data2_3_1[['总氮百分比', 'P2O5百分比', 'K2O百分比', '聚类标签']], hue="聚类标签") g = g.map_diag(plt.hist) g = g.map_offdiag(plt.scatter) g = g.add_legend() plt.show()
三维散点图
python
from mpl_toolkits.mplot3d import Axes3D colors = ['#a88f59', '#da467d', '#fdb915', '#69d84f', '#380282', 'r', 'b'] fig = plt.figure(figsize=(15, 8)) ax = fig.add_subplot(121, projection='3d') for i in data['labels'].unique(): d = data[data['labels'] == i] ax.scatter(d['本月内累计消费次数'], d['平均每次刷卡消费金额'], d['消费总金额'], c=colors[i], label=i) ax.set_xlabel('本月内累计消费次数') ax.set_ylabel('平均每次刷卡消费金额') ax.set_zlabel('消费总金额') plt.title('高钾:层次聚类结果图', fontsize=15) plt.legend() plt.show()
数据包络分析(Data Envelopment Analysis, DEA)是一种用于评估多输入多输出系统效率的方法。DEA通过构建一个前沿面来评估每个决策单元(DMU)的相对效率。
有非期望产出的超效率SBM模型
超效率SBM模型(Super-Efficiency Slacks-Based Measure)是一种改进的DEA模型,用于处理非期望产出(如污染、废弃物等)。
代码实现
python
import pandas as pd import numpy as np from scipy import optimize # 读取数据 df = pd.read_excel("dea_data.xlsx", index_col=0) data = df.values # 输入和输出 x = data[:, 0:2] x = x.T y_g = data[:, 2:4] y_g = y_g.T y_b = data[:, 4] y_b = y_b.reshape(1, -1) # 维度 m, n = x.shape s1 = y_g.shape[0] s2 = y_b.shape[0] # 超效率SBM模型 theta = [] for i in range(n): f = np.concatenate([np.zeros(n), -1 / (m * x[:, i]), np.zeros(s1 + s2), np.array([1])]) Aeq1 = np.hstack([x, np.identity(m), np.zeros((m, s1 + s2)), -x[:, i, None]]) Aeq2 = np.hstack([y_g, np.zeros((s1, m)), -np.identity(s1), np.zeros((s1, s2)), -y_g[:, i, None]]) Aeq3 = np.hstack([y_b, np.zeros((s2, m)), np.zeros((s2, s1)), np.identity(s2), -y_b[:, i, None]]) Aeq4 = np.hstack([np.zeros(n), np.zeros(m), 1 / ((s1 + s2) * (y_g[:, i])), 1 / ((s1 + s2) * (y_b[:, i])), np.array([1])]).reshape(1, -1) Aeq = np.vstack([Aeq1, Aeq2, Aeq3, Aeq4]) beq = np.concatenate([np.zeros(m + s1 + s2), np.array([1])]) bounds = tuple([(0, None) for t in range(n + s1 + s2 + m + 1)]) res = optimize.linprog(c=f, A_eq=Aeq, b_eq=beq, bounds=bounds) theta.append(res.fun) # 输出结果 print("超效率SBM模型结果:", theta)
结果分析
通过上述代码,我们可以得到每个决策单元的超效率SBM模型结果。结果越小,表示该决策单元的效率越高。