无监督学习之k-means聚类算法原理分析及代码实现

聚类

相似的对象通过静态分类的方式分成不同的组别或者更多的子集。同一子集中的对象都有相似的属性。

K-Means聚类算法:

K-Means是找到给定数据集k个簇的算法。簇的个数K是由用户指定的,每一个簇通过其质心(簇中所有点的中心)来描述

K-Means聚类算法的原理:

1.创建k个点作为起始质心(通常都是随机选择的)。
在这里插入图片描述

2.计算数据集中每个数据点到质心的距离,距离哪个质心近,就属于哪一个分类。
在这里插入图片描述
3.对每一个簇中所有的数据点,计算他们的平均值作为新的质心,并重新计算每一个数据点到质心的距离,重新分类
在这里插入图片描述
4.再次计算每一个簇中所有数据点的平均值作为质心。如果发现无论质心怎么改变,每一个数据点的分类都不再发生变化时,就说明分类完成,结束算法。
在这里插入图片描述

K-Means算法的代码实现:

下面是一部分航空数据集,我们根据已有数据集对用户做一下聚类分析,把有相似特征的用户聚类到一起。
在这里插入图片描述
代码实现:

import pandas as pd
from sklearn.cluster import KMeans

# 加载数据
data = pd.read_csv(r'G:\学习文件\机器学习\data_mining_data\k_means\air_data.csv')
data.info()

# 数据整理
features = data[['FFP_DATE',
             'AGE',
             'LOAD_TIME',
             'FLIGHT_COUNT',
             'SEG_KM_SUM',
             'avg_discount']]
features = features.dropna()
dafeaturesta = features.drop_duplicates(keep='first')
features.columns = ['注册日期',
                '年龄',
                '截止日期',
                '飞行统计次数',
                '飞行总里程',
                '平均折扣率']
features['入会时长'] = pd.to_datetime(features['截止日期']) - pd.to_datetime(features['注册日期'])
features.drop(columns=['注册日期', '截止日期'], inplace=True)
features['入会时长'] = features['入会时长'].map(lambda t: t.days)
# 归一化
features = (features - features.mean()) / features.std()
# print(features)

# 定义K
k = 7
# 训练模型
k_model = KMeans(n_clusters=k)
k_model.fit(features)

# 打印质心
print(k_model.cluster_centers_)
# 查看分类结果
print(k_model.labels_)
print(k_model.labels_[30:50])
质心
[[ 7.66458826e-02  1.38920062e+00  1.33341413e+00  6.60202426e-02
   3.04533775e-01]
 [ 2.27143907e-01  4.04271368e+00  4.02495705e+00  5.34463767e-01
   7.10255471e-01]
 [-6.16089055e-01 -3.10997453e-01 -3.33976389e-01  4.53128262e-01
  -6.51210907e-01]
 [ 1.31459171e+00 -2.87113603e-01 -2.55012030e-01 -1.69101470e-01
  -3.44912893e-01]
 [ 2.18527488e-01 -2.51196973e-01 -2.53378964e-01 -9.01911405e-02
   1.25405550e+00]
 [-7.38657868e-01 -4.21859060e-01 -3.81240728e-01 -9.96703591e-01
  -6.47485754e-01]
 [ 8.12051011e-01  1.72118613e-03  2.61166632e-03  3.00618100e+00
   3.07999119e-01]]

分类结果
[1 1 1 ... 5 5 5]
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]

解释一下质心为什么是7行5列:
我们的数据一共选取了5个特征(数据整理的时候增加了一列删除了两列),每个特征都有自己的均值。
我们定义了k=7,也就是分成了7个簇,每个簇中有5个特征。所以质心是7行5列。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值