一直都是用r,sas這樣的工具完成機器學習演算法。但是面對大資料集的時候,這些工具往往顯得很弱,基本上在讀入檔案的時候就能讓電腦的記憶體爆掉。能用程式實現這些機器學習演算法是很重要的。因為自己如果能實現這些演算法,你就可以很靈活,比如說在文字挖掘過程中往往是稀疏矩陣,雖然r也有提供稀疏矩陣的操作,但是不一定滿足自己的需求。所以我選擇了從《機器學習實戰》這本書中來學習用python實現機器學習的演算法。
下面直接貼上**,這**完全是仿照書上寫的。用這個思路我還實現了c++版的id3演算法,會稍後貼出。
import math
dataset = [
("青年", "否", "否", "一般", "否")
,("青年", "否", "否", "好", "否")
,("青年", "是", "否", "好", "是")
,("青年", "是", "是", "一般", "是")
,("青年", "否", "否", "一般", "否")
,("中年", "否", "否", "一般", "否")
,("中年", "否", "否", "好", "否")
,("中年", "是", "是", "好", "是")
,("中年", "否", "是", "非常好", "是")
,("中年", "否", "是", "非常好", "是")
,("老年", "否", "是", "非常好", "是")
,("老年", "否", "是", "好", "是")
,("老年", "是", "否", "好", "是")
,("老年", "是", "否", "非常好", "是")
,("老年", "否", "否", "一般", "否")
]labels=['var1','var2','var3','var4']
data=[[1,1,'yes'],
[1,1,'yes'],
[1,0,'no'],
[0,1,'no'],
[0,1,'no']]
la=['no su***cing','flippes']
#計算資訊熵,target為分類標籤的位置
def entropy(dataset,target=-1):
instance_num=len(dataset)
tar_num={}
entro=0.0
for t in dataset:
tar_num[t[target]]=tar_num.setdefault(t[target],0)+1
pl=[n/instance_num for n in tar_num.values()]
for p in pl:
entro-=p*math.log2(p)
return(entro)
###拆分資料集
def split_dataset(dataset,f_index,value):
sub_set=
for row in dataset:
row=list(row)
if row[f_index]==value:
row.remove(row[f_index])
return(sub_set)
###計算資訊增益
def info_gain(dataset,feature_index):
entropy_d=entropy(dataset)
long_dataset=len(dataset)
feature_count={}
sub_entropy=0.0
for row in dataset:
feature_count[row[feature_index]]=feature_count.setdefault(row[feature_index],0)+1
feature_p=0.0
for k,v in feature_count.items():
feature_p=v/long_dataset
subset=split_dataset(dataset,feature_index,k)
sub_entropy+=feature_p*entropy(subset)
ig=entropy_d-sub_entropy
#print(ig)
return(ig)
##尋找最大資訊增益的特徵
def find_bestfeature(dataset,label):
max_ig=0.0
for la in label:
label_index=label.index(la)
ig=info_gain(dataset,label_index)
if ig>max_ig:
max_ig=ig
baset_feature=la
return(baset_feature,label_index)
###返回數量做多的value
def max_count(dataset):
if dataset[0]==1:
for row in dataset:
class_count[row[0]]=class_count.setdefault(row[0],0)+1
sorted_count=sorted(class_count.items(),reverse=true)
return(sorted_count[0][0])
else:
return(none)
###create_tree
def create_tree(dataset,label):
class_list=[x[-1] for x in dataset]
if class_list.count(class_list[0])==len(dataset):
return(class_list[0])
if len(dataset)==1:
return(max_count(dataset))
best_feature,index=find_bestfeature(dataset,label)
tree=}
feature_list=set(x[index] for x in dataset)
label.remove(best_feature)
for ft in feature_list:
sublabel=label[:]
subset=split_dataset(dataset,index,ft)
tree[best_feature][ft]=create_tree(subset,sublabel)
return(tree)
def classfy(inputtree,featlabels,testvec):
firststr=list(inputtree.keys())[0]
seconddict=inputtree[firststr]
featindex=featlabels.index(firststr)
for key in seconddict.keys():
if testvec[featindex]==key:
if type(seconddict[key]).__name__=='dict':
classlabel=classfy(seconddict[key],featlabels,testvec)
else:
classlabel=seconddict[key]
return classlabel
mytree=create_tree(data,la)
test=classfy(mytree,['no su***cing','flippes'],[0,1])
print(test)
決策樹 ID3構建決策樹
coding utf 8 from math import log import operator 建立訓練資料集 defcreatedataset dataset 1,1,yes 1,1,yes 1,0,no 0,1,no 0,1,no 資料集的最後乙個元素作為該資料的標籤,是否是魚 labels...
決策樹之 ID3
id3 是一種用來構建決策樹的演算法,它根據資訊增益來進行屬性選擇。關於決策樹,請參見 此處主要介紹 id3 演算法如何利用資訊增益選擇屬性。資訊熵,簡稱 熵 假定訓練集中目標屬性為 c c的取值為 c1 c2,cm 每個取值佔的比例為p1 p2,pm 則資訊熵的定義為 en trop y s en...
決策樹 ID3演算法
id3演算法通過計算每個屬性的資訊增益,認為資訊增益越大屬性越優,每次劃分選取資訊增益最大的屬性為劃分標準,重複這個過程,直到構成一棵決策樹。資訊熵是描述事件給我們的驚訝程度,如果所有事件的概率均等,那熵值大,驚訝程度低。如果有一事件的概率極高而其他極低,熵值便低,驚訝程度大。其計算公式如下 資訊增...