機器學習實戰(筆記)------------KNN算法

1.KNN算法

KNN算法即K-臨近算法,采用測量不同特征值之間的距離的方法進行分類。

以二維情況舉例:

? ? ? ? 假設一條樣本含有兩個特征。將這兩種特征進行數值化,我們就可以假設這兩種特種分別為二維坐標系中的橫軸和縱軸,將一個樣本以點的形式表示在坐標系中。這樣,兩個樣本直接變產生了空間距離,假設兩點之間越接近越可能屬于同一類的樣本。如果我們有一個待分類數據,我們計算該點與樣本庫中的所有點的距離,取前K個距離最近的點,以這K個中出現次數最多的分類作為待分類樣本的分類。這樣就是KNN算法。

優點:精度高,對異常值不敏感,無數據輸入假定
缺點:時間、空間復雜度太大(比如每一次分類都需要計算所有樣本點與測試點的距離)

2.KNN算法的Python實現

import operator
from os import listdirimport matplotlib
import matplotlib.pyplot as plt
from numpy import array, shape, tile, zeros#分類方法
#inx 待分類向量
#dataSet 測試數據
#labels 測試數據標簽
#k 取前k個作為樣本
def classify(inX,dataSet,labels,k):dataSetSize=dataSet.shape[0]diffMat=tile(inX,(dataSetSize,1))-dataSet #tile方法利用輸入數組進行擴充sqDiffMat=diffMat**2sqDistance=sqDiffMat.sum(axis=1)distance=sqDistance**0.5index=distance.argsort() #返回按從小到大的順序排序后的元素下標classCount={}for i in range(k):lable=labels[index[i]]classCount[lable]=classCount.get(lable,0)+1#在python3中dict.iteritems()被廢棄sortedClasssCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)return sortedClasssCount[0][0]

????代碼傳入的三個參數分別為待分類向量,測試數據,測試數據標簽。代碼使用歐式距離公式計算向量點之間的距離。
\[ d=\sqrt{(xA_0-xB_0)^2-(xA_1-xB_1)^2} \]

  • numpy.tile(A,reps)

    A指待輸入數組,reps則決定A的重復次數

  • sorted(iterable,cmp,key,reverse)

    這里利用了key參數使得使用字典中的value值進行排序

實例1:KNN算法改進約會網站配對效果

背景

假設A在利用約會網站進行約會,她將自己交往過的人分為三類:

  • 不喜歡的人
  • 魅力一般的人
  • 極具魅力的人

A收集這些人的生活記錄,從中提取中三類特征,存儲在文本datingTestSet2中:

  • 每年獲得的飛行常客里程數
  • 玩游戲視頻所耗時間百分比
  • 每周消耗的冰淇淋公升數

利用這三類特征和標簽組成的樣本庫,我們可以在獲得一個人的這三種特征的特征值的情況下,利用KNN算法判斷該人是否會是A喜歡人

讀取數據

我們將數據從文本中讀出,并且以矩陣的形式進行存儲

def file2matrix(filename):fr=open(filename)datalines=fr.readlines()numberoflines=len(datalines)returnMat=zeros((numberoflines,3))classlabelVector=[]index=0for line in datalines:line=line.strip()listfromline=line.split('\t')returnMat[index,:]=listfromline[0:3]classlabelVector.append(int(listfromline[-1]))index=index+1return returnMat,classlabelVector

分析數據

我們可以利用Matplotlib制作原始數據的散點圖,觀察特征

def analydata():a,b=file2matrix('datingTestSet2.txt')#創建一個圖形實例fig=plt.figure()ax=fig.add_subplot(111)#scatter方法創建散點圖#分析圖像可以發現使用第一列和第二列數據特征更加明顯ax.scatter(a[:,0],a[:,1],15.0*array(b),15.0*array(b))plt.show()

畫圖結果:

1203819-20190213213102072-177172113.png

這里以“冰淇淋公斤數”和“玩視頻游戲所耗時間百分比”作為橫縱坐標特征最為明顯

歸一化數據

在數據分析和機器學習中,經常要進行數據歸一化。因為不同的特征值使用不同的量度,上下限不同,使得有的特征產生的差值很大,而有的很小,會影響算法準確性。所以要先對數據預處理,進行數據歸一化處理。
\[ newValue=(oldValue-min)/(max-min) \]

分類器與測試

我們利用KNN算法,以前10%的數據作為待分類數據,后90%的數據作為樣本庫測試數據,進行分類與測試

def datingClassTest():hoRatio=0.10datingDataMat,datingLables=file2matrix('datingTestSet2.txt')normMat=data2normal(datingDataMat)m=normMat.shape[0]numTestVecs=int(hoRatio*m)errorCount=0for i in range(numTestVecs):result=classify(normMat[i,:],normMat[numTestVecs:m,:],datingLables[numTestVecs:m],3)print("the classify come back with: %d,the real answer is: %d"%(result,datingLables[i]))if(result!=datingLables[i]):errorCount+=1.0print("error rate is:%f"%(errorCount/float(numTestVecs)))

