1. 程式人生 > >大話機器學習(二)--KNN

大話機器學習(二)--KNN

一、有監督與無監督學習

總體來說講呢,機器學習又兩種學習方法,一個叫有監督學習(Supervised),一種叫無監督學習(Unsupervised)。顧名思義啊,一個就是有人看著,一個就是沒有。在機器學習中呢,就是有監督學習,會先告訴學習演算法,我有200本書,這些是我喜歡的,那些是我覺得一般的,那些是我討厭的。好,現在又給你一本書,請你告訴我,我對這本書的態度。

這樣的學習過程就是有監督的。

無監督的就是直接給你200本書,告訴你,給我分成幾類吧。分好後,你在給他一本書,問他,這本書和哪些是同一類?

大致就是這樣的意思。

二、KNN

今天,我們就來看一個很簡單的監督學習演算法,KNN(k-Nearest Neighbor)。基本步驟就是這樣:

1.把書分成n類,告訴演算法每一本書分別屬於哪一類

2.給演算法一本新書

3.演算法計算這本書和之前200本書的距離

4.取k個與這本書距離最近的已知類別的書。k本書中,哪種類別的書最多,那麼演算法就認為這本新書屬於哪種類別。換句話說,這些已知類別的書在投票。

可見,這本書與200本書的距離計算是一個很重要的點。投票的方法也是很重要的點。上訴只是講了最簡單的投票方法而已,可以按照不同的方法計算權重。KNN更加纖細的一些概要可以看我轉載的這一文章: http://blog.csdn.net/qtlyx/article/details/50618659

三、sklearn機器學習方法函式概要

咱們大概瞭解這一演算法之後呢,看一下sklearn的函式。 從剛才的講述中可以看出,演算法的輸入是樣本(samples),就是我們說的兩百本書;以及這些書對應的標籤(labels)。把這兩個告訴演算法之後,就是學習完成了。 sklearn裡面的機器學習方法函式有如下基本方法

1.設定。

這就是設定一個方法的引數,比如KNN演算法,就可以設定距離計算的方法,歐式距離啊、明科夫斯基距離之類的;還有k的取值,我們要最鄰近的10個樣本還是15個;還有投票權重的計算;等等等等。 一般設定語句是這樣的: 設定完成可用的機器學習方法 = 機器學習方法名(引數1,引數2,引數3.。。。。。。)

2.訓練

設定好引數,就是訓練,有監督的放樣本和標籤,無監督的,只有樣本。通常設定語句是這樣的:

設定完成可用的機器學習方法.fit(訓練樣本,[標籤])

3.預測。

訓練完之後就可以用這個東西來預測新的輸入的類別了。通常設定語句是這樣的:

設定完成可用的機器學習方法.predict(新樣本)

四、sklearn的KNN演算法示例

1.資料 我們使用鳶尾花資料集,這是sklearn自帶的資料集,也是資料探勘領域裡面相當有名的資料集。每一條記錄都是一類鳶尾花,記錄的內容是鳶尾花的屬性,比如多高啊,花的直徑啊這類。

資料是這樣的:

這是資料集的內容,共150條,這裡只截取了部分


這是對應的150個類別。

2.提取訓練資料集和測試資料集

i = 0
list = []

for i in range(0,150):
    if i%3 != 0 :
        list.append(i)
上面的程式碼產生了一個0到149,不能被三整除的數,就是說,我們從150個數據中選出三分之一。、
samples= iris.data[list]
lab = iris.target[list]
如此就提取出來了。

3.設定

n_neighbors = 15
clf = neighbors.KNeighborsClassifier(n_neighbors, weights='uniform')
如此,設定了演算法的引數,k取15,投票權重為最簡單的,大家權重都一樣。

4.訓練

clf.fit(samples,lab)
5測試
clf.predict(iris.data[3])
clf.predict(iris.data[6])
clf.predict(iris.data[147])

將這資料和iris.target對應下表比較發現時一樣的。
如:

五.完整程式碼

# -*- coding: utf-8 -*-
"""
Created on Mon Feb 01 16:27:13 2016

@author: Luyixiao
"""
# -*- coding: utf-8 -*-


import numpy as np
from sklearn import neighbors, datasets

n_neighbors = 15
iris = datasets.load_iris()

i = 0
list = []
for i in range(0,150):
    if i%3 != 0 :
        list.append(i)
        
samples= iris.data[list]
lab = iris.target[list]

n_neighbors = 15
clf = neighbors.KNeighborsClassifier(n_neighbors, weights='uniform')