1、計劃進度html
計劃安排時間 | 計劃完成內容 | 是否完成 |
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 | 畢業論文定稿,準備畢業答辯 |
2、本週研究內容。python
一、簡單實現樸素貝葉斯分類算法(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)、提取數據特徵app
1)按類別劃分數據dom
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)提取數據集特徵post
提取數據集特徵,計算每一個屬性的均值和標準差
#重點是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
3、你本週的體會及須要改進地方。
測試截圖較多不方便放上去,每一個函數都實現了相應的結果,如今只要拼湊起來,並對最後的結果進行即返回來的全部預測值的列表進行操做,不過在編寫代碼過程當中,遺漏了先驗機率的計算,以後會把這個添加進去!以後就是數據預處理,打算用python的庫進行歸一化處理以後,拿出若干屬性預測,以及最後的圖表展現,也是用Python實現
4、你本週參考的文獻。
一、http://www.cnblogs.com/chaosimple/p/4153167.html
二、http://python.jobbole.com/81019/