測試結果,錯誤率大概在5%左右。
我們可以改變hoRatio和k的值,檢查錯誤率是否發生變化

實例2:手寫識別系統

背景

假設我們有一些手寫數字,以如下形式保存:

00000000000001100000000000000000
00000000000011111100000000000000
00000000000111111111000000000000
00000000011111111111000000000000
00000001111111111111100000000000
00000000111111100011110000000000
00000001111110000001110000000000
00000001111110000001110000000000
00000011111100000001110000000000
00000011111100000001111000000000
00000011111100000000011100000000
00000011111100000000011100000000
00000011111000000000001110000000
00000011111000000000001110000000
00000001111100000000000111000000
00000001111100000000000111000000
00000001111100000000000111000000
00000011111000000000000111000000
00000011111000000000000111000000
00000000111100000000000011100000
00000000111100000000000111100000
00000000111100000000000111100000
00000000111100000000001111100000
00000000011110000000000111110000
00000000011111000000001111100000
00000000011111000000011111100000
00000000011111000000111111000000
00000000011111100011111111000000
00000000000111111111111110000000
00000000000111111111111100000000
00000000000011111111110000000000
00000000000000111110000000000000

這是一個32*32的矩陣,利用0代表背景,1來代表手寫數字
對于這些數據,我們也可以利用KNN算法來識別寫的是0~9中的哪里數字
注:存儲數據的文件,例如:0_0.txt代碼數字0的第一個手寫樣本數據

數據預處理:轉換成測試向量

??數據使用32X32的矩陣形式存儲,為了能夠使用我們實現的KNN分類器,我們必須將其轉化成1X1024的向量形式進行表示,也可以叫做降維,將二維數據轉換成了一維數據

def img2vector(filename):fr=open(filename)returnVect=zeros((1,1024))for i in range(32):linestr=fr.readline()for j in range(32):returnVect[0,i*32+j]=int(linestr[j])return returnVect

使用KNN算法進行分類

??轉換成向量以后,我們就可以使用我們實現的KNN分類器進行分類了

import operator
from os import listdirimport matplotlib
import matplotlib.pyplot as plt
from numpy import array, shape, tile, zerosdef handwritingClassTest():hwlabels=[]traingfilelist=listdir('digits/trainingDigits')m=len(traingfilelist)trainingDataMat=zeros((m,1024))for i in range(m):filenameStr=traingfilelist[i]fileStr=filenameStr.split('.')[0]label=int(fileStr.split('_')[0])hwlabels.append(label)trainingDataMat[i,:]=img2vector('digits/trainingDigits/%s' % filenameStr)errorCount=0.0testfilelist=listdir('digits/testDigits')mTest=len(testfilelist)for i in range(mTest):filenameStr=testfilelist[i]fileStr=filenameStr.split('.')[0]label=int(fileStr.split('_')[0])testVector=img2vector('digits/testDigits/%s' %filenameStr)result=classify(testVector,trainingDataMat,hwlabels,3)print('come back with: %d,the real answer is: %d' % (int(result),label))if(int(result)!=label):errorCount=errorCount+1.0print('total number errors is :%f' % errorCount)print('error rate is :%f'% (errorCount/float(mTest)))
  • os.listdir()

    利用該方法,可以得到指定目錄里面的所有文件名

轉載于:https://www.cnblogs.com/DLKKILL/p/10371928.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387422.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387422.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387422.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

hive的安裝配置

hive只需安裝在一個節點上。 1、將安裝包解壓&#xff0c;cd入conf文件夾下&#xff0c;執行命令cp hive-default.xml hive-site.xml 2、更改hive-site.xml的配置項 </property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql:/…

Java注解Annotation 完成驗證

Java注解Annotation用起來很方便&#xff0c;也越來越流行&#xff0c;由于其簡單、簡練且易于使用等特點&#xff0c;很多開發工具都提供了注解功能&#xff0c;不好的地方就是代碼入侵比較嚴重&#xff0c;所以使用的時候要有一定的選擇性。 這篇文章將利用注解&#xff0c;來…

隱藏馬爾科夫模型HMM

概率圖模型 HMM 先從一個具體的例子入手,看看我們要解決的實際問題.例子引自wiki.https://en.wikipedia.org/wiki/Hidden_Markov_model Consider two friends, Alice and Bob, who live far apart from each other and who talk together daily over the telephone about what …

常用HQL

進入hive客戶端后&#xff1a; 1、建表&#xff1a; create table page_view(viewTime int, userid bigint,page_url string, referrer_url string,ip string comment IP Address of the User)comment This is the page view tablepartitioned by(dt string, country string)r…

阿里云天池 金融風控訓練營Task1 廣東工業站

Task1 賽題理解 一、學習知識點概要 本次學習先是介紹了賽題的背景和概況&#xff0c;題目以金融風控中的個人信貸為背景&#xff0c;給所給的47列特征中&#xff0c;根據貸款申請人的數據信息預測其是否有違約的可能&#xff0c;以此判斷是否通過貸款。隨后介紹了比賽中的評…

如何將.crt的ssl證書文件轉換成.pem格式

如何將.crt的ssl證書文件轉換成.pem格式摘自&#xff1a;https://www.landui.com/help/show-8127 2018-07-04 14:55:41 2158次 準備:有一臺安裝了php的linux操作系統執行下面的openssl命令即可&#xff1a;openssl x509 -in www.xx.com.crt -out www.xx.com.pem轉載于:https://…

SpringMVC學習記錄--Validator驗證分析

一.基于Validator接口的驗證. 首先創建User實例,并加入幾個屬性 ?12345678910111213141516171819202122232425262728293031323334<code class"hljs cs">public class User {private String username;private String password;private String nickname;public …

NTP時間服務器實現Linux時間同步

在linux下&#xff0c;可以通過自帶的NTP(Network Time Protocol)協議通過網絡使自己的系統保持精確的時間。 什么是NTP&#xff1f; NTP是用來使系統和一個時間源保持時間同步的協議。 在自己管理的網絡中建立至少一臺時間服務器來同步本地時間&#xff0c;這樣可以使得在不同…

阿里云天池 Python訓練營Task1:從變量到異常處理

本學習筆記為阿里云天池龍珠計劃Python訓練營的學習內容&#xff0c;學習鏈接為&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicamppython?spm5176.22758685.J_6770933040.1.6f103da1tESyzu 目錄 一、學習知識點概要 二、學習內容 I.變量、運算符與數據類…

python回收機制

目錄 Python的垃圾回收機制引子:一、什么是垃圾回收機制&#xff1f;二、為什么要用垃圾回收機制&#xff1f;三、垃圾回收機制原理分析1、什么是引用計數&#xff1f;2、引用計數擴展閱讀&#xff1f;&#xff08;折疊&#xff09;Python的垃圾回收機制 引子: 我們定義變量會申…

安裝openssl-devel命令

centos&#xff1a; yum install openssl-devel ubuntu&#xff1a; sudo apt-get install openssl sudo apt-get install libssl-dev

阿里云天池 Python訓練營Task2: Python基礎練習:數據結構大匯總 學習筆記

本學習筆記為阿里云天池龍珠計劃Python訓練營的學習內容&#xff0c;學習鏈接為&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicamppython?spm5176.22758685.J_6770933040.1.6f103da1tESyzu 目錄 一、學習知識點概要 二、學習內容 I.列表&#xff08;list…

windows文件與Linux文件互轉

使用命令 unix2dos filename dos2unix filename

1G.小a的排列(C++)

小a的排列&#xff08;C&#xff09; 點擊做題網站鏈接 題目描述 小a有一個長度為n的排列。定義一段區間是"萌"的&#xff0c;當且僅當把區間中各個數排序后相鄰元素的差為1現在他想知道包含數x,y的長度最小的"萌"區間的左右端點 也就是說&#xff0c;我們…

阿里云天池 Python訓練營Task3: Python基礎進階:從函數到高級魔法方法 學習筆記

本學習筆記為阿里云天池龍珠計劃Python訓練營的學習內容&#xff0c;學習鏈接為&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicamppython?spm5176.22758685.J_6770933040.1.6f103da1tESyzu 目錄 一、學習知識點概要 二、學習內容 I.函數 1.定義自己的函…

C# 獲取句柄程序

這個小程序需要用到系統API&#xff0c;也就是需要用到user32中的三個函數。 第一個&#xff1a;WindowFromPoint 返回一個窗口句柄 第二個&#xff1a;GetWindowText 獲取窗口標題 第三個&#xff1a;GetClassName 獲取類名 當然&#xff0c;最重要的一點就是要引用命名空間…

HBase安裝配置

HBase的安裝配置&#xff1a; 4臺主機&#xff1a;hdp0 hdp1 hdp2 hdp3 hdp0 hdp1 跑HMaster hdp2 hdp3 跑HRegionServer 將HBase解壓之后 1、確保安裝ZooKeeper&#xff1b; 2、修改hbase-env.sh export JAVA_HOME/.../jdk export HBASE_MANAGES_ZKfalse //使用外部的…

python cook讀書筆記第2章字符串和文本

使用多個界定符分割字符串 line asdf fjdk; afed, fjek,asdf, fooimport re# line re.split(r[;,\s]\s*,line)# print(line)# [asdf, fjdk, afed, fjek, asdf, foo]"""當你使用 re.split() 函數時候&#xff0c;需要特別注意的是正則表達式中是否包含一個括號…

centos7安裝oracle12c 一

本文 基本參考了下面這篇文章http://blog.csdn.net/gq5251/article/details/42004035 和http://www.linuxidc.com/Linux/2017-08/146528.htm 但是改正了一些錯誤操作系統:CentOS Linux release 7.2.1511 (Core) oracle: oarcle (12.1.0.2.0) - Standard Edition (SE2)幾點要注…

Bigtable的些許重點

分布式數據庫系統 針對于海量數據&#xff0c;可擴展&#xff0c;高吞吐量&#xff0c;低時延 不支持關系模型 通過row和column進行索引&#xff0c;row和column可以是任意字符串 所存儲的數據也是字符串 Bigtable是一個map&#xff0c;value是array of bytes&#xff0c;通…