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

9月24日计算机视觉基础学习笔记——经典机器学习_02

文章目录

  • 前言
  • 一、决策树
  • 二、非监督学习中的 k-means


前言

本文为9月24日计算机视觉基础学习笔记——经典机器学习_02,分为两个章节:

  • 决策树;
  • 非监督学习中的 k-means。

一、决策树

1

  • 信息熵: 熵越小,分得越好,纯度越大。
    • 示例:10个样本、3个否、7个是,信息熵为:
      ∑ i − P i   l o g P i = − 0.3 × l o g 0.3 − 0.7 × l o g 0.7 = 0.26 \sum_{i} - P_i\ logP_i = -0.3\times log0.3 - 0.7\times log0.7 = 0.26 iPi logPi=0.3×log0.30.7×log0.7=0.26

分类后总熵为0。

决策树代码如下:

import torch

feature_space=[[1., 3., 2., 2., 3., 0.,3.], 
[2., 0., 2., 5., 1., 2.,3.], 
[3., 2., 3., 3., 2., 3.,2.], 
[4., 0., 3., 3., 2., 0.,1.], 
[3., 1., 2., 2., 5., 1.,3.], 
[1., 4., 3., 3., 1., 5.,2.], 
[3., 3., 3., 3., 1., 0.,1.], 
[5., 1., 1., 4., 2., 2.,2.], 
[6., 2., 3., 3., 2., 3.,0.], 
[2., 2., 2., 2., 5., 1.,4.]]


def get_label(idx):
    label= idx
    return label

def cut_by_node(d,value,feature_space,list_need_cut):
    right_list=[]
    left_list=[]
    for i in list_need_cut:
        #import pdb
        #pdb.set_trace()
        if feature_space[i][d]<=value:
             right_list.append(i)
        else:
             left_list.append(i)
    #return right_list,left_list
    e1=get_emtropy(list2label(left_list,[0,0,0,0,0,0,0,0,0,0])) 
    e2=get_emtropy(list2label(right_list,[0,0,0,0,0,0,0,0,0,0])) 
    n1 = float(len(left_list))
    n2 = float(len(right_list))
    e = e1*n1/(n2+n1) + e2*n2/(n1+n2)
    return e,right_list,left_list

def list2label(list_need_label,list_label):
     for i in list_need_label:
         label=get_label(i)
         list_label[label]+=1
     return list_label

def get_emtropy(class_list):
   E = 0
   sumv = float(sum(class_list))
   if sumv == 0:
       sumv =0.000000000001
   for cl in class_list:
       if cl==0:
           cl=0.00000000001
       p = torch.tensor(float(cl/sumv))
       #print(p)
       E += -1.0 * p*torch.log(p)/torch.log(torch.tensor(2.))
   return E.item()

def get_node(complate,d,list_need_cut):
    e = 10000000
    node=[]
    list_select=[]
    complate_select=[]
    for value in range(0,8):
        complate_tmp=[]
        etmp=0
        list_select_tmp=[]
        sumv=0.000000001
        for lnc in list_need_cut:
            #import pdb
            #pdb.set_trace()
            etmptmp,r_list,l_list=cut_by_node(d,value,feature_space,lnc)
            etmp+=etmptmp*len(lnc)
            sumv+=float(len(lnc))
            if len(r_list)>1:
                list_select_tmp.append(r_list)
            if len(l_list)>1:
                list_select_tmp.append(l_list)
            if len(r_list)==1:
                complate_tmp.append(r_list)
            if len(l_list)==1:
                complate_tmp.append(l_list)
        etmp = etmp/sumv
        sumv=0
        
        if etmp<e:
            e=etmp
            node=[d,value]
            list_select=list_select_tmp
            complate_select=complate_tmp
    for ll in complate_select:
         complate.append(ll)
    return node,list_select,complate


def get_tree():
    all_list=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]] 
    complate=[]
    for d in [3,4,2,5,0,1,6]:
        node,all_list,complate=get_node(complate,d,all_list)
        print("node=%s,complate=%s,all_list=%s"%(node,complate,all_list))

if __name__=="__main__":
    get_tree()

概率是个连续量,无法计算 E:

  • 纯度: P l   V A R ( Y l ) + P r   V A R ( Y r ) P_l\ VAR(Y_l) + P_r\ VAR(Y_r) Pl VAR(Yl)+Pr VAR(Yr).

二、非监督学习中的 k-means

  • 步骤:

    1. 设 k=3;
    2. 从数据中随机取 k个数据;
    3. 按照距离将其他数据分配给这 k个数据,即将数据聚成了 k类;
    4. 对每个类内的所有数据求 mean,得到 k个数据;
    5. 重复3和4,直到停止条件达成。
  • 停止条件:

    1. 数据分类不变化;
    2. k个数据中心点不再变化;
    3. 达到设定最大迭代次数。
  • 如何增强:

    1. 选一个数据,作为第一个类中心 C C C
    2. 计算其余点到所有类中心的距离;
    3. 取离所有类中心距离最远的为新的类中心 C i + 1 C_{i+1} Ci+1
    4. 重复2和3,直到 i + 1 = k i+1=k i+1=k.

相关文章:

  • Java编程之语法结构
  • springboot-webFlux的webclient详细使用介绍,细节拉满
  • 分布式主键生成设计策略
  • getch()与_getch()、不能将const char*类型的值分配到const* 类型的实体
  • java-php-python-ssmC语言教学辅导网站计算机毕业设计
  • nacos1.4.2
  • 绝了,Gooey:一行代码将 Python 程序转换为图形界面应用
  • matlab系统辨识工具箱原理,matlab常用工具箱介绍
  • 深度学习目标跟踪相关细节-毕设
  • JVM基础:什么是STW?
  • Teams Bot App 初探
  • 3d卷积神经网络应用,3d可视动态神经检测
  • Hive on Tez 的安装配置
  • 05 关于局部变量名字的存储
  • java毕业设计教程SSM框架实现的车位租赁管理系统|停车场计费系统[包运行成功]
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Angular 2 DI - IoC DI - 1
  • Java 网络编程(2):UDP 的使用
  • java小心机(3)| 浅析finalize()
  • JWT究竟是什么呢?
  • Node 版本管理
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • React中的“虫洞”——Context
  • vue脚手架vue-cli
  • 基于游标的分页接口实现
  • UI设计初学者应该如何入门?
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C++)八皇后问题
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (三)终结任务
  • (学习日记)2024.01.19
  • (转)3D模板阴影原理
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .Net Remoting(分离服务程序实现) - Part.3
  • .Net Web项目创建比较不错的参考文章
  • .net 发送邮件
  • .Net 高效开发之不可错过的实用工具
  • .net反编译工具
  • .NET中 MVC 工厂模式浅析
  • []FET-430SIM508 研究日志 11.3.31
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [Angular] 笔记 21:@ViewChild
  • [C#C++]类CLASS
  • [codeforces]Levko and Permutation
  • [dts]Device Tree机制
  • [EFI]Atermiter X99 Turbo D4 E5-2630v3电脑 Hackintosh 黑苹果efi引导文件