作者:i阿极
作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页
😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍
📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪
大家好,我i阿极。喜欢本专栏的小伙伴,请多多支持
文章目录
K-means算法是一种常用的聚类算法,用于将数据集划分成k个不重叠的簇。其主要思想是通过迭代的方式将样本点划分到不同的簇中,使得同一簇内的样本点相似度较高,不同簇之间的相似度较低。
下面我们以一个简单案例对KMeans算法的原理进行解释,该案例目的是将样本点聚成3个类别(K=3)
下面是K-means算法的详细步骤:
-
初始化:选择k个初始聚类中心,可以是随机选择或根据某种启发式方法选择。聚类中心通常是从数据集中选取的k个样本点。
-
分配样本点:对于每个样本点,计算其与各个聚类中心的距离(如欧氏距离),将样本点分配给距离最近的聚类中心所在的簇。
-
更新聚类中心:对于每个簇,计算其所有样本点的均值,将该均值作为新的聚类中心。
-
重复步骤2和3,直到聚类中心不再发生变化或达到预定的迭代次数。
-
输出结果:最终得到k个聚类簇,每个簇包含一组样本点。
K-means算法的特点:
- K-means算法是一种迭代算法,通过多次迭代来优化聚类结果。
- K-means算法基于距离度量来进行样本点的分配和聚类中心的更新。
- K-means算法对离群点敏感,离群点可能会影响聚类结果。
- K-means算法要求事先指定聚类的个数k。
K-means算法的优化方法:
- 通过增加迭代次数或设置收敛条件来控制算法的迭代次数。
- 使用更好的初始化方法,如K-means++算法,可以更好地选择初始聚类中心。
- 对于离群点的处理,可以使用基于距离的异常值检测方法,或者采用基于密度的聚类算法。
Python 3.9
Jupyter Notebook
Anaconda
3.1构造数据
import numpy as npdata = np.array([[3, 2], [4, 1], [3, 6], [4, 7], [3, 9], [6, 8], [6, 6], [7, 7]])
3.2可视化展示
import matplotlib.pyplot as pltplt.scatter(data[:, 0], data[:, 1], c="red", marker='o', label='samples') # 以红色圆圈样式绘制散点图并加上标签plt.legend() # 设置图例,图例内容为上面设置的label参数plt.show()
3.3聚类成二分类
from sklearn.cluster import KMeanskms = KMeans(n_clusters=2)kms.fit(data)
3.4获取结果
label = kms.labels_print(label)
3.5结果可视化
plt.scatter(data[label == 0][:, 0], data[label == 0][:, 1], c="red", marker='o', label='class0') # 以红色圆圈样式绘制散点图并加上标签plt.scatter(data[label == 1][:, 0], data[label == 1][:, 1], c="green", marker='*', label='class1') # 以绿色星星样式绘制散点图并加上标签plt.legend() # 设置图例
3.6聚类成3类
kms_3 = KMeans(n_clusters=3)kms_3.fit(data)label_3 = kms_3.labels_print(label_3)
3.7结果可视化
plt.scatter(data[label_3 == 0][:, 0], data[label_3 == 0][:, 1], c="red", marker='o', label='class0') # 以红色圆圈样式绘制散点图并加上标签plt.scatter(data[label_3 == 1][:, 0], data[label_3 == 1][:, 1], c="green", marker='*', label='class1') # 以绿色星星样式绘制散点图并加上标签plt.scatter(data[label_3 == 2][:, 0], data[label_3 == 2][:, 1], c="blue", marker='+', label='class2') # 以蓝色加号样式绘制散点图并加上标签plt.legend() # 设置图例
4.1案例背景
银行通常拥有海量的客户,对于不同的客户,银行需要进行不同的营销与工作开展策略,例如对于高收入且风险承受能力强的客户,可以进行重点挖掘业务机会,例如可以给他推销一些收益率高但周期相对较长的理财产品;而对于低收入且风险承受能力较弱的客户,则需要制定不同的营销与工作策略。因此对于银行来说,通常需要将客户进行分群处理,对于不同分群的客户进行不同的处理。
4.2读取数据
import pandas as pd data = pd.read_excel('客户信息.xlsx')data.head(10)
4.2可视化展示
import matplotlib.pyplot as pltplt.scatter(data.iloc[:, 0], data.iloc[:, 1], c="green", marker='*') # 以绿色星星样式绘制散点图plt.xlabel('age') # 添加x轴名称plt.ylabel('salary') # 添加y轴名称plt.show()
4.3数据建模
from sklearn.cluster import KMeanskms = KMeans(n_clusters=3, random_state=123)kms.fit(data)label = kms.labels_label = kms.fit_predict(data)print(label)
4.4建模效果可视化展示
plt.scatter(data[label == 0].iloc[:, 0], data[label == 0].iloc[:, 1], c="red", marker='o', label='class0') # 以红色圆圈样式绘制散点图并加上标签 plt.scatter(data[label == 1].iloc[:, 0], data[label == 1].iloc[:, 1], c="green", marker='*', label='class1') # 以绿色星星样式绘制散点图并加上标签 plt.scatter(data[label == 2].iloc[:, 0], data[label == 2].iloc[:, 1], c="blue", marker='+', label='class2') # 以蓝色加号样式绘制散点图并加上标签plt.xlabel('age') # 添加x轴名称plt.ylabel('salary') # 添加y轴名称plt.legend() # 设置图例
📢文章下方有交流学习区!一起学习进步!💪💪💪
📢首发CSDN博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