床頭筆記之機器學習實戰筆記(一)KNN以及決策樹

2021-08-28 14:48:44 字數 3351 閱讀 2447

knn偽**如下:

對未知類別屬性的資料集中的每個點依次執行以下操作:

(1)計算已知類別資料集中的點與當前點之間的距離;

(2)按照距離遞增次序排序;

(3)選取與當前點距離最小的走個點;

(4)確定前幾個點所在類別的出現頻率;

(5)返回前幾個點出現頻率最高的類別作為當前點的**分類。

def classify0(inx, dataset, labels, k):

datasetsize = dataset.shape[0]

diffmat = tile(inx, (datasetsize,1)) - dataset

sqdiffmat = diffmat**2

sqdistances = sqdiffmat.sum(axis=1)

distances = sqdistances**0.5

sorteddistindicies = distances.argsort()

classcount={}

for i in range(k):

voteilabel = labels[sorteddistindicies[i]]

classcount[voteilabel] = classcount.get(voteilabel,0) + 1

sortedclasscount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=true)

return sortedclasscount[0][0]

熵 :

定義為資訊的期望值。

如果待分類的事務可能劃分在多個分類之中, 則符號

為了計算熵,我們需要計算所有類別所有可能值包含的資訊期望值,通過下面的公式得到:

計算給定資料集的夏農熵:

首先』計算資料集中例項的總數。我們也可以在需要時再計算這個值,但是由於**中多次用到這個值,為了提高**效率,我們顯式地宣告乙個變數儲存例項總數。然後,建立乙個資料字典,它的鍵值是最後一列的數值 。如果當前鍵值不存在,則擴充套件字典並將當前鍵值加入字典。每個鍵值都記錄了當前類別出現的次數。最後,使用所有類標籤的發生頻率計算類別出現的概率。我們將用這個概率計算夏農熵,統計所有類標籤發生的次數。

from math import log

def calcshannonent(dataset):

numentries = len(dataset)

labelcounts = {}

for featvec in dataset: #the the number of unique elements and their occurance

currentlabel = featvec[-1]

if currentlabel not in labelcounts.keys(): labelcounts[currentlabel] = 0

labelcounts[currentlabel] += 1

shannonent = 0.0

for key in labelcounts:

prob = float(labelcounts[key])/numentries

shannonent -= prob * log(prob,2) #log base 2

return shannonent

按照給定特徵劃分資料集:

偽**:

資料集這個列表中的各個元素也是列表,

我們要遍歷資料集中的每個元素,一旦發現符合要求的值,則將其新增到新建立的列表中。

在if語句中,程式將符合特徵的資料抽取出來。

理解:當我們按照某個特徵劃分資料集時,就需要將所有符合要求的元素抽取出來。

def splitdataset(dataset, axis, value):

retdataset =

for featvec in dataset:

if featvec[axis] == value:

reducedfeatvec = featvec[:axis] #chop out axis used for splitting

reducedfeatvec.extend(featvec[axis+1:])

return retdataset

選擇最好的資料集劃分方式:
def choosebestfeaturetosplit(dataset):

numfeatures = len(dataset[0]) - 1 #the last column is used for the labels

baseentropy = calcshannonent(dataset)

bestinfogain = 0.0; bestfeature = -1

for i in range(numfeatures): #iterate over all the features

featlist = [example[i] for example in dataset]#create a list of all the examples of this feature

uniquevals = set(featlist) #get a set of unique values

newentropy = 0.0

for value in uniquevals:

subdataset = splitdataset(dataset, i, value)

prob = len(subdataset)/float(len(dataset))

newentropy += prob * calcshannonent(subdataset)

infogain = baseentropy - newentropy #calculate the info gain; ie reduction in entropy

if (infogain > bestinfogain): #compare this to the best gain so far

bestinfogain = infogain #if better than current best, set to best

bestfeature = i

return bestfeature

遞迴構建決策樹

偽**:

偽**:

機器學習實戰 K 均值學習筆記

k 均值 因為可以發現k個不同的簇,且每個簇的中心採用簇中所含的均值計算而成。聚類和分類的區別 最大的區別在於,分類的目標事先已知,而聚類的不一樣,其產生的結果和分類相同,但是類別沒有預先定義,因此聚類有時候也被稱為無監督分類 如下 from numpy import def loaddataset...

機器學習實戰學習筆記(一) K 近鄰演算法

k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類。存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料的每個特徵和樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似資料 最近鄰 的...

《機器學習實戰》學習筆記之k 近鄰演算法3

2.3 手寫識別系統 從os模組中匯入listdir函式,用來讀取給定目錄中的檔名 from os import listdir關於zeros函式的使用,及注釋 image convert to vector def img2vector filename returnvect zeros 1,10...