<
>

基于Python——Kmeans聚类算法的实现

2020-06-28 08:55:55 来源:易采站长站 作者:易采站长站整理

1、概述

本篇博文为数据挖掘算法系列的第一篇。现在对于Kmeans算法进行简单的介绍,Kmeans算法是属于无监督的学习的算法,并且是最基本、最简单的一种基于距离的聚类算法。

下面简单说一下Kmeans算法的步骤:

选随机选取K的簇中心(注意这个K是自己选择的)
计算每个数据点离这K个簇中心的距离,然后将这个点划分到距离最小的簇中
重新计算簇中心,即将每个簇的所有数据点相加求均值,将这个均值作为对应簇的新簇中心。
重复2、3步,直到满足了你设置的停止算法迭代的条件

注意:停止算法迭代的条件一般有三个:

没有(或最小数目)对象被重新分配给不同的聚类。
没有(或最小数目)聚类中心再发生变化。
误差平方和局部最小。

常用的距离公式有:1、欧式距离; 2、曼哈顿距离;3、切比雪夫距离等等

二、实现

下面给出实现代码,在这里我设置的停止条件是第三种,即误差平方和最小

import numpy as np
import random
import matplotlib.pyplot as plt
from calculate_distance_algorithm import euclid_distance

plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号

class KMeans:
def __init__(self, n_cluster, algorithm=euclid_distance, iterators=None):
self.n_cluster = n_cluster
self.cluster_centers_ = None
self.algorithm = euclid_distance
self.iterations = iterators
self.loss = None

def fit(self, data):
"""
进行k-means算法迭代,划分簇
:param Y: Y是对应X正确的种类
:param iterators: 算法迭代次数
:param data: 数据集(X, Y) X是测试点,
:param k:最终要划分出簇的个数
:param calculate_method:计算距离使用的公式 默认为计算两点间的欧式距离,可以通过传递计算距离的方法名来更改计算距离方式
"""
# 获得随机划分的质心
clusters = self.random_choose_cluster(data, self.n_cluster)
clusters_collection = {}
# 一开始的损失值
loss_value = 1 << 30
# 统计迭代次数
count = 0
while True:
# 如果达到了指定的迭代次数后,就不迭代了
if count == self.iterations and self.iterations != -1:
break
count += 1
# 初始化每个簇集合
for index, cluster in enumerate(clusters):
clusters_collection[index] = [] for pos, x in enumerate(data):

暂时禁止评论

微信扫一扫

易采站长站微信账号