小菜鸡的博客
- 前言
- 一、K_means是什么?
- 1. 原理
- 二、编程实现
- 1. 首先引入库
- 2.读入数据
- 3.算法实现
- 4.可视化实现
- 三、完整代码及展示
- 总结
前言
本篇文章主要是基于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实现的