ML 9day 开始无监督学习 聚类算法 K-means clustering.

本文通过动画直观展示了K-means聚类算法的工作原理,对比KNN算法,指出K-means的缺陷,并介绍了层次聚类法的基本过程,强调其不需预设聚类数量的特点。

先看一个flush动画
http://shabal.in/visuals/kmeans/6.html
在这里插入图片描述
如图所示,数据样本用圆点表示,每个簇的中心点用叉叉表示。(a)刚开始时是原始数据,杂乱无章,没有label,看起来都一样,都是绿色的。(b)假设 数据集可以分为两类,令K=2,随机在坐标上选两个点,作为两个类的中心点。(c-f)演示了聚类的两种迭代。先划分,把每个数据样本划分到最近的中心点 那一簇;划分完后,更新每个簇的中心,即把该簇的所有数据点的坐标加起来去平均值。这样不断进行”划分—更新—划分—更新”,直到每个簇的中心不在移动为止。

在这里插入图片描述

对比KNN算法和k-means算法
在这里插入图片描述

Kmeans算法的缺陷

聚类中心的个数K 需要事先给定,但在实际中这个 K 值的选定是非常难以估计的,很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适
Kmeans需要人为地确定初始聚类中心,不同的初始聚类中心可能导致完全不同的聚类结果。(可以使用Kmeans++算法来解决)

层次聚类法

层次聚类法的原理较为简单。它的基本过程如下:

每一个样本点视为一个簇;
1、计算各个簇之间的距离,最近的两个簇聚合成一个新簇;
2、重复以上过程直至最后只有一簇。
3、层次聚类不指定具体的簇数,而只关注簇之间的远近,最终会形成一个树形图。

### K-Means聚类算法用于选择典型日的实现方法 K-Means聚类可以应用于时间序列数据分析,以识别具有相似特征的日子作为典型日。通过分析历史数据中的模式并将其分组,能够有效找出代表性的日子。 #### 数据预处理 为了应用K-Means进行典型日的选择,首先需要准备合适的数据集。通常情况下,这涉及收集一段时间内的每日用电量或其他相关指标,并确保这些数值被标准化以便于比较不同规模下的消费情况[^1]。 ```python import pandas as pd from sklearn.preprocessing import StandardScaler # 假设df是一个包含日期索引和每小时负荷列的DataFrame scaler = StandardScaler() scaled_data = scaler.fit_transform(df) ``` #### 应用K-Means模型 接着,在经过预处理后的数据上运行K-Means算法。这里的关键在于决定合适的簇数\( k \),即想要选出多少个典型的天数。可以通过肘部法则(elbow method)或轮廓系数(silhouette score)等技术来辅助确定最优的\( k \)[^2]。 ```python from sklearn.cluster import KMeans import matplotlib.pyplot as plt inertia_values = [] for i in range(1, 10): km = KMeans(n_clusters=i, random_state=42).fit(scaled_data) inertia_values.append(km.inertia_) plt.plot(range(1, 10), inertia_values, marker='o') plt.title('Elbow Method For Optimal k') plt.xlabel('Number of clusters') plt.ylabel('Inertia') plt.show() optimal_k = ... # 根据图形判断最佳k值 km_optimal = KMeans(n_clusters=optimal_k, random_state=42).fit(scaled_data) labels = km_optical.labels_ ``` #### 解析结果获取典型日 一旦完成了聚类操作,则可以根据分配给各个簇的日志记录进一步探索哪些特性使得某些天成为“典型”。对于每一个簇而言,可以选择该类别中最接近质心的一天作为其代表性实例;或者计算平均曲线来构建理想化的典型日形象。 ```python centroids = km_optimal.cluster_centers_ def find_nearest_day_to_centroid(cluster_index): cluster_points = scaled_data[labels == cluster_index] distances_from_center = ((cluster_points - centroids[cluster_index])**2).sum(axis=1) nearest_point_idx = distances_from_center.argmin() return df.index[nearest_point_idx] typical_days_indices = [find_nearest_day_to_centroid(i) for i in range(optimal_k)] print("Selected typical days:", typical_days_indices) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值