在K均值聚类中,"肘部取值法"是一种常用的方法,用于帮助选择最佳的聚类数量K。该方法涉及绘制不同K值下的聚类误差(通常是平方误差和)的图表,然后找出曲线出现拐点的位置,该拐点对应的K值通常被认为是最佳的选择。
下面是使用肘部取值法选择K的一般步骤:
- 对于给定的数据集,尝试使用不同的K值运行K均值聚类算法。
- 对每个K值计算聚类误差(通常是样本到其所属簇中心的平方距离之和)。
- 绘制K值与聚类误差的图表。
- 在图表中找到一个拐点,该拐点对应的K值通常被认为是最佳选择。
下面是一个简单的示例代码,用于实现肘部取值法:
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 用于聚类的数据
# 这里假设你已经有了处理后的数据,可以直接使用上面的处理后的数据df
# 请将df替换为你的数据
# df = ...
# 存储不同K值下的聚类误差
sse = []
# 尝试不同的K值运行K均值聚类算法
for k in range(1, 11):
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(df[['distance', 'longitude', 'latitude']])
sse.append(kmeans.inertia_)
# 绘制K值与聚类误差的图表
plt.plot(range(1, 11), sse, marker='o')
plt.xlabel('K')
plt.ylabel('SSE') # Sum of Squared Errors
plt.title('best k')//肘部法确定最佳K值
plt.show()
我的前边是这样的
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
import random
import numpy as np
from sklearn.preprocessing import MinMaxScaler # 归一化处理
df = pd.read_csv("./dinner.csv")
df = df.drop('Unnamed: 0', axis=1)
df.info()
df[['longitude', 'latitude']] = df['location'].str.split(',', expand=True)
# 重新排列列的顺序
df = df.drop('location',axis=1)
df.head()
跑出来
全部运行结果
o,真的好像胳膊肘哦