一、计划进度
计划安排时间 | 计划完成内容 | 是否完成 |
2017.4.2---2017.4.8 | 尝试进行代码实现,并进行小规模数据集作为输入,进行测试 | |
2017.4.9---2017.4.15 | 完善具体代码,并着手进行毕业论文撰写 | |
2017.4.16---2017.4.22 | 进行Python更加深入学习,利用一些扩展包,尝试对数据结果进行展示 | |
2017.4.23---2017.4.29 | 撰写毕业论文,并且与老师共同修改 | |
2017.4.30---2017.5.6 | 继续完善毕业设计,与老师沟通 | |
2017.5.7---2017.5.12 | 毕业论文定稿,准备毕业答辩 |
二、本周研究内容。
1、简单实现朴素贝叶斯分类算法(python),主要包括以下步骤:
(1)、导入数据函数和划分
import csv def loadfile(filename): with (open(filename,‘r‘)) as f: #用with语句比较方便 reader = csv.reader(f) #csv的reader函数读取 dataset = list(reader) #将reader全部存储在dataset中,将其转为列表 for i in range(len(dataset)): dataset[i] = [float(x) for x in dataset[i]] #生成式将数字变为浮点数 return dataset
import random #导入随机数模块 def splitDataset(dataset,splitRatio): #拆分数据集 trainszie = int (len(dataset)*splitRatio) #测试集的长度等于整体数据长度乘拆分比率 trainset = [] #初始化测试集 copy = list (dataset) #作为抽离的数据集 while len(trainset) < trainszie: #当训练集的长度小于要求的拆分长度 index = random.randrange(len(copy)) #在整个数组中随机取出一个下标 trainset.append(copy.pop(index)) #这个下表从整个列表取出,放入训练集 return [trainset,copy] #返回训练集合测试集
(2)、提取数据特征
1)按类别划分数据
def separateByAttackClass (dataset): separated ={} for i in range(len(dataset)): #循环dataset列表 vector = dataset[i] #取出dataset的值 if(vector[-1] not in separated): #下标记为-1表示末位元素,即类型的值,若一开始separate字典没有该特征, separated[vector[-1]]=[] # 则置为空 separated[vector[-1]].append(vector) #特征值为键值,相同键值的则归为同一键 return separated
2)计算均值,计算标准差
import math def mean(numbers): return sum(numbers)/float(len(numbers)) #sum函数的参数是个List def stdev(numbers): avg = mean(numbers) variance = sum([pow(x-avg,2) for x in numbers])/float(len(numbers)-1) #方差公式为,每一个数与均值的离差的平方和除以 # 样本个数(因为此处为样本所以方差应除以N-1,保证对整体的估计) return math.sqrt(variance) #math.sqrt函数求开方
3)提取数据集特征
提取数据集特征,计算每个属性的均值和标准差 #重点是ZIP函数的灵活应用! def summarize(dataset): summaries = [(mean(attribute),stdev(attribute)) for attribute in zip(*dataset) ] #使用生产式,zip函数按列划分 del summaries[-1] #删除最后的特征值 return summaries
4)按类别提取属性特征
#合并函数,先分类后计算在各个类别下的属性
def summarizeByClass(dataset):
separated = separateByAttackClass(dataset) #按攻击类型分类
summaries={} #初始化一个字典
for classValue, instances in separated.iteritems(): # 迭代器生成 键:值
summaries[classValue] = summarize(instances) #将值(列表)进行计算方差和均值,
return summaries
(3)预测
1)计算高斯概率密度函数
#确定完各个属性在各个类别下的均值和方差之后。就可以进行高斯分布的计算
import math
def calculateProbability(x,mean,stdev):
exponent = math.exp(-(math.pow(x-mean,2)/(2*math.pow(stdev,2)))) #正态分布的指数部分
return (1/(math.sqrt(2*math.pi)*stdev))*exponent #正态分布指数前的部分
2)计算对应类的概率
#计算所属于类的概率
def calculateClassProbabilities(summaries,inputVector):
proabilities = {} #初始化一个类
for classValue , classSummaries in summaries.iteritems(): #迭代器
proabilities[classValue] = 1 #先置为1
for i in range(len(classSummaries)):
mean,stdev = classSummaries[i] #获得平均数,方差
x = inputVector[i]
proabilities[classValue] *= calculateProbability(x,mean,stdev) #累乘计算
return proabilities
3)单一预测
def predic(summaries,inputVector):
probailities = calculateClassProbabilities(summaries,inputVector) #调用上一个属于某属性的类的概率
bestlabel,bestProb = None,-1 #标签类型取值为None,最大概率先设为-1
for classValue , proability in probailities.iteritems(): #迭代器获得类和概率对
if bestlabel is None or proability > bestProb: #判断如果一开始类型为空,以及之后寻找最大概率
bestProb = proability #则使得最大概率赋值
bestlabel = classValue #并返回该类的类型
return bestlabel
4)进行多值预测
#多个输入的分类预测
def getPrediction(summaries, testSet):
predictions = [] #初始化列表
for i in range(len(testSet)):
result = predic(summaries,testSet[i]) #列表多次调用预测
predictions.append(result) #将预测值插入列表
return predictions
三、你本周的体会及需要改进地方。
测试截图较多不方便放上去,每个函数都实现了相应的结果,现在只要拼凑起来,并对最后的结果进行即返回来的所有预测值的列表进行操作,不过在编写代码过程中,遗漏了先验概率的计算,之后会把这个添加进去!之后就是数据预处理,打算用python的库进行归一化处理之后,拿出若干属性预测,以及最后的图表展示,也是用Python实现
四、你本周参考的文献。
1、http://www.cnblogs.com/chaosimple/p/4153167.html
2、http://python.jobbole.com/81019/