設定好屬性字典
d_keys =
dict
(色澤=
['青綠'
,'烏黑'
,'淺白'
], 根蒂=
['蜷縮'
,'硬挺'
,'稍蜷'
], 敲聲=
['清脆'
,'沉悶'
,'濁響'
], 紋理=
['稍糊'
,'模糊'
,'清晰'],
臍部=['凹陷'
,'稍凹'
,'平坦'
], 觸感=
['軟粘'
,'硬滑'
])
讀取資料:
x =
f =open
(r'c:\users\dell\desktop\xiguaji3.0.txt'
,'r'
)lines = f.readlines(
)for line in lines:
line = line.replace(
'\n',''
)","))
f.close(
)x = np.array(x)
# print(x)
titles =
list
(x[0,1
:-3]
)# 表頭
y = x[:,
-1]# 標記
x = np.delete(x,
0, axis=0)
# 刪除第一行,表頭
x = np.delete(x,[0
,7,8
], axis=1)
# 刪除第一
計算資料中的熵
# 重新定義log函式,針對底為0的情況
deflog
(x):
if x !=0:
return math.log(x,2)
else
:return
0# 計算titles中屬性的熵
defculent
(x,title)
: indexnumber =
for m, n in
enumerate
(title)
: indexnumber[n]
=for k in title[n]
: indexnumber[n]
[k]=
for index, row in
enumerate
(x):
if row[m]
== k:
indexnumber[n]
[k] ent =
for key1 in indexnumber:
a =0.0for key2 in indexnumber[key1]
: yes =
0 no =0if
len(indexnumber[key1]
[key2])!=
0:for i in indexnumber[key1]
[key2]
:if x[i][-
1]=='好瓜'
: yes +=
1else
: no +=
1 p1 =
float
(yes /
(yes + no)
) p2 =
float
((yes + no)
/(x.shape[0]
))a += p2 *
(p1 * log(p1)+(
1- p1)
* log((1
- p1)))
# 防止對0取對數,重新定義log函式
else
: a +=
0 ent[key1]=-a
return indexnumber, ent
輸出的indexnumber包含title中每個屬性取值的樣本編號;ent包含每個屬性的熵大小
輸出結果如下:
,『根蒂』: ,
『敲聲』: ,
『紋理』: ,
#『臍部』: ,
#『觸感』: }
下面進行決策樹遞迴程式設計,按照書上的演算法:
def
calculateshannonent
(x, title, table)
: yes =
0# 儲存正例樣本個數
for row in x:
if row[-1
]=="好瓜"
: yes +=
1 p_yes =
float
(yes/x.shape[0]
)if p_yes ==1:
print
("leaf節點:好瓜"
)return
# 結束遞迴
if p_yes ==0:
print
("leaf節點:壞瓜"
)return
judge =
true
for i in
range
(x.shape[1]
):# 列數,等於屬性集
iflen
(set
(x[:
, i]))
!=1:# 如果某一屬性各樣本取值存在不等的情況,則說明在屬性集上不全相等
judge =
false
break
iflen
(title)==0
| judge:
#len(title) == 0意味著屬性集為空
print
("leaf節點:好瓜"
)if p_yes >=
0.5else
print
("leaf節點:壞瓜"
)return
indexnumber, ent = culent(x, title)
# indexnumber:每個屬性包含的樣本情況,ent:每個屬性的資訊增益
# print(indexnumber)
key_name =
min(ent, key=ent.get)
# 最優劃分屬性
print
("節點::分支"
.format
(key_name, indexnumber[key_name]))
for key in indexnumber[key_name]:if
len(indexnumber[key_name]
[key])==
0:print
("leaf節點:好瓜"
)if p_yes >=
0.5else
print
("leaf節點:壞瓜"
)return
else
:print
("分支:"
, key)
m =#儲存去除最優屬性後的新的屬性
for i in table:
if i != key_name:
n =#儲存去除最優屬性後的新的屬性字典
for i in title:
if i != key_name:
n[i]
= title[i]
a = np.array(x[indexnumber[key_name]
[key]])
a=np.delete(a, table.index(key_name)
, axis=1)
#劃分後的樣本
calculateshannonent(a, n, m)
最後輸出結果與書上一致
節點:紋理:分支
分支: 稍糊
節點:觸感:分支
分支: 軟粘
leaf節點:好瓜
分支: 硬滑
leaf節點:壞瓜
分支: 模糊
leaf節點:壞瓜
分支: 清晰
節點:根蒂:分支
分支: 蜷縮
leaf節點:好瓜
分支: 硬挺
leaf節點:壞瓜
分支: 稍蜷
節點:色澤:分支
分支: 青綠
leaf節點:好瓜
分支: 烏黑
節點:觸感:分支
分支: 軟粘
leaf節點:壞瓜
分支: 硬滑
leaf節點:好瓜
leaf節點:好瓜 淺白
決策樹和CART決策樹
首先簡單介紹下決策樹 說到決策樹肯定離不開資訊熵 什麼是資訊熵 不要被這名字唬住,其實很簡單 乙個不太可能的時間居然發生了,要比乙個非常可能的時間發生提供更多的資訊。訊息說 今天早上太陽公升起 資訊量是很少的,以至於沒有必要傳送。但另一條訊息說 今天早上日食 資訊量就很豐富。概率越大資訊量就越少,與...
決策樹(二)決策樹回歸
回歸 決策樹也可以用於執行回歸任務。我們首先用sk learn的decisiontreeregressor類構造一顆回歸決策樹,並在乙個帶雜訊的二次方資料集上進行訓練,指定max depth 2 import numpy as np quadratic training set noise np.r...
決策樹演算法簡單應用
coding utf 8 from sklearn import tree visualize code from sklearn.externals.six import stringio import pydotplus 決策樹演算法 初步的兩個特性的判斷,重量,表皮光滑度 對於水果,可以是 1...