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...