国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
機器學(xué)習(xí)(一)

     最近在看《機器學(xué)習(xí)實戰(zhàn)》這本書,因為自己本身很想深入的了解機器學(xué)習(xí)算法,加之想學(xué)python,就在朋友的推薦之下選擇了這本書進行學(xué)習(xí)。 

一 . K-近鄰算法(KNN)概述 

    最簡單最初級的分類器是將全部的訓(xùn)練數(shù)據(jù)所對應(yīng)的類別都記錄下來,當測試對象的屬性和某個訓(xùn)練對象的屬性完全匹配時,便可以對其進行分類。但是怎么可能所有測試對象都會找到與之完全匹配的訓(xùn)練對象呢,其次就是存在一個測試對象同時與多個訓(xùn)練對象匹配,導(dǎo)致一個訓(xùn)練對象被分到了多個類的問題,基于這些問題呢,就產(chǎn)生了KNN。

     KNN是通過測量不同特征值之間的距離進行分類。它的的思路是:如果一個樣本在特征空間中的k個最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個類別,則該樣本也屬于這個類別。K通常是不大于20的整數(shù)。KNN算法中,所選擇的鄰居都是已經(jīng)正確分類的對象。該方法在定類決策上只依據(jù)最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。

     下面通過一個簡單的例子說明一下:如下圖,綠色圓要被決定賦予哪個類,是紅色三角形還是藍色四方形?如果K=3,由于紅色三角形所占比例為2/3,綠色圓將被賦予紅色三角形那個類,如果K=5,由于藍色四方形比例為3/5,因此綠色圓被賦予藍色四方形類。

 

由此也說明了KNN算法的結(jié)果很大程度取決于K的選擇。

     在KNN中,通過計算對象間距離來作為各個對象之間的非相似性指標,避免了對象之間的匹配問題,在這里距離一般使用歐氏距離或曼哈頓距離:

                      

同時,KNN通過依據(jù)k個對象中占優(yōu)的類別進行決策,而不是單一的對象類別決策。這兩點就是KNN算法的優(yōu)勢。

   接下來對KNN算法的思想總結(jié)一下:就是在訓(xùn)練集中數(shù)據(jù)和標簽已知的情況下,輸入測試數(shù)據(jù),將測試數(shù)據(jù)的特征與訓(xùn)練集中對應(yīng)的特征進行相互比較,找到訓(xùn)練集中與之最為相似的前K個數(shù)據(jù),則該測試數(shù)據(jù)對應(yīng)的類別就是K個數(shù)據(jù)中出現(xiàn)次數(shù)最多的那個分類,其算法的描述為:

1)計算測試數(shù)據(jù)與各個訓(xùn)練數(shù)據(jù)之間的距離;

2)按照距離的遞增關(guān)系進行排序;

3)選取距離最小的K個點;

4)確定前K個點所在類別的出現(xiàn)頻率;

5)返回前K個點中出現(xiàn)頻率最高的類別作為測試數(shù)據(jù)的預(yù)測分類。

 

二 .python實現(xiàn)

首先呢,需要說明的是我用的是python3.4.3,里面有一些用法與2.7還是有些出入。

建立一個KNN.py文件對算法的可行性進行驗證,如下:

#coding:utf-8from numpy import *import operator##給出訓(xùn)練數(shù)據(jù)以及對應(yīng)的類別def createDataSet():    group = array([[1.0,2.0],[1.2,0.1],[0.1,1.4],[0.3,3.5]])    labels = ['A','A','B','B']    return group,labels###通過KNN進行分類def classify(input,dataSe t,label,k):    dataSize = dataSet.shape[0]    ####計算歐式距離    diff = tile(input,(dataSize,1)) - dataSet    sqdiff = diff ** 2    squareDist = sum(sqdiff,axis = 1)###行向量分別相加,從而得到新的一個行向量    dist = squareDist ** 0.5        ##對距離進行排序    sortedDistIndex = argsort(dist)##argsort()根據(jù)元素的值從大到小對元素進行排序,返回下標    classCount={}    for i in range(k):        voteLabel = label[sortedDistIndex[i]]        ###對選取的K個樣本所屬的類別個數(shù)進行統(tǒng)計        classCount[voteLabel] = classCount.get(voteLabel,0) + 1    ###選取出現(xiàn)的類別次數(shù)最多的類別    maxCount = 0    for key,value in classCount.items():        if value > maxCount:            maxCount = value            classes = key    return classes    

接下來,在命令行窗口輸入如下代碼:

#-*-coding:utf-8 -*-import syssys.path.append("...文件路徑...")import KNNfrom numpy import *dataSet,labels = KNN.createDataSet()input = array([1.1,0.3])K = 3output = KNN.classify(input,dataSet,labels,K)print("測試數(shù)據(jù)為:",input,"分類結(jié)果為:",output)

回車之后的結(jié)果為:

測試數(shù)據(jù)為: [ 1.1  0.3] 分類為: A

答案符合我們的預(yù)期,要證明算法的準確性,勢必還需要通過處理復(fù)雜問題進行驗證,之后另行說明。

 

這是第一次用python編的一個小程序,勢必會遇到各種問題,在此次編程調(diào)試過程中遇到了如下問題:

 1 導(dǎo)入.py文件路徑有問題,因此需要在最開始加如下代碼:

  •   import sys

  sys.path.append("文件路徑"),這樣就不會存在路徑有誤的問題了;

   2 在python提示代碼存在問題時,一定要及時改正,改正之后保存之后再執(zhí)行命令行,這一點跟MATLAB是不一樣的,所以在python中最好是敲代碼的同時在命令行中一段一段的驗證;

 3 在調(diào)用文件時函數(shù)名一定要寫正確,否則會出現(xiàn):'module' object has no attribute 'creatDataSet';

 4 'int' object has no attribute 'kclassify',這個問題出現(xiàn)的原因是之前我講文件保存名為k.py,在執(zhí)行

output = K.classify(input,dataSet,labels,K)這一句就會出錯。根據(jù)函數(shù)式編程的思想,每個函數(shù)都可以看為是一個變量而將K賦值后,調(diào)用k.py時就會出現(xiàn)問題。


三 MATLAB實現(xiàn)
之前一直在用MATLAB做聚類算法的一些優(yōu)化,其次就是數(shù)模的一些常用算法,對于別的算法,還真是沒有上手編過,基礎(chǔ)還在,思想還在,當然要動手編一下,也是不希望在學(xué)python的同時對MATLAB逐漸陌生吧,走走停停,停很重要。
首先,建立KNN.m文件,如下:
%% KNNclear allclc%% datatrainData = [1.0,2.0;1.2,0.1;0.1,1.4;0.3,3.5];trainClass = [1,1,2,2];testData = [0.5,2.3];k = 3;%% distancerow = size(trainData,1);col = size(trainData,2);test = repmat(testData,row,1);dis = zeros(1,row);for i = 1:row    diff = 0;    for j = 1:col        diff = diff + (test(i,j) - trainData(i,j)).^2;    end    dis(1,i) = diff.^0.5;end%% sortjointDis = [dis;trainClass];sortDis= sortrows(jointDis');sortDisClass = sortDis';%% findclass = sort(2:1:k);member = unique(class);num = size(member);max = 0;for i = 1:num    count = find(class == member(i));    if count > max        max = count;        label = member(i);    endenddisp('最終的分類結(jié)果為:');fprintf('%d\n',label) 

運行之后的結(jié)果是,最終的分類結(jié)果為:2。和預(yù)期結(jié)果一樣。

總而言之,用MATLAB的時間相對長點,自然也就得心應(yīng)手點,不過還是希望早點能將python運用自如吧!

 

三 實戰(zhàn)

 

     之前,對KNN進行了一個簡單的驗證,今天我們使用KNN改進約會網(wǎng)站的效果,個人理解,這個問題也可以轉(zhuǎn)化為其它的比如各個網(wǎng)站迎合客戶的喜好所作出的推薦之類的,當然,今天的這個例子功能也實在有限。

 

     在這里根據(jù)一個人收集的約會數(shù)據(jù),根據(jù)主要的樣本特征以及得到的分類,對一些未知類別的數(shù)據(jù)進行分類,大致就是這樣。

 

     我使用的是python 3.4.3,首先建立一個文件,例如date.py,具體的代碼如下:

 

#coding:utf-8from numpy import *import operatorfrom collections import Counterimport matplotlibimport matplotlib.pyplot as plt###導(dǎo)入特征數(shù)據(jù)def file2matrix(filename):    fr = open(filename)    contain = fr.readlines()###讀取文件的所有內(nèi)容    count = len(contain)    returnMat = zeros((count,3))    classLabelVector = []    index = 0    for line in contain:        line = line.strip() ###截取所有的回車字符        listFromLine = line.split('\t')        returnMat[index,:] = listFromLine[0:3]###選取前三個元素,存儲在特征矩陣中        classLabelVector.append(listFromLine[-1])###將列表的最后一列存儲到向量classLabelVector中        index += 1        ##將列表的最后一列由字符串轉(zhuǎn)化為數(shù)字,便于以后的計算    dictClassLabel = Counter(classLabelVector)    classLabel = []    kind = list(dictClassLabel)    for item in classLabelVector:        if item == kind[0]:            item = 1        elif item == kind[1]:            item = 2        else:            item = 3        classLabel.append(item)    return returnMat,classLabel#####將文本中的數(shù)據(jù)導(dǎo)入到列表##繪圖(可以直觀的表示出各特征對分類結(jié)果的影響程度)datingDataMat,datingLabels = file2matrix('D:\python\Mechine learing in Action\KNN\datingTestSet.txt')fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(datingDataMat[:,0],datingDataMat[:,1],15.0*array(datingLabels),15.0*array(datingLabels))plt.show()## 歸一化數(shù)據(jù),保證特征等權(quán)重def autoNorm(dataSet):    minVals = dataSet.min(0)    maxVals = dataSet.max(0)    ranges = maxVals - minVals    normDataSet = zeros(shape(dataSet))##建立與dataSet結(jié)構(gòu)一樣的矩陣    m = dataSet.shape[0]    for i in range(1,m):        normDataSet[i,:] = (dataSet[i,:] - minVals) / ranges    return normDataSet,ranges,minVals##KNN算法def classify(input,dataSet,label,k):    dataSize = dataSet.shape[0]    ####計算歐式距離    diff = tile(input,(dataSize,1)) - dataSet    sqdiff = diff ** 2    squareDist = sum(sqdiff,axis = 1)###行向量分別相加,從而得到新的一個行向量    dist = squareDist ** 0.5        ##對距離進行排序    sortedDistIndex = argsort(dist)##argsort()根據(jù)元素的值從大到小對元素進行排序,返回下標    classCount={}    for i in range(k):        voteLabel = label[sortedDistIndex[i]]        ###對選取的K個樣本所屬的類別個數(shù)進行統(tǒng)計        classCount[voteLabel] = classCount.get(voteLabel,0) + 1    ###選取出現(xiàn)的類別次數(shù)最多的類別    maxCount = 0    for key,value in classCount.items():        if value > maxCount:            maxCount = value            classes = key    return classes##測試(選取10%測試)def datingTest():    rate = 0.10    datingDataMat,datingLabels = file2matrix('D:\python\Mechine learing in Action\KNN\datingTestSet.txt')    normMat,ranges,minVals = autoNorm(datingDataMat)    m = normMat.shape[0]    testNum = int(m * rate)    errorCount = 0.0    for i in range(1,testNum):        classifyResult = classify(normMat[i,:],normMat[testNum:m,:],datingLabels[testNum:m],3)        print("分類后的結(jié)果為:,", classifyResult)        print("原結(jié)果為:",datingLabels[i])        if(classifyResult != datingLabels[i]):                                  errorCount += 1.0    print("誤分率為:",(errorCount/float(testNum)))                                  ###預(yù)測函數(shù)def classifyPerson():    resultList = ['一點也不喜歡','有一丟丟喜歡','灰常喜歡']    percentTats = float(input("玩視頻所占的時間比?"))    miles = float(input("每年獲得的飛行常客里程數(shù)?"))    iceCream = float(input("每周所消費的冰淇淋公升數(shù)?"))    datingDataMat,datingLabels = file2matrix('D:\python\Mechine learing in Action\KNN\datingTestSet2.txt')    normMat,ranges,minVals = autoNorm(datingDataMat)    inArr = array([miles,percentTats,iceCream])    classifierResult = classify((inArr-minVals)/ranges,normMat,datingLabels,3)    print("你對這個人的喜歡程度:",resultList[classifierResult - 1])

 

新建test.py文件了解程序的運行結(jié)果,代碼:

 

#coding:utf-8from numpy import *import operatorfrom collections import Counterimport matplotlibimport matplotlib.pyplot as pltimport syssys.path.append("D:\python\Mechine learing in Action\KNN")import datedate.classifyPerson()

 

運行結(jié)果如下圖:

 

 

這樣就算是成功了吧,當然,在這其中也遇到了很多的問題,我看的《機器學(xué)習(xí)實戰(zhàn)》這本書主要還是針對于python2.7的,理所應(yīng)當?shù)奈矣龅搅瞬簧賳栴}。有在學(xué)習(xí)這本書的朋友咱們可以交流下哈~

 

 

好困了,想著早點寫完這篇,也就吃完飯沒睡覺,完工了!

還希望大家能多提寶貴意見~

 

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
機器學(xué)習(xí)實戰(zhàn)之KNN算法
Python模塊以及導(dǎo)入出現(xiàn)ImportError: No module named ''''xxx''''的問題
python模塊以及導(dǎo)入出現(xiàn)ImportError: No module named 'xxx'問題...
[Python圖像處理] 三十九.Python圖像分類萬字詳解(貝葉斯圖像分類、KNN圖像分類、DN...
10分鐘掌握Python-機器學(xué)習(xí)小項目
KNN算法的python實現(xiàn)--基于scikit_learn
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服