K-means算法是一种常见的聚类算法,用于将数据点分成不同的组(簇),使同一组内的数据点彼此相似,不同组之间的数据点相对较远。以下是K-means算法的基本工作原理和步骤:
工作原理:
初始化:选择K个初始聚类中心点(质心)。
分配:将每个数据点分配到最接近的聚类中心,形成K个簇。
更新:根据每个簇中的数据点重新计算聚类中心。
迭代:重复步骤2和3,直到满足停止条件(如聚类中心不再改变或达到最大迭代次数)。
算法步骤:
初始化:随机选择K个数据点作为初始聚类中心。
分配:对于每个数据点,计算其与各个聚类中心的距离,将其分配给距离最近的聚类中心。
更新:重新计算每个簇的聚类中心,使用该簇内所有数据点的平均值。
迭代:重复步骤2和3,直到聚类中心稳定或达到最大迭代次数。
优点:
简单且高效,适用于大规模数据集。
对于球状簇具有很好的效果,易于解释。
缺点:
需要预先设定聚类数K。
对异常值和噪声敏感。
结果可能受初始聚类中心的选择影响。
应用领域:
图像分割、文本聚类、市场分析、推荐系统等。
实现聚类分析的基本步骤如下:
数据准备与预处理:
读取数据:从Excel文件中读取数据,对数据进行去重和缺失值处理。
特征选择:选择用于聚类分析的特征列,如'地区发展程度'、'时间间隔'、'评论回复数'、'评论点赞数'等。
df.drop\_duplicates(subset=\['评论'\], keep='first', inplace=True)
df.dropna(subset=\['评论'\],axis=0,inplace=True)
# 将评论时间列转换为时间格式
df\['评论时间'\] = pd.to\_datetime(df\['评论时间'\])
# 计算每个时间点距禖当前时间的时间间隔(单位:秒)
current\_time = datetime.now()
df\['时间间隔'\] = round((current\_time - df\['评论时间'\]).dt.total\_seconds().astype(int)/86400,1)
print(df.info())
# 创建一个字典,用于映射地区与发展水平的关系
region\_mapping = {
'发达地区': \['北京省', '上海省', '天津省', '上海省'\],
'普通地区': \['广东省', '江苏省', '浙江省', '福建省', '湖北省', '湖南省', '安徽省', '江西省', '山东省', '辽宁省', '吉林省', '黑龙江省'\],
'发展地区': \['重庆省', '河南省', '四川省', '陕西省', '天津省', '山西省', '内蒙古省', '河北省', '广西省', '海南省', '河南省', '河北省', '山西省', '内蒙古省', '宁夏省', '青海省', '甘肃省',
'陕西省', '新疆省'\],
'未知': \['设置了隐私'\],
}
数据标准化:
使用StandardScaler对特征数据进行标准化,使数据具有零均值和单位方差。
scaler = StandardScaler()
X\_data = scaler.fit\_transform(X\_data)
确定聚类数目:
使用“肘部法”和“轮廓系数法”等方法确定合适的聚类数目。
\# 构造自定义函数,用于绘制不同k值和对应总的簇内离差平方和的折线图
def k\_SSE(X, clusters):
# 选择连续的K种不同的值
K = range(1, clusters + 1)
# 构建空列表用于存储总的簇内离差平方和
TSSE = \[\]
for k in K:
# 用于存储各个簇内离差平方和
SSE = \[\]
kmeans = KMeans(n\_clusters=k)
kmeans.fit(X)
# 返回簇标签
labels = kmeans.labels\_
# 返回簇中心
centers = kmeans.cluster\_centers\_
# 计算各簇样本的离差平方和,并保存到列表中
for label in set(labels):
SSE.append(np.sum((X\[labels == label, :\] - centers\[label, :\]) \*\* 2))
# 计算总的簇内离差平方和
TSSE.append(np.sum(SSE))
# 中文和负号的正常显示
plt.rcParams\['font.sans-serif'\] = \['Microsoft YaHei'\]
plt.rcParams\['axes.unicode\_minus'\] = False
# 设置绘图风格
plt.style.use('ggplot')
# 绘制K的个数与GSSE的关系
plt.plot(K, TSSE, 'b\*-')
plt.xlabel('簇的个数')
plt.ylabel('簇内离差平方和之和')
plt.title('手肘法')
# 显示图形
plt.show()
聚类分析:
使用自定义的KMeans类或Sklearn中的KMeans进行聚类分析,传入特征数据和确定的聚类数目。
获取聚类标签并将其与特征数据关联。
n\_clusters = 5
km = KMeans(n\_clusters=n\_clusters).fit(X\_data)
#% 降维后画图显示聚类结果
#将原始数据中的索引设置成得到的数据类别
X\_rsl = pd.DataFrame(X\_data,index=km.labels\_)
X\_rsl\_center = pd.DataFrame(km.cluster\_centers\_) #找出聚类中心
降维可视化:
使用TSNE对聚类结果进行降维处理,将高维数据降至二维或三维。
利用降维后的数据和聚类中心绘制散点图,根据聚类结果进行着色展示。
tsne = TSNE()
tsne.fit\_transform(X\_rslwithcenter) #进行数据降维,并返回结果
结果输出:
将聚类标签与原始数据关联,将聚类结果输出到Excel文件中。