前言
今天第一次写博客,突然意识到自己身为计算机方面的求学者,已经数年了,还没写过技术博客,实属不该。
一、我的目标
- 对人工智能比较感兴趣,将主流写人工智能(目前属于入门级)。
- 将穿插一些数据库、操作系统、数据结构、计算机组成原理、编译原理、计算机网络的知识。
- 将会记录一些经典的模块安装bug,以及一些稀奇古怪的报错解决方法,学习了那么多博客,也该做做回馈了,利人利己。
- 贴一些代码,不然好像发不出去,这里为了证明我确实有学习,就粘贴一下曾写好的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三种决策树算法,并能完全跑通
#就先到这里吧,如果你需要完整的决策树算法,可以私聊我。
#我将在下面附上结果图。
二、具体实施
- 关于人工智能方面,准备学习李沐大神的《动手学深度学习》,如果你翻到了我的博客,我们可以一起“动手学”,现在是2022.05.16,让博客见证我们的成长。
- 关于数据库、操作系统、数据结构、计算机组成原理、编译原理、计算机网络的知识,毕竟是计算机学科的根本支柱,永不能抛弃,所以也会穿插着进行写作。
- 关于bug的解决,将会没有规律地输出相关文章,将以Python为主要介绍对象。
总结
就从这里开始吧。