对表中数据用手肘法python代码确定k值
时间: 2024-11-22 07:48:17 浏览: 27
手肘法(Elbow Method)是一种用于确定K-means聚类算法中的最佳簇数(K值)的方法。以下是一个示例Python代码,展示如何使用手肘法来确定最佳的K值:
首先,我们需要将表格数据转换为一个适合进行聚类分析的数据格式。假设我们已经将数据读取到一个Pandas DataFrame中。
```python
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as0 plt
# 示例数据
data = {
'city': ['郑州', '开封', '洛阳', '平顶山', '安阳', '鹤壁', '新乡', '焦作', '濮阳', '许昌', '漯河', '三门峡', '南阳', '商丘', '信阳', '周口', '驻马店', '济源'],
'legal_entities_num': [1437, 650, 764, 352, 467, 174, 456, 530, 500, 658, 368, 552, 750, 920, 436, 555, 578, 105],
'employed_individuals_num': [22.01, 11.06, 16.87, 20.57, 10.75, 4, 11.82, 11.29, 7.56, 8, 5.54, 5.55, 20.44, 15.81, 30.71, 4.85, 13.39, 2.42],
'highway_length': [12702, 8844, 18342, 13468, 11817, 4464, 13106, 7383, 6465, 9288, 5250, 9520, 38004, 23050, 24755, 21845, 19272, 2284],
'freight_transportation_volume': [19709, 2588, 16570, 9289, 10294, 5018, 16050, 15295, 3172, 5997, 5322, 4424, 15696, 15083, 6610, 15178, 9479, 3906],
'cargo_turnover_expess_revenue': [332.36, 98.54, 401.92, 209.27, 416.09, 105.31, 311.43, 431.35, 148.79, 190.71, 108.71, 140.78, 581.94, 421.47, 54.4, 619.24, 149.27, 100.78],
'packages_num': [57.67, 2.41, 29.75, 2.04, 11.86, 0.91, 22.25, 8.22, 10.15, 7.47, 4.45, 5.2, 40.92, 14.82, 8.74, 13.5, 11.34, 2.5],
'package_business_volume': [42375, 1915, 5761, 1177, 2460, 711, 3705, 3307, 1248, 2348, 2222, 843, 3920, 4865, 2257, 2332, 1981, 450],
'postal_route_length': [7942, 1651, 4392, 1802, 1721, 456, 3013, 1189, 1264, 1516, 977, 1338, 5356, 3347, 5902, 3300, 3277, 420],
'postal_business_volume': [39.99, 3.59, 7.32, 3.2, 5, 1.1, 6.49, 3.67, 2.82, 3.79, 2.57, 1.96, 8.63, 7.15, 5.26, 6.8, 6.53, 0.66],
'cargo_vehicles_num': [156902, 43148, 91485, 51677, 42115, 16675, 67624, 31029, 55093, 53622, 25914, 26470, 97209, 86693, 58170, 116577, 57440, 9830],
'phone_users_num': [1281.59, 337.66, 575.81, 377.39, 451.87, 131.64, 529.3, 300.91, 293.46, 335.82, 188.02, 189.79, 655.87, 577.64, 413.23, 538.82, 464.77, 69.33]
}
# 创建DataFrame
df = pd.DataFrame(data)
# 选择需要进行聚类的特征列
features = df.drop(columns=['city'])
# 初始化SSE列表
sse = []
# 尝试不同的K值
for k in range(1, 11):
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(features)
sse.append(kmeans.inertia_)
# 绘制SSE曲线
plt.figure(figsize=(10, 6))
plt.plot(range(1, 11), sse, marker='o')
plt.title('Elbow Method For Optimal k')
plt.xlabel('Number of clusters')
plt.ylabel('SSE')
plt.show()
```
### 解释
1. **数据准备**:我们将表格数据存储在一个字典中,并将其转换为Pandas DataFrame。
2. **特征选择**:我们选择除了城市名称之外的所有列作为特征列。
3. **计算SSE**:我们尝试从1到10的不同K值,计算每个K值对应的SSE(Sum of Squared Errors)。
4. **绘制SSE曲线**:通过绘制SSE随K值变化的曲线,我们可以观察到“肘部”点,即SSE下降速度明显减缓的点。这个点通常被认为是最佳的K值。
运行上述代码后,你会看到一张SSE随K值变化的图表。通过观察图表中的“肘部”,可以确定最佳的K值。
阅读全文