首页 > 代码库 > 第五次任务计划书

第五次任务计划书

一、计划进度

 
计划安排时间 计划完成内容 是否完成
 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/

 

第五次任务计划书