python实现Kmeans

news/2024/5/20 7:28:45 标签: 聚类, 算法, python

代码:

import numpy as np
import random
from math import sqrt


def dist(arr1, arr2):
    return sqrt(np.sum(arr1 - arr2) ** 2)

def random_center(dataset, k):
    """
    随机生成初始的聚类中心,dataset的每一行是一个样本
    :param dataset:
    :param k: 聚类中心的个数
    :return:
    """
    number_cols = dataset.shape[1]
    centers = np.mat(np.zeros([k, number_cols]))

    for i in range(number_cols):
        min_value = np.min(dataset[:, i])
        max_value = np.max(dataset[:, i])
        centers[:, i] = min_value + (max_value - min_value) * np.random.random([k, 1])
    return centers


def kmeans(dataset, k):
    centers = random_center(dataset, k)       # 生成初始的聚类中心
    num_data = dataset.shape[0]               # 数据的个数

    # 保存每个样本的聚类情况,第一列表示该样本属于某一类,第二列是与该类聚类中心的距离
    clusterAssment = np.mat(np.zeros((num_data, 2)))
    cluster_changed = True    # 控制聚类算法迭代停止的标志,当聚类中心不在改变时停止
    while cluster_changed:
        cluster_changed = False
        for i in range(num_data):
            min_dist = np.inf    # 初始化最小的距离
            min_index = -1       # 初始化属于某一类
            for j in range(k):
                dist_j = dist(dataset[i, :], centers[j, :])

                if dist_j < min_dist:
                    min_dist = dist_j
                    min_index = j
            if clusterAssment[i, 0] != min_index:
                cluster_changed = True
            clusterAssment[i, :] = min_index, min_dist ** 2
        # 更新聚类中心
        for cent in range(k):
            data_cent = dataset[np.nonzero(clusterAssment[:, 0].A == cent)[0]]    # .A表示将矩阵转化为数组
            centers[cent, :] = np.mean(data_cent, axis=0)
    return centers, clusterAssment


dataset = np.random.randint(1, 20, [20, 5])

centers, clusterAssment = kmeans(dataset, 3)

 


http://www.niftyadmin.cn/n/817098.html

相关文章

Fzu软工第二次作业-词频分析

&#xff08;0&#xff09;前言&#xff1a; Github项目作业地址&#xff08;1&#xff09;PSP表格&#xff1a; PSP2.1Personal Software Process Stages预估耗时&#xff08;分钟&#xff09;实际耗时&#xff08;分钟&#xff09;Planning计划3040• Estimate• 估计这个任务…

过拟合

欠拟合与过拟合的概念的成因比较简单&#xff0c;观点统一&#xff0c;这里不再介绍。现在常用的判断方法是从训练集中随机选一部分作为一个验证集&#xff0c;采用K折交叉验证的方式&#xff0c;用训练集训练的同时在验证集上测试算法效果。在缺少有效预防欠拟合和过拟合措施的…

卷积神经网络感受野的计算

学习RCNN系列论文时&#xff0c; 出现了感受野(receptive field)的名词&#xff0c; 感受野的尺寸大小是如何计算的&#xff0c;在网上没有搜到特别详细的介绍&#xff0c; 为了加深印象&#xff0c;记录下自己对这一感念的理解&#xff0c;希望对理解基于CNN的物体检测过程有所…

dropout原理解析

1. Dropout简介 1.1 Dropout出现的原因 在机器学习的模型中&#xff0c;如果模型的参数太多&#xff0c;而训练样本又太少&#xff0c;训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题&#xff0c;过拟合具体表现在&#xff1a;模型在训练…

momentum 动量法

参考&#xff1a;https://blog.csdn.net/tsyccnh/article/details/76270707?utm_sourcedistribute.pc_relevant.none-task 如果把梯度下降法想象成一个小球从山坡到山谷的过程&#xff0c;那么前面几篇文章的小球是这样移动的&#xff1a;从A点开始&#xff0c;计算当前A点的…

600行python实现WC程序

github https://github.com/Alexleslie/Software-Engineer/tree/master/wc 程序实现功能&#xff1a;基础功能和扩展功能 程序用法&#xff1a; 1. 参数说明 &#xff1a; -w 词数 &#xff1b; -c 字符数 &#xff1b; -l 行数&#xff1b; -a 行数细节 2. 用法说明&#xf…

S3TC IAP15F2K61S2点亮一个发光二极管keil和stc-isp软件操作

1.安装破解软件 2.打开STC-ISP&#xff0c;找到头文件&#xff0c;选择保存文件 3.找到keil的安装目录&#xff0c;keil/C51/INC 并保存 4.在桌面新建文件夹 5.打开keil 6.找到在桌面上新建的文件夹 7.选择ATMEL 找到AT89C51 选择否 8.选择file->New 9.File->Save As 10.…

oncontextmenu 事件

用户点击鼠标右键时触发并打开上下文菜单 禁用&#xff1a; document.oncontextmenu function() {   return false;} 编辑自定义右键打开菜单 document.oncontextmenu function() {   return false; } document.body.addEventListener(mousedown,function(e){   switch…