K-均值算法

简介: K-均值算法是发现给定数据集的k个簇的算法。簇个数k是用户给定的,每一个簇通过其簇中所有点的中心点来描述工作流程:首选选取样本中k个样本作为每个簇的簇中心然后对每一个样本与每个簇之间的关系,来分配到每一个簇中然后更新每个簇的均值

K-均值算法是发现给定数据集的k个簇的算法。簇个数k是用户给定的,每一个簇通过其簇中所有点的中心点来描述

工作流程:

首选选取样本中k个样本作为每个簇的簇中心

然后对每一个样本与每个簇之间的关系,来分配到每一个簇中

然后更新每个簇的均值

重复上面过程

伪代码

初始化
create k points from samples
repeat
    从样本中选取样本
    计算样本与每个均值距离
    将样本归入距离最小的簇中。
    更新簇中心

K-均值聚类一般流程

1:收集数据

2:准备数据

3:分析数据

4:训练算法,不适用无监督学习,无监督学习没有训练过程

5:测试算法

6:使用算法

 

 

简单的k-means使用

import numpy as np
import matplotlib.pyplot as plt
# 计算两点之间的距离 两点距离
def distance(e1, e2):
    return np.sqrt((e1[0]-e2[0])**2+(e1[1]-e2[1])**2)
# 集合中心
def means(arr):
    return np.array([np.mean([e[0] for e in arr]), np.mean([e[1] for e in arr])])
# arr中距离a最远的元素,用于初始化聚类中心
def farthest(k_arr, arr):
    f = [0, 0]
    max_d = 0
    for e in arr:
        d = 0
        for i in range(k_arr.__len__()):
            d = d + np.sqrt(distance(k_arr[i], e))
        if d > max_d:
            max_d = d
            f = e
    return f
# arr中距离a最近的元素,用于聚类
def closest(a, arr):
    c = arr[1]
    min_d = distance(a, arr[1])
    arr = arr[1:]
    for e in arr:
        d = distance(a, e)
        if d < min_d:
            min_d = d
            c = e
    return c
if __name__=="__main__":
    ## 生成二维随机坐标(如果有数据集就更好)
    arr = np.random.randint(200, size=(200, 1, 2))[:, 0, :]
    ## 初始化聚类中心和聚类容器
    m = 5
    r = np.random.randint(arr.__len__() - 1)
    k_arr = np.array([arr[r]])
    cla_arr = [[]]
    for i in range(m-1):
        k = farthest(k_arr, arr)
        k_arr = np.concatenate([k_arr, np.array([k])])
        cla_arr.append([])
    ## 迭代聚类
    n = 20
    cla_temp = cla_arr
    for i in range(n):    # 迭代n次
        for e in arr:    # 把集合里每一个元素聚到最近的类
            ki = 0        # 假定距离第一个中心最近
            min_d = distance(e, k_arr[ki])
            for j in range(1, k_arr.__len__()):
                if distance(e, k_arr[j]) < min_d:    # 找到更近的聚类中心
                    min_d = distance(e, k_arr[j])
                    ki = j
            cla_temp[ki].append(e)
        # 迭代更新聚类中心
        for k in range(k_arr.__len__()):
            if n - 1 == i:
                break
            k_arr[k] = means(cla_temp[k])
            cla_temp[k] = []
    ## 可视化展示
    col = ['HotPink', 'Aqua', 'Chartreuse', 'yellow', 'LightSalmon']
    for i in range(m):
        plt.scatter(k_arr[i][0], k_arr[i][1], linewidth=10, color=col[i])
        plt.scatter([e[0] for e in cla_temp[i]], [e[1] for e in cla_temp[i]], color=col[i])
    plt.show()

学习结果

K均值算法程序  非局部均值算法的matlab实现

相关文章
|
1月前
|
机器学习/深度学习 算法 数据挖掘
讲解机器学习中的 K-均值聚类算法及其优缺点。
讲解机器学习中的 K-均值聚类算法及其优缺点。
|
1月前
|
机器学习/深度学习 算法 数据挖掘
机器学习中的 K-均值聚类算法及其优缺点
机器学习中的 K-均值聚类算法及其优缺点
107 0
|
2天前
|
算法 测试技术 C++
【动态规划】【数学】【C++算法】805 数组的均值分割
【动态规划】【数学】【C++算法】805 数组的均值分割
|
3天前
|
机器学习/深度学习 算法 数据挖掘
讲解机器学习中的 K-均值聚类算法及其优缺点。
讲解机器学习中的 K-均值聚类算法及其优缺点。
7 0
|
27天前
|
机器学习/深度学习 算法 数据挖掘
【模式识别】探秘聚类奥秘:K-均值聚类算法解密与实战
【模式识别】探秘聚类奥秘:K-均值聚类算法解密与实战
36 1
|
1月前
|
算法 测试技术 C#
【动态规划】【数学】【C++算法】805 数组的均值分割
【动态规划】【数学】【C++算法】805 数组的均值分割
|
1月前
|
机器学习/深度学习 算法 数据挖掘
K-均值聚类算法及其优缺点
K-均值聚类算法及其优缺点
17 0
|
2月前
|
机器学习/深度学习 算法 数据挖掘
金融机器学习方法:K-均值算法
金融机器学习方法:K-均值算法
17 0
|
3月前
|
机器学习/深度学习 人工智能 算法
解密人工智能:KNN | K-均值 | 降维算法 | 梯度Boosting算法 | AdaBoosting算法
解密人工智能:KNN | K-均值 | 降维算法 | 梯度Boosting算法 | AdaBoosting算法
73 0
|
1天前
|
机器学习/深度学习 算法 数据挖掘
【MATLAB】tvf_emd_ MFE_SVM_LSTM 神经网络时序预测算法
【MATLAB】tvf_emd_ MFE_SVM_LSTM 神经网络时序预测算法
12 2

相关产品