当前位置: 首页 > news >正文

机器学习第二关——k-means算法流程

k-means算法流程:
算法流程直接看代码注释吧

 #encoding=utf8
import numpy as np

# 计算一个样本与数据集中所有样本的欧氏距离的平方
def euclidean_distance(one_sample, X):
    one_sample = one_sample.reshape(1, -1)
    distances = np.power(np.tile(one_sample, (X.shape[0], 1)) - X, 2).sum(axis=1)
    return distances

class Kmeans():
    """Kmeans聚类算法.
    Parameters:
    -----------
    k: int
        聚类的数目.
    max_iterations: int
        最大迭代次数. 
    varepsilon: float
        判断是否收敛, 如果上一次的所有k个聚类中心与本次的所有k个聚类中心的差都小于varepsilon, 
        则说明算法已经收敛
    """
    def __init__(self, k=2, max_iterations=500, varepsilon=0.0001):
        self.k = k
        self.max_iterations = max_iterations
        self.varepsilon = varepsilon
        np.random.seed(1)
    #********* Begin *********#

    # 从所有样本中随机选取self.k样本作为初始的聚类中心
    def init_random_centroids(self, X):
        n_samples,n_features =np.shape(X)
        centroids = np.zeros((self.k, n_features))
        for p in range(self.k):
            centroid =X[np.random.choice(range(n_samples))]
            centroids[p] =centroid
        return centroids

    # 返回距离该样本最近的一个中心索引[0, self.k)
    def _closest_centroid(self, sample, centroids):
        distances = euclidean_distance(sample, centroids)
        closest_i = np.argmin(distances)
        return  closest_i

    # 将所有样本进行归类,归类规则就是将该样本归类到与其最近的中心
    def create_clusters(self, centroids, X):
        #n_samples = np.shape(X)[0]
        clusters =[[]for _ in range(self.k)]
        for sample_i, sample in enumerate(X):
            centroid_i = self._closest_centroid(sample, centroids)
            clusters[centroid_i].append(sample_i)
        return clusters

    # 对中心进行更新
    def update_centroids(self, clusters, X):
        n_features = np.shape(X)[1]
        centroids = np.zeros((self.k,n_features))
        for i, cluster in enumerate(clusters):
            centroid = np.mean(X[cluster],axis=0)
            centroids[i] = centroid
        return centroids

    # 将所有样本进行归类,其所在的类别的索引就是其类别标签
    def get_cluster_labels(self, clusters, X):
        y_pred = np.zeros(np.shape(X)[0])
        for cluster_i,cluster in enumerate(clusters):
            for sample_i in cluster:
                y_pred[sample_i] = cluster_i
        return y_pred

    # 对整个数据集X进行Kmeans聚类,返回其聚类的标签
    def predict(self, X):
        # 从所有样本中随机选取self.k样本作为初始的聚类中心
        centroids = self.init_random_centroids(X)
        # 迭代,直到算法收敛(上一次的聚类中心和这一次的聚类中心几乎重合)或者达到最大迭代次数
        for _ in range(self.max_iterations):
            clusters =self.create_clusters(centroids,X) 
            # 将所有进行归类,归类规则就是将该样本归类到与其最近的中心
            former_centroids = centroids
            # 计算新的聚类中心
            centroids = self.update_centroids(clusters, X)
            # 如果聚类中心几乎没有变化,说明算法已经收敛,退出迭代
            diff = centroids - former_centroids
            if diff.any() <self.varepsilon:
                break
        return self.get_cluster_labels(clusters,X)
    #********* End *********#

相关文章:

  • eclipse中怎么删除Web App Libraries重复的jar包
  • 常见Http响应状态码
  • 记录EduCoder实验平台的感受(答案匹配机制)
  • 二手车交易系统数据库的表格设计
  • eclipse建servlet 注解正确 却无法访问
  • 软件项目管理EAC、ETC的计算
  • 三点估计法计算完工可能性
  • 求解某项目的关键路径和总工期
  • 软件过程管理复习
  • JDBC封装的JavaBean里面没有ToSting方法,会出现取不到对象,反而取回类的hash码
  • Java中DAO层、Service层和Controller层的区别
  • 程序员之第一关修炼:学会思考,才能学会创造
  • 阅读和笔记同时整理——pdf笔记软件推荐BookxNote
  • Idea工具使用---添加右键菜单
  • MySql Workbench的简单使用
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • CSS中外联样式表代表的含义
  • flask接收请求并推入栈
  • IDEA 插件开发入门教程
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • node学习系列之简单文件上传
  • PHP 的 SAPI 是个什么东西
  • python大佬养成计划----difflib模块
  • scrapy学习之路4(itemloder的使用)
  • SpriteKit 技巧之添加背景图片
  • v-if和v-for连用出现的问题
  • 从重复到重用
  • 观察者模式实现非直接耦合
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 配置 PM2 实现代码自动发布
  • 收藏好这篇,别再只说“数据劫持”了
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​你们这样子,耽误我的工作进度怎么办?
  • #QT(串口助手-界面)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (java)关于Thread的挂起和恢复
  • (层次遍历)104. 二叉树的最大深度
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (论文阅读40-45)图像描述1
  • (区间dp) (经典例题) 石子合并
  • (一)Linux+Windows下安装ffmpeg
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • .bat批处理出现中文乱码的情况
  • .chm格式文件如何阅读
  • .gitignore文件_Git:.gitignore
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Core 项目指定SDK版本
  • .NET DataGridView数据绑定说明
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .Net 应用中使用dot trace进行性能诊断
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)