导航
  • 全部
...

模型介绍聚类与数据包络|“朝闻道”知识分享大赛

简单凯凯 2024-12-02 11:38:34

这是我参加朝闻道知识分享大赛的第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()

数据包络分析(DEA)

数据包络分析(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模型结果。结果越小,表示该决策单元的效率越高。

...全文
给本帖投票
25 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
2401_89452659 2024-12-03
  • 打赏
  • 举报
回复
感谢分享感谢分享

1,040

社区成员

发帖
与我相关
我的任务
社区描述
中南民族大学CSDN高校俱乐部聚焦校内IT技术爱好者,通过构建系统化的内容和运营体系,旨在将中南民族大学CSDN社区变成校内最大的技术交流沟通平台。
经验分享 高校 湖北省·武汉市
社区管理员
  • c_university_1575
  • WhiteGlint666
  • wzh_scuec
加入社区
社区公告

欢迎各位加入中南民族大学&&CSDN高校俱乐部社区(官方QQ群:908527260),成为CSDN高校俱乐部的成员具体步骤(必填),填写如下表单,表单链接如下:
人才储备数据库及线上礼品发放表单邀请人吴钟昊:https://ddz.red/CSDN
CSDN高校俱乐部是给大家提供技术分享交流的平台,会不定期的给大家分享CSDN方面的相关比赛以及活动或实习报名链接,希望大家一起努力加油!共同建设中南民族大学良好的技术知识分享社区。

注意:

1.社区成员不得在社区发布违反社会主义核心价值观的言论。

2.社区成员不得在社区内谈及政治敏感话题。

3.该社区为知识分享的平台,可以相互探讨、交流学习经验,尽量不在社区谈论其他无关话题。

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部