分類與監督學習,樸素貝葉斯分類算法

1.理解分類與監督學習、聚類與無監督學習。算法

簡述分類與聚類的聯繫與區別。編程

 分類:分類是根據文本的特徵或屬性,劃分到已有的類別中。也就是說,這些類別是已知的,經過對已知分類的數據進行訓練和學習,找到這些不一樣類的特徵,再對未分類的數據進行分類。數組

 聚類聚類是事先不知道數據會分爲幾類,經過分析將數據或者說用戶的共同特色聚合成幾個羣體,聚類不須要對數據進行訓練和學習。app

簡述什麼是監督學習與無監督學習。學習

        監督學習:針對的是有標籤的數據集,對具備概念標記的訓練樣本進行學習,以儘量對訓練樣本集外的數據進行標記預測。spa

        無監督學習:針對的是沒有標籤的數據集,對沒有概念標記的訓練樣本進行學習,以發現訓練樣本集中的結構性知識。excel

 

2.樸素貝葉斯分類算法 實例code

利用關於心臟情患者的臨牀數據集,創建樸素貝葉斯分類模型。blog

有六個分類變量(分類因子):性別,年齡、KILLP評分、飲酒、吸菸、住院天數pandas

目標分類變量疾病:–心梗–不穩定性心絞痛

新的實例:–(性別=‘男’,年齡<70, KILLP=‘I',飲酒=‘是’,吸菸≈‘是」,住院天數<7)

最多是哪一個疾病?

上傳演算過程。

 

3.編程實現樸素貝葉斯分類算法

利用訓練數據集,創建分類模型。

輸入待分類項,輸出分類結果。

能夠心臟情患者的臨牀數據爲例,但要對數據預處理。

import numpy as np
import pandas
data=pandas.read_excel('心臟病患者臨牀數據.xlsx')
data

#對性別進行處理(男爲0,女爲1)
xingbie=[]
for i in data['性別']:
    if i =='':
        xingbie.append(0)
    else:
        xingbie.append(1)

#對年齡段進行預處理(<70爲1,70-80爲2,>80爲3)
ages=[]
for j in data['年齡']:
    if j =='<70':
        ages.append(1)
    elif j =='70-80':
        ages.append(2)
    else:
        ages.append(3)

#對住院天數進行處理(<70爲1,7-14爲2,>14爲3)
days=[]
for k in data['住院天數']:
    if k=='<7':
        days.append(1)
    elif k=='7-14':
        days.append(2)
    else:
        days.append(3)
        
#處理後的數據
data1=data
data1['性別']=xingbie
data1['年齡']=ages
data1['住院天數']=days

#將數據轉成數組
data_arr=np.array(data1)
data_arr

#利用貝葉斯算法對給定的組別進行分類
def NB(xingbie, ages, KILLP, drink, smoke, days):
    #初始化值
    x1_y1,x2_y1,x3_y1,x4_y1,x5_y1,x6_y1 = 0,0,0,0,0,0
    x1_y2,x2_y2,x3_y2,x4_y2,x5_y2,x6_y2 = 0,0,0,0,0,0
    y1 = 0
    y2 = 0
    #計算爲心梗的機率
    for a in data_arr:
        if a[6]=='心梗':
            y1+=1
            if a[0]==xingbie:
                x1_y1+=1
            if a[1]==ages:
                x2_y1+=1
            if a[2]==KILLP:
                x3_y1+=1
            if a[3]==drink:
                x4_y1+=1
            if a[4]==smoke:
                x5_y1+=1
            if a[5]==days:
                x6_y1+=1
        else:#計算患有不穩定性心絞痛的機率
            y2+=1
            if a[0]==xingbie:
                x1_y2+=1
            if a[1]==ages:
                x2_y2+=1
            if a[2]==KILLP:
                x3_y2+=1
            if a[3]==drink:
                x4_y2+=1
            if a[4]==smoke:
                x5_y2+=1
            if a[5]==days:
                x6_y2+=1
                
    #計算每種症狀在心梗下的機率
    x1_y1, x2_y1, x3_y1, x4_y1, x5_y1, x6_y1 = x1_y1/y1, x2_y1/y1, x3_y1/y1, x4_y1/y1, x5_y1/y1, x6_y1/y1
    
    #計算每種症狀在不穩定性心絞痛的機率
    x1_y2, x2_y2, x3_y2, x4_y2, x5_y2, x6_y2 = x1_y2/y2, x2_y2/y2, x3_y2/y2, x4_y2/y2, x5_y2/y2, x6_y2/y2
    
    #多個症狀在心梗下的機率
    x_y1 = x1_y1 * x2_y1 * x3_y1 * x4_y1 * x5_y1 * x6_y1
    
    #多個症狀在不穩定性心絞痛下的機率
    x_y2 = x1_y2 *  x2_y2 * x3_y2 * x4_y2 * x5_y2 * x6_y2
    
    ##初始化各個特徵x的值
    x1,x2,x3,x4,x5,x6=0,0,0,0,0,0
    for a in data_arr:
        if a[0]==xingbie:
            x1+=1
        if a[1]==ages:
            x2+=1
        if a[2]==KILLP:
            x3+=1
        if a[3]==drink:
            x4+=1
        if a[4]==smoke:
            x5+=1
        if a[5]==days:
            x6+=1
    lens = len(data_arr)
    #全部x的可能性
    x = x1/lens * x2/lens * x3/lens * x4/lens * x5/lens* x6/lens
    # 分別計算心梗和不穩定性心絞痛的機率
    y1_x = (x_y1)*(y1/lens)/x
    print(y1_x)
    y2_x = (x_y2)*(y2/lens)/x
    print(y2_x)
    
    # 判斷是哪中疾病的可能更大
    if y1_x > y2_x:
        print('病人患心梗的可能更大,可能性爲:',y1_x)
    else:
        print('病人患不穩定性心絞痛的可能更大,可能性爲:',y2_x)

# 判斷:性別=‘男’,年齡<70, KILLP=1,飲酒=‘是’,吸菸=‘是」,住院天數<7
NB(0,1,1,'','',1)

相關文章
相關標籤/搜索