求索人工智能


前言

今天第一次写博客,突然意识到自己身为计算机方面的求学者,已经数年了,还没写过技术博客,实属不该。


一、我的目标

  1. 对人工智能比较感兴趣,将主流写人工智能(目前属于入门级)。
  2. 将穿插一些数据库、操作系统、数据结构、计算机组成原理、编译原理、计算机网络的知识。
  3. 将会记录一些经典的模块安装bug,以及一些稀奇古怪的报错解决方法,学习了那么多博客,也该做做回馈了,利人利己。
  4. 贴一些代码,不然好像发不出去,这里为了证明我确实有学习,就粘贴一下曾写好的C4.5决策树相关代码片段吧。
#导入相关模块
import matplotlib
matplotlib.rc("font",family='STXihei')
import matplotlib.pyplot as plt
import math
from collections import Counter
#信息熵的计算
def cal_entropy(dataset):
#     print("第6")
    #计算熵 #numEntries为训练集样本数 
    numEntries = len(dataset) 
    labelCounts = {
    
    } #在这里最后就会变成好瓜和坏瓜
    for featVec in dataset:
        #遍历训练样本 
        label = featVec[-1]
        #将每个训练样本的类别标签作为类别列表 
        if label not in labelCounts.keys():
            #如果一个训练样本的类别不在类别列表字典中 
            labelCounts[label] = 0
            #将该训练样本类别进行标记 
        labelCounts[label] += 1
        #否则,给类别字典对应的类别+1 
    entropy = 0.0#初始化信息商 
    for key in labelCounts.keys():
        #遍历类别字典的每个类别 
        p_i = float(labelCounts[key]/numEntries)
        #计算每个类别的样本数占总的训练样本数的占比(即某一样本是类i的概率) 
        entropy -= p_i * math.log(p_i,2)
        #log(x,10)表示以10 为底的对数,计算信息熵 
    return entropy
#选择最优属性值进行划分
def C45_chooseBestFeatureToSplit(dataset):
#     print("第8")
    numFeatures = len(dataset[0]) - 1
    baseEnt = cal_entropy(dataset)#基本信息熵
    bestInfoGain_ratio = 0.0
    bestFeature = -1
    for i in range(numFeatures): #遍历所有特征
        featList = [example[i] for example in dataset]
        uniqueVals = set(featList) #将特征列表创建成为set集合,元素不可重复。创建唯一的分类标签列表
        newEnt = 0.0
        IV = 0.0
        #每种属性下都可能有不同的属性类别,比如甜度属性,可能有0.1,0.2,0.3
        #我们需要算出来每个属性类别下的entropy,然后相加,这样才得到最终的
        #每个属性类别下的entropy的计算方法是,先找出原dataset里
        #拥有这种属性类别的样例条数,除以dataset总的样例条数,得到占比而这个占比
        #也就是概率,再用概率乘以这个属性类别下的entropy即可
        #也就是它的信息熵,这样就获得了这个属性类别下的熵值,然后算出信息增益
        #然后除以原来的熵值,得到信息增益率
        for value in uniqueVals: #计算每种划分方式的信息熵
            subdataset = splitdataset(dataset, i, value)
            p = len(subdataset) / float(len(dataset))
            newEnt += p * cal_entropy(subdataset)
            IV = IV - p * math.log(p, 2)#条件信息熵
        infoGain = baseEnt - newEnt
        if (IV == 0): #防止VI为0时的异常情况
#                 print("Now, IV == 0")
            continue
        infoGain_ratio = infoGain / IV #这个feature的infoGain_ratio
        print(u"C4.5中第%d个特征的信息增益率为:%.3f" % (i, infoGain_ratio))
#             print("baseEnt, newEnt, IV:  ",baseEnt, newEnt, IV)
        if (infoGain_ratio > bestInfoGain_ratio): #选择最大的gain ratio
            bestInfoGain_ratio = infoGain_ratio
            bestFeature = i #选择最大的gain rati对应的feature
#         print("bestFeature:  ",bestFeature)
    return bestFeature

#我已经实现了C4.5, ID3,CART三种决策树算法,并能完全跑通
#就先到这里吧,如果你需要完整的决策树算法,可以私聊我。
#我将在下面附上结果图。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、具体实施

  1. 关于人工智能方面,准备学习李沐大神的《动手学深度学习》,如果你翻到了我的博客,我们可以一起“动手学”,现在是2022.05.16,让博客见证我们的成长。
  2. 关于数据库、操作系统、数据结构、计算机组成原理、编译原理、计算机网络的知识,毕竟是计算机学科的根本支柱,永不能抛弃,所以也会穿插着进行写作。
  3. 关于bug的解决,将会没有规律地输出相关文章,将以Python为主要介绍对象。

总结

就从这里开始吧。

猜你喜欢

转载自blog.csdn.net/qq_50313560/article/details/124807016
今日推荐