import numpy as np import pandas as pd from sklearn.metrics import silhouette_score # 1. K-Means++ 初始化质心 def initialize_centroids(data, k): centroids = [data[np.random.randint(data.shape[0])]] for _ in range(1, k): distances = np.array([min([np.linalg.norm(x - c) for c in centroids]) for x in data]) probabilities = distances / distances.sum() cumulative_probabilities = np.cumsum(probabilities) r = np.random.rand() for i, p in enumerate(cumulative_probabilities): if r < p: centroids.append(data[i]) break return np.array(centroids) # 2. K-Means 核心迭代流程 def k_means(data, k, max_iters=100, tol=1e-4): centroids = initialize_centroids(data, k) for _ in range(max_iters): clusters = [[] for _ in range(k)] for x in data: distances = [np.linalg.norm(x - c) for c in centroids] cluster_index = np.argmin(distances) clusters[cluster_index].append(x) new_centroids = np.array([np.mean(cluster, axis=0) if cluster else centroids[i] for i, cluster in enumerate(clusters)]) if np.all(np.abs(new_centroids - centroids) < tol): break centroids = new_centroids return centroids, clusters # 3. 验证方法:轮廓系数 def silhouette_analysis(data, clusters): labels = np.zeros(data.shape[0], dtype=int) idx = 0 for i, cluster in enumerate(clusters): for _ in cluster: labels[idx] = i idx += 1 silhouette_avg = silhouette_score(data, labels) return silhouette_avg # 4. 主函数 def main(): # 加载数据 file_path = "C:\\Users\\刘梦雅\\Desktop\\2.xlsx " # 您的数据文件路径 data = pd.read_excel(file_path, engine='openpyxl').values k = 2 # 聚类数 max_iters = 100 tol = 1e-4 # 运行 K-Means centroids, clusters = k_means(data, k, max_iters, tol)根据上面的内容,给我K 均值聚类分析: C1, C2 标准化变量 最终分割 聚类数 3 观测值 类内平 到质心的 到质心的 个数 方和 平均距离 最大距离 聚类1 这种
时间: 2025-07-01 18:33:32 浏览: 5
<think>好的,用户想用K均值聚类分析数据,确定C1和C2的标准化变量以及最终的分割情况,还要提供详细的统计数据,比如每个簇的观测数量、类内平方和、到质心的平均距离和最大距离。他们之前已经有一些代码示例,可能需要基于这些代码进行调整。
首先,我需要回顾用户提供的引用内容。引用[1]中提到了使用Scikit-learn的KMeans模型,设置n_clusters=3,并进行标准化处理。引用[3]中的代码展示了如何计算SSE和选择合适的簇数,这可能对计算类内平方和有用。不过用户现在明确要求k=3,所以不需要选择簇数,但需要统计每个簇的信息。
用户的问题有几个关键点:标准化变量、聚类实现(k=3)、展示每个簇的统计信息。根据引用[1],标准化应该是在聚类前用StandardScaler处理数据,比如X_scaled = scaler.fit_transform(X)。用户提到的C1和C2可能是两个变量,需要标准化后的版本,这部分需要确认数据中的变量是否对应。
接下来,实现K均值聚类部分,用户已经提供了示例代码,可以直接设置n_clusters=3,然后fit数据。但需要确保数据已经标准化,所以代码中应该包含StandardScaler的步骤。
然后,统计每个簇的观测值数量,可以通过numpy的bincount函数获取cluster_labels中的计数。类内平方和可以直接从模型的inertia_属性获得,但这是总体的,每个簇的SSE可能需要手动计算。到质心的平均距离和最大距离需要计算每个样本到其质心的距离,然后按簇分组计算统计量。
具体步骤可能是:
1. 数据标准化:使用StandardScaler。
2. 执行K均值聚类,k=3。
3. 提取聚类标签和质心。
4. 计算每个簇的观测数。
5. 计算每个簇的类内平方和,可能需要用欧氏距离的平方和。
6. 计算每个样本到所属质心的距离,然后按簇求平均和最大值。
需要注意的是,KMeans的inertia_属性已经是所有簇的平方和之和,但用户可能需要每个簇各自的平方和。因此需要分簇计算。例如,对每个簇,取属于该簇的样本,计算它们到质心的距离平方和。
关于距离的计算,可以用scipy的cdist函数或者手动计算欧氏距离。比如,对于每个样本点x,到其质心c的距离平方为np.sum((x - c)**2)。将这些值累加,得到每个簇的SSE。
至于到质心的平均距离和最大距离,同样需要计算每个样本到其质心的距离,然后按簇取平均和最大值。
最后,将这些统计信息整理成表格或DataFrame输出。可能需要用到pandas来组织数据。
现在检查是否有遗漏的步骤。例如,标准化是否正确应用,聚类是否基于标准化后的数据,统计信息是否覆盖了用户的所有需求。同时,需要确保代码正确,比如正确提取每个簇的数据,计算距离等。
可能遇到的问题:如何高效计算每个簇的距离统计量。可以考虑循环每个簇,过滤出对应的样本,然后计算距离。或者使用向量化操作提高效率。
总结步骤:
1. 数据标准化。
2. 聚类,k=3。
3. 统计每个簇的样本数。
4. 计算每个簇的SSE、平均距离、最大距离。
5. 输出结果。
现在,需要将这些步骤转化为代码,并确保引用了用户提供的引用内容中的方法,比如使用KMeans的配置参数,如n_init=10,random_state=42等,如引用[3]中的示例。</think>根据需求,以下是完整的K均值聚类实现步骤及统计信息计算方法:
### 一、数据标准化处理
```python
from sklearn.preprocessing import StandardScaler
# 假设data为原始数据框,包含C1和C2变量
scaler = StandardScaler()
X_scaled = scaler.fit_transform(data[['C1', 'C2']]) # 标准化处理[^2]
```
### 二、执行K均值聚类(k=3)
```python
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, init='random', n_init=10, random_state=42)
kmeans.fit(X_scaled)
cluster_labels = kmeans.labels_
centroids = kmeans.cluster_centers_
```
### 三、计算统计指标
```python
import numpy as np
from scipy.spatial.distance import cdist
# 计算每个样本到所属质心的距离
distances = cdist(X_scaled, centroids, 'euclidean')
point_to_centroid_dist = distances[np.arange(len(X_scaled)), cluster_labels]
# 按簇分组统计
stats = {
'观测数量': np.bincount(cluster_labels),
'类内平方和': [np.sum((X_scaled[cluster_labels==i] - centroids[i])**2) for i in range(3)],
'平均距离': [np.mean(point_to_centroid_dist[cluster_labels==i]) for i in range(3)],
'最大距离': [np.max(point_to_centroid_dist[cluster_labels==i]) for i in range(3)]
}
# 转换为DataFrame展示
import pandas as pd
stats_df = pd.DataFrame(stats, index=[f'Cluster {i}' for i in range(3)])
print(stats_df)
```
### 输出结果示例:
```
观测数量 类内平方和 平均距离 最大距离
Cluster 0 50 35.21 0.87 1.45
Cluster 1 62 28.94 0.79 1.32
Cluster 2 38 41.05 0.95 1.67
```
### 四、可视化验证(可选)
```python
import matplotlib.pyplot as plt
plt.scatter(X_scaled[:,0], X_scaled[:,1], c=cluster_labels)
plt.scatter(centroids[:,0], centroids[:,1], marker='X', s=200, c='red')
plt.xlabel('标准化C1')
plt.ylabel('标准化C2')
plt.show()
```
### 关键点说明:
1. 标准化使用Z-score方法消除量纲差异
2. 类内平方和反映簇内数据紧密度
3. 距离指标帮助评估聚类质量[^3]
4. 随机种子(random_state)保证结果可复现
阅读全文
相关推荐







