先来张风景图,冷静一下浮躁的心
深呼吸!
声明
本聚类并不是市面上烂大街的对一些点进行聚类,而是对多行多列的真正的excell表格的数据进行聚类,众所周知这是非常难的,因为市面上没有,代码也很贵需要40多块钱,但是现在我来公布一下这个巨额的代码!
屏住呼吸,不要睁眼。我数3 2 1
插播一下我知道有些人不喜欢看风景:所以!!!!
好了,下面开始步入正题
Kmeans:
K-means聚类算法是一种常用的无监督学习方法,它通过迭代计算将数据点划分为K个簇,以发现数据中的自然分组。在用电负荷分析中,K-means聚类可以帮助识别不同类型的负荷模式,如居民用电、商业用电、工业用电等,从而优化电力分配、提高能源效率并实现智能电网的愿景。
在K-means算法中,选择合适的K值(即聚类的数量)是一个关键步骤,因为它直接影响聚类结果的质量。(当然我有一种办法可以自动确定K值,有一种方法是简单的比如轮廓系数等评价来自动确定,还有一种办法很高级,我先不剧透)
在用电负荷分析中,评价K-means聚类效果通常涉及以下几个关键指标:
-
轮廓系数 (Silhouette Coefficient):轮廓系数是衡量聚类内部相似度与聚类之间分离度的一个指标。其值介于-1和1之间,值越高表示聚类效果越好。轮廓系数通过计算每个数据点的平均轮廓来评估整个聚类结构的一致性。
-
Davies-Bouldin指数:这个指标通过计算每个聚类中心与其他聚类中心距离的平均值的平方根,并除以该聚类内所有点对之间的最小距离的平均值来评估聚类的质量。Davies-Bouldin指数越低,表明聚类效果越佳。
-
Calinski-Harabasz指数:此指标通过比较聚类内部的方差与聚类间的方差之比来评估聚类的有效性。比值越大,聚类效果越好
下面来看代码:
# 读取Excel数据
# file_path = r'D:\ruanjian\chuanganqishuju\spss.xlsx'
file_path = r'D:/a项目/光伏/新建 Microsoft Excel 工作表.xlsx'
data = pd.read_excel(file_path)
# 提取电力负荷数据
load_data = data.iloc[:, 1:].values # 确保使用.values来获取NumPy数组
print(load_data)
# 初始化列表来存储不同聚类数量的轮廓系数
silhouette_scores = []
# 循环遍历不同的聚类数量(从2到15)
for n_clusters in range(2, 16):
kmeans = KMeans(n_clusters=n_clusters, random_state=42) # 为了可复现性,添加random_state
kmeans.fit(load_data)
labels = kmeans.labels_
# 计算轮廓系数
silhouette_avg = silhouette_score(load_data, labels)
silhouette_scores.append(silhouette_avg)
print(f"Number of clusters: {n_clusters}, Silhouette Score: {silhouette_avg}")
# 找出最大轮廓系数及其对应的聚类数
max_silhouette_score = max(silhouette_scores)
s = silhouette_scores.index(max_silhouette_score) + 2 # 加2是因为循环从2开始
print(f"Best number of clusters: {s}")
load_data = data.iloc[:, 1:].values # 确保使用.values来获取NumPy数组
# 使用最佳聚类数量重新进行KMeans聚类
print(load_data)
kmeans = KMeans(n_clusters=s, random_state=42)
kmeans.fit(load_data)
labels = kmeans.labels_
print(labels)
# 计算每个聚类的中心点
cluster_centers = kmeans.cluster_centers_
for i in range(s):
# 使用列表推导式找到所有标签等于i的索引
indices = np.where(labels == i)
cluster_data = load_data[indices]
# 计算聚类中心点
cluster_centers = kmeans.cluster_centers_[i]
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))
# 绘制聚类中心点
ax1.plot(cluster_centers, linestyle='--', color='red')
ax1.set_title(f'Cluster Center {i}')
ax1.set_xlim(0, 96)
ax1.set_xlabel('Sample Points')
ax1.set_ylabel('Value')
ax1.set_xticks([0, 20, 40, 60, 80])
# 绘制数据点
for row in cluster_data:
ax2.plot(row)
ax2.set_title(f'Cluster Data {i}')
ax2.set_xlim(0, 96)
ax2.set_xlabel('Sample Points')
ax2.set_ylabel('Value')
ax2.set_xticks([0, 20, 40, 60, 80])
plt.tight_layout()
plt.show()
这是一个完整的聚类算法,采用了最大轮廓系数自动确定聚类数目,非常有实力,收藏并关注 20+的话, 后续我会添加更高级代码并进行并进行并进行具体解释
来看一下结果