基于python的k_means算法实现


前言

本篇文章主要是基于python,编程实现K_means算法的可视化。
编码的数据来源是一些地理坐标,以 txt 格式存储。


一、K_means是什么?

K-Mean算法,即 K 均值算法,是一种常见的聚类算法。算法会将数据集分为 K 个簇,每个簇使用簇内所有样本均值来表示,将该均值称为“质心”。

1. 原理

容易受初始质心的影响;算法简单,容易实现;算法聚类时,容易产生空簇;算法可能收敛到局部最小值。

通过聚类可以实现:发现不同用户群体,从而可以实现精准营销;对文档进行划分;社交网络中,通过圈子,判断哪些人可能互相认识;处理异常数据。

距离计算方式是 欧式距离。

1.从样本中选择 K 个点作为初始质心(完全随机)
2.计算每个样本到各个质心的距离,将样本划分到距离最近的质心所对应的簇中
3.计算每个簇内所有样本的均值,并使用该均值更新簇的质心
4.重复步骤 2 与 3 ,直到达到以下条件之一:
质心的位置变化小于指定的阈值
达到最大迭代次数

二、编程实现

通过原理我们可以发现,实现K_means算法的三个关键点在于:
(1)初始的K值选取;
(2)质心变化的限定阈值;
(3)最大迭代次数,确保算法最终能够停止。
当然越好的距离计算公示得到的聚类簇就越完美,一般是使用欧式距离公式
此外由于python提供了数据挖掘类的一些库,编程就很简单了

1. 首先引入库

import numpy as np  #数据转换处理
import matplotlib.pyplot as plt # 可视化操作
from sklearn.cluster import KMeans #k_means包

2.读入数据

with open("testSet.txt") as file:
    data = np.loadtxt(file)

这里采用np库将文本类型的数据结构转换成元组

3.算法实现

其实将坐标直接可视化就已经可以确定K的值了,但是一些极端的数据聚类时可能我们人眼分的并不好这里可以采用SSE用于评估算法的聚类效果,同时通过SSE选取落差最大的K值作为聚类的质心。代码奉上:

# 定义模型
k = 4
model = KMeans(n_clusters=k, init="random",
               max_iter=200, tol=1e-04)
# 训练模型
model = model.fit(data)

是不是觉得很简单,分别设置质心,质心的选取方式(这个其他的选取方式大家可以看这里:python K_means库介绍
然后设置迭代次数以及阈值

4.可视化实现

就是简单的利用matplotlib库而已

# 画出簇类
plt.figure(2)
colors = ['b', 'g', 'y', 'c', 'pink']
markers = ['v', 's', 'o', '1', '2', '3']
plt.title("K_means")
plt.xlabel('East Longitude', fontsize=10)
plt.ylabel('North Latitude', fontsize=10)
for id, label in enumerate(model.labels_):
    plt.scatter(data[id][0], data[id][1],
                color=colors[label], marker=markers[label],
                s=20)
# 画出聚类中心
plt.scatter(
    model.cluster_centers_[:, 0], model.cluster_centers_[:, 1],
    color='red', label="centroids", s=50, marker='v'
)
plt.grid(True)

三、完整代码及展示

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# 导入数据
with open("数据文件名称.txt") as file:
    data = np.loadtxt(file)

plt.figure(1)
plt.title("First")
plt.xlabel('East Longitude', fontsize=10)
plt.ylabel('North Latitude', fontsize=10)

plt.scatter(data[:, 0], data[:, 1], color="red",
            marker='o', s=20)
plt.grid(True)


# 定义模型
k = 4  #自己设置K值
model = KMeans(n_clusters=k, init="random",
               max_iter=200, tol=1e-04)
# 训练模型
model = model.fit(data)
# 画出簇类
plt.figure(2)
colors = ['b', 'g', 'y', 'c', 'pink']  #颜色选取
markers = ['v', 's', 'o', '1', '2', '3']
plt.title("K_means")
plt.xlabel('East Longitude', fontsize=10)
plt.ylabel('North Latitude', fontsize=10)
for id, label in enumerate(model.labels_):
    plt.scatter(data[id][0], data[id][1],
                color=colors[label], marker=markers[label],
                s=20)
# 画出聚类中心
plt.scatter(
    model.cluster_centers_[:, 0], model.cluster_centers_[:, 1],
    color='red', label="centroids", s=50, marker='v'
)
plt.grid(True)

# SSE展示
SSE = []
for k in range(1, 7):
    cn = KMeans(n_clusters=k)
    cn.fit(data)
    SSE.append(cn.inertia_)
plt.figure(3)
X = range(1, 7)
plt.xlabel("K")
plt.ylabel("SSE")
plt.plot(X, SSE, 'o-')
plt.show()


然后展示我运行的一个结果
直接以坐标画点,这里我们就已经可以看出K应该取4.
直接展示坐标

套用K-means聚类:
在这里插入图片描述

SSE展示界面:
在这里插入图片描述
最后啰嗦一句,代码中的参数大家可以根据自己的实际情况进行修改,同时这个代码也不够精炼,供大家参考就好。

总结

以上就是今天要讲的内容,本文仅仅就是一个简单的基于python实现的
K-means算法的可视化,没有什么难的地方,就是简单的套用一些python的库。如果大家觉得对自己有一些帮助,还请点个赞哦,本人也是初学者,互帮互助。谢谢!!!!😊😊😊
  • 8
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值