機器學習實戰學習筆記(一)

2021-10-06 16:30:16 字數 3521 閱讀 9126

簡單來說:k-近鄰演算法(knn)採用測量不同特徵值之間的距離演算法進行分類

優點:精度高、對異常值不敏感、無資料輸入假定

缺點:計算複雜度高、空間複雜度高

適用資料範圍:數值型和標稱型

工作原理:存在乙個訓練樣本集,樣本集中每個資料都存在標籤。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似(最近鄰)的分類標籤。一般來說,只選擇樣本資料集中前k個最相似的資料。通常k是不大於20的整數。

# -- coding: utf-8 --

import numpy as np

import operator

defcreatedataset()

:# 建立資料集

group = np.array([[

1.0,

1.1],[

1.1,

1.0],[

0,0]

,[0,

0.1]])

labels =

['a'

,'a'

,'b'

,'b'

]return group, labels

defclassify0

(inx, dataset, labels, k)

:# inx為新輸入資料,array型別 1*2

# dataset為輸入的訓練樣本集(不含標籤),array型別 4*2

# labels為標籤,array型別 1*4

# k為選擇近鄰數目

# 以上資料大小僅為此資料集大小

datasetsize = dataset.shape[0]

# array.shape[0] 提取array的行數 此處datasetsize為4

diffmat = np.tile(inx,

(datasetsize,1)

)- dataset

sqdiffmat = diffmat **

2 sqdistances = sqdiffmat.

sum(axis=1)

distances = sqdistances **

0.5# 以上部分計算各點之間歐式距離

sorteddistindicies = distances.argsort(

)# argsort函式返回的是陣列值從小到大的索引值

classcount =

for i in

range

(k):

voteilabel = labels[sorteddistindicies[i]

]# 將按距離排列後的例項的標籤提取出來

classcount[voteilabel]

= classcount.get(voteilabel,0)

+1# 獲得key為voteilabel的value,進行加一操作

# sortedclasscount = sorted(classcount.iteritems(),

# key=operator.itemgetter(1), reverse=true)

# 原文**如上,在python3環境下報錯,改為如下**可執行,具體含義見下文

sortedclasscount =

sorted

(classcount.items(),

key=operator.itemgetter(1)

, reverse=

true

)# true為降序

return sortedclasscount[0]

[0]if __name__ ==

"__main__"

: group, labels = createdataset(

) a = classify0([0

,0], group, labels,3)

print

(a)

因為有的函式不是很熟悉,所以衝浪去搜了一波用法,具體解釋如下:

numpy.tile():把陣列沿各個方向複製,例如上面的**datasetsize為4,可以寫為

diffmat = np.tile(inx,(4

,1))

- dataset

將inx([0,0])沿x軸複製1次,再沿y軸複製4次,得到的結果為

[[0

0][0

0][0

0][0

0]]

最後的diffmat結果是上面的結果和dataset相減的結果,為

[[-

1.-1.1][

-1.1-1

.][0

.0.]

[0.-

0.1]

]

這就是計算歐式距離的第一步,對所有點執行(x0-x1,y0-y1)操作,之後進行平方操作

sqdiffmat = diffmat **

2

numpy.sum():以**為例

sqdistances = sqdiffmat.

sum(axis=

1)

含義是將sqdiffmat[0][j],sqdiffmat[1][j]的對應項相加,即[1,1.21,0,0]+[1.21,1,0,0.01]=[2.21,2.21,0,0.01]

得出的結果是開平方之前的結果,即每個點與**點距離的平方

之後進行開方操作得到歐氏距離

distances = sqdistances **

0.5

sorted()和operator.itemgetter():原文**

sortedclasscount =

sorted

(classcount.items(),

key=operator.itemgetter(1)

, reverse=

true

)

對classcount的每乙個items物件進行降序排序,排序的依據是物件第一域的值

classcount經過計算為[('b', 2), ('a', 1)],意為,距離前三近的店裡面,標籤為b的出現了兩次,為a的出現了一次,items為('b', 2)('a', 1),按照第一域排序即按照2和1進行排序。

numpy.tile():

numpy sum axis詳解:

numpy中argsort函式用法:

python 字典(dictionary) get()方法:

python中的sorted函式以及operator.itemgetter函式:

機器學習實戰筆記(一)

機器學習是通過程式設計讓計算機從資料中進行學習的科學 和藝術 機器學習是讓計算機具有學習的能力,無需進行明確程式設計。亞瑟 薩繆爾,1959 電腦程式利用經驗e學習任務t,效能是p,如果針對任務t的效能p隨著經驗e不斷增長,則稱為機器學習 湯姆 公尺切爾,1997 需要進行大量手工調整或者需要擁有長...

《機器學習實戰》學習筆記

很久沒寫過部落格了,一重開就給自己挖了這麼乙個大坑 最近一段時間看了 機器學習實戰 這本書,感覺寫得不錯,認真看了看。關於這本書的書評及購買事宜請移步豆瓣 京東 亞馬遜等 這裡不多說。不過有一點,感覺這本書有個很好的地方是給出了各個演算法的python實現 和講解,要求不高的話可以拿來用了 懶 在這...

《機器學習實戰》學習筆記

目錄 第2章 k 近鄰演算法 第3章 決策樹 第4章 基於概率論的分類方法 樸素貝葉斯 第5章 logistic回歸 第7章 利用adaboost元演算法提高分類效能 第8章 數值型資料 回歸 1.python console匯入knn.py檔案 import knn1.reload的使用方法 fr...