Numpy实现K-Means聚类

news/2024/5/20 9:22:39 标签: 聚类, numpy, kmeans

问题描述:

  • 数据放在数据文件中(不得放在程序中),第一行是数据的个数,以后各行是各个点的x,y,z坐标。
  • 读取文本文件数据,并用K-means方法输出聚类中心
  • k-means 算法接受输入量k;然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。

算法过程

首先从n个数据对象任意选择k个对象作为初始聚类中心,而对于所剩下的其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类。然后,再计算每个所获新聚类聚类中心(该聚类中所有对象的均值),不断重复这一过程直到标准测度函数开始收敛为止。采用均方差作为标准测度函数。
聚类标准旨在使所获得的k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。
Step 1.读取数据组,从N个数据对象任意选择k个对象作为初始聚类中心;
Step 2.循环Step 3到Step 4直到每个聚类不再发生变化为止;
Step 3.根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离,并根据最小距离重新对相应对象进行划分;
Step 4.重新计算每个(有变化)聚类的均值(中心对象)。

代码

数据可以选择由程序生成,也可以自行导入,第一行是数据的个数,以后各行是各个点的x,y,z坐标。

import numpy as np
from sklearn.datasets import make_blobs
from matplotlib import pyplot as plt
import random


class KMeans:
    def __init__(self, data, k=3):
        self.data = data
        self.k = k

    @staticmethod
    def __euclidean_distance(a, b):
        c = a - b
        d = np.power(a - b, 2)
        return np.sqrt(np.sum(np.power(a - b, 2), axis=1))

    def get_labels(self):
        data = self.data
        idx = random.sample(list(range(len(self.data))), self.k)
        clusters = self.data[idx]
        labels = np.zeros((len(self.data),))
        while True:
            cnt = 0
            for i, d in enumerate(self.data):
                _distance = self.__euclidean_distance(d, clusters)
                min_idx = np.argmin(_distance)
                if labels[i] != min_idx:
                    cnt += 1
                    labels[i] = min_idx
                if cnt == 0:
                    break
            for label in range(self.k):
                points = self.data[labels == label]
                centroid = np.mean(points, axis=0)
                clusters[label] = centroid
            return labels


def make_blobs_txt(centers=3, n_features=3, n_samples=100, savepath="blobs.txt"):
    data, label = make_blobs(n_features=n_features, n_samples=n_samples, centers=centers, random_state=7)
    f = open(savepath, 'w')
    f.write(str(centers))
    np.savetxt(savepath, data, fmt='%f', delimiter=',')


def read_txt(path="data.txt"):
    f = open(path, 'r')
    data = []
    for line in f:
        if len(line) == 2:
            continue
        data.append([float(line.split(',')[0]), float(line.split(',')[1]), float(line.split(',')[2])])
    data = np.array(data)
    return data


def visulization(dataset, labels):
    ax = plt.figure().add_subplot(projection='3d')
    # for i in range(len(labels)):
    #     ax.scatter(dataset[i][0], dataset[i][1], dataset[i][2], c=labels[i], cmap="bwr_r")
    ax.scatter(dataset[:, 0], dataset[:, 1], dataset[:, 2], c=labels)
    plt.show()


if __name__ == "__main__":
    make_blobs_txt(savepath="blobs.txt", centers=3, n_features=3, n_samples=100)
    dataset = read_txt(path="blobs.txt")
    K = int(input("输入k:"))
    kmeans = KMeans(dataset, k=K)
    labels = kmeans.get_labels()
    print(labels)
    visulization(dataset, labels)

运行示例

terminal
可视化


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

相关文章

Innodb索引和锁的学习笔记

2019独角兽企业重金招聘Python工程师标准>>> 附录:前段时间学习了下innodb锁的相关知识,对锁和事务有了大体理解,这里做个小总结。 1.Innodb事务和锁的关系。 Innodb区别于MyISAM的两个特点就是Innodb对于事务的支持和对行锁的支…

[前端必刷75题]41.使用arguments

使用arguments描述示例1代码循环reduce描述 函数 useArguments 可以接收 1 个及以上的参数。请实现函数 useArguments,返回所有调用参数相加后的结果。本题的测试参数全部为 Number 类型,不需考虑参数转换。 示例1 输入: 1, 2, 3, 4 输出&…

删除html元素

如果需要将id是‘div2js’的div元素删除。 1.使用DOM对象 首先需要找到被删元素的父元素,通过父元素将其需要删除的子元素删除。 var el document.getElementById(div2js); el.parentNode.removeChild(el); 2.使用JQuery 直接找到并删除。 $(#div2js).remove();

Pytorch搭建ResNet(附完整代码)

Pytorch搭建ResNet 1. 问题描述 1.1 ResNet 卷积神经网络逐渐取代传统算法,成为处理计算机视觉任务的核心,ResNet[1]的提出更是CNN图像史上一件里程碑事件。当网络深度增加时,网络准确度出现饱和甚至下降,残差学习的提出解决了…

[前端必刷75题]42.使用apply调用函数

使用apply调用函数描述代码描述 实现函数 callIt,调用之后满足如下条件 1、返回的结果为调用 fn 之后的结果2、fn 的调用参数为 callIt 的第一个参数之后的全部参数 代码 1.使用apply2.arguments不是数组要先转换再slice3.可以用slice.call function callIt(fn…

Quick-cocos2d-x3.3 Study (九)--------- 为物体添加物理特性

添加一个主角 1 local Player class("Player", function()2 return display.newSprite("#player.png") 3 end)4 5 function Player:ctor()6 -- 为物体添加物理属性7 local body cc.PhysicsBody:createBox( self:getContentS…

[Vue框架学习笔记]用户列表的搭建

用户列表的搭建如何创建并引入一个新组件解决用户列表小问题如何使用elements搭建完界面,然后就是一些接口的调试如何创建并引入一个新组件 1.创建一个vue文件2.在index.js中配置路由,有需要可以重定向,配置子路由等3.在App.vue中添加路由占…

hdu 4964 Emmet()模拟

题目链接:hdu 4964 Emmet 题目大意: 给定语句,依照语法翻译并输出。 解题思路:用递归模拟文法分析,主要注意几点: 括号而且的情况:(fuck)(you)括号嵌套的情况:((fuck.you))优先输出i…