未格式化之前的代码:
python
import pandas as pd#数据处理
from matplotlib import pyplot as plt#绘图
from sklearn.preprocessing import MinMaxScaler#归一化
from sklearn.cluster import KMeans#聚类
import os#处理文件
os.environ["OMP_NUM_THREADS"] = '4'
df = pd.read_excel("consumption_data.xls", usecols=["R", "F", "M"])#选取了"R"、"F"和"M"三列数据
df.dropna(inplace=True)#将缺失值删除
df_scale = MinMaxScaler().fit_transform(df)#归一化,使得数据在0到1的范围内
model = KMeans(n_clusters=3, random_state=0)#n_clusters参数设置为3,表示要将数据分成3个簇。random_state参数设置为0,以确保每次运行时都得到相同的结果
model.fit(df_scale)#训练模型
core = model.cluster_centers_#通过cluster_centers_属性获取聚类模型中心点的坐标,即每个簇的中心点
df["class"] = model.labels_#将每个数据点的簇标签保存在原始数据集的"class"列中,使用labels_属性获取每个数据点所属的簇的标签
fig = plt.figure(figsize=(9, 9))#创建一个大小为9x9的图形窗口
ax = plt.axes(projection='3d')#创建一个3D坐标轴
center_x = []#创建空列表用于存储各个簇的中心点坐标。
center_y = []
center_z = []
for i, j in df.groupby(by="class"):#对数据集按簇标签进行分组
ax.scatter3D(j["F"], j["R"], j["M"], label=i)#将每个簇的数据点在3D空间中绘制为散点图
center_x.append(j["F"].mean())#计算每个簇的中心点坐标,并将其添加到相应的列表中。
center_y.append(j["R"].mean())
center_z.append(j["M"].mean())
# ax.scatter3D(j["F"].mean(),j["R"].mean(),j["M"].mean(),marker="X") 使用scatter3D()函数将每个簇的中心点坐标(j["F"].mean(), j["R"].mean(), j["M"].mean())以"X"形状的标记绘制在图中。
ax.scatter3D(center_x, center_y, center_z, label='center', marker="X", alpha=1)#以"X"形状的标记绘制簇的中心点。alpha参数设置为1,表示散点图的透明度为完全不透明
plt.legend()#显示图例
plt.show()#显示图形
for i, j in df.groupby(by="class"):#对数据集按簇标签进行分组。
j[["R", "F", "M"]].plot(kind="kde", subplots=True, sharex=False)#对每个簇的三个特征绘制核密度图。kind="kde"指定绘制核密度图,subplots=True表示将三个子图绘制在同一画布上,sharex=False表示不共享x轴。
plt.subplots_adjust(hspace=0.3) # 调整子图的纵向间隙,hspace=0.3将纵向间隔设置为子图高度的30%。这将使得每个子图之间有一定的空白间隔
plt.show()#显示图形
格式化之后的代码:
python
import pandas as pd # 数据处理
from matplotlib import pyplot as plt # 绘图
from sklearn.preprocessing import MinMaxScaler # 归一化
from sklearn.cluster import KMeans # 聚类
import os # 处理文件
os.environ["OMP_NUM_THREADS"] = '4'
df = pd.read_excel("consumption_data.xls", usecols=["R", "F", "M"]) # 选取了"R"、"F"和"M"三列数据
df.dropna(inplace=True) # 将缺失值删除
df_scale = MinMaxScaler().fit_transform(df) # 归一化,使得数据在0到1的范围内
model = KMeans(n_clusters=3, random_state=0) # n_clusters参数设置为3,表示要将数据分成3个簇。random_state参数设置为0,以确保每次运行时都得到相同的结果
model.fit(df_scale) # 训练模型
core = model.cluster_centers_ # 通过cluster_centers_属性获取聚类模型中心点的坐标,即每个簇的中心点
df["class"] = model.labels_ # 将每个数据点的簇标签保存在原始数据集的"class"列中,使用labels_属性获取每个数据点所属的簇的标签
fig = plt.figure(figsize=(9, 9)) # 创建一个大小为9x9的图形窗口
ax = plt.axes(projection='3d') # 创建一个3D坐标轴
center_x = [] # 创建空列表用于存储各个簇的中心点坐标。
center_y = []
center_z = []
for i, j in df.groupby(by="class"): # 对数据集按簇标签进行分组
ax.scatter3D(j["F"], j["R"], j["M"], label=i) # 将每个簇的数据点在3D空间中绘制为散点图
center_x.append(j["F"].mean()) # 计算每个簇的中心点坐标,并将其添加到相应的列表中。
center_y.append(j["R"].mean())
center_z.append(j["M"].mean())
# ax.scatter3D(j["F"].mean(),j["R"].mean(),j["M"].mean(),marker="X") 使用scatter3D()函数将每个簇的中心点坐标(j["F"].mean(), j["R"].mean(), j["M"].mean())以"X"形状的标记绘制在图中。
ax.scatter3D(center_x, center_y, center_z, label='center', marker="X",
alpha=1) # 以"X"形状的标记绘制簇的中心点。alpha参数设置为1,表示散点图的透明度为完全不透明
plt.legend() # 显示图例
plt.show() # 显示图形
for i, j in df.groupby(by="class"): # 对数据集按簇标签进行分组。
j[["R", "F", "M"]].plot(kind="kde", subplots=True,
sharex=False) # 对每个簇的三个特征绘制核密度图。kind="kde"指定绘制核密度图,subplots=True表示将三个子图绘制在同一画布上,sharex=False表示不共享x轴。
plt.subplots_adjust(hspace=0.3) # 调整子图的纵向间隙,hspace=0.3将纵向间隔设置为子图高度的30%。这将使得每个子图之间有一定的空白间隔
plt.show() # 显示图形