K-鄰近算法

導入的包

coding=UTF8
from numpy import *
import operator
from os import listdir
import matplotlib
import matplotlib.pyplot as plt

判斷數據是哪一個類型

def classify0(inX, dataset, labels, k):

dataSetSize = dataset.shape[0]
diffMat = tile(inX, (dataSetSize, 1)) - dataset
sqDiffMat = diffMat ** 2
sqDistance = sqDiffMat.sum(axis=1)
distance = sqDistance ** 0.5
sortedDistIndicies = distance.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]

數據預處理

def file2matrix(filename):
fr = open(filename)
arrayOLines=fr.readlines()
numberOfLines = len(arrayOLines)         #獲取 n=樣本的行數,1000個樣本
returnMat = zeros((numberOfLines,4))        #創建一個2維矩陣用於存放訓練樣本數據,一共有n行,每一行存放3個數據
classLabelVector = []                       #創建一個1維數組用於存放訓練樣本標籤。
classLabelVectortou = []
index = 0
for line in arrayOLines:
    # 把回車符號給去掉,頭尾空白去掉
    line = line.strip()
    # 把每一行數據用\t分割
    listFromLine = line.split('\t')
    # 把分割好的數據放至數據集,其中index是該樣本數據的下標,就是放到第幾行
    returnMat[index,:] = listFromLine[1:5]
    # 把該樣本對應的標籤放至標籤集,順序與樣本集對應。
    classLabelVector.append(int(listFromLine[-1]))#每行的最後一個下標位置數據是類型
    classLabelVectortou.append(int(listFromLine[0]))
    index += 1
return returnMat,classLabelVector

測試數據預處理

def file3matrix(filename):
"""
從文件中讀入訓練數據,並存儲爲矩陣
"""
fr = open(filename)
arrayOLines=fr.readlines()
numberOfLines = len(arrayOLines)         #獲取 n=樣本的行數,1000個樣本
returnMat = zeros((numberOfLines,4))        #創建一個2維矩陣用於存放訓練樣本數據,一共有n行,每一行存放3個數據
classLabelVector = []                       #創建一個1維數組用於存放訓練樣本標籤。
classLabelVectortou = []
index = 0
for line in arrayOLines:
    # 把回車符號給去掉,頭尾空白去掉
    line = line.strip()
    # 把每一行數據用\t分割
    listFromLine = line.split('\t')
    # 把分割好的數據放至數據集,其中index是該樣本數據的下標,就是放到第幾行
    returnMat[index,:] = listFromLine[1:5]
    # 把該樣本對應的標籤放至標籤集,順序與樣本集對應。
    classLabelVector.append(int(listFromLine[-1]))#每行的最後一個下標位置數據是類型
    classLabelVectortou.append(int(listFromLine[0]))
    index += 1
return returnMat

數據顯示圖像

def pictureshow(datingDataMat):
datingDataMat1=[]
datingDataMat1=datingDataMat
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:,1], datingDataMat[:,2],30.0*array(datingLabels), 15.0*array(datingLabels))
ax.axis([-2,25,-0.2,2.0])
plt.xlabel('Percentage of Time Spent Playing Video Games')
plt.ylabel('Liters of Ice Cream Consumed Per Week')
plt.show()

數據歸一化

def autoNorm(dataSet):
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
ranges = maxVals - minVals
normDataSet = zeros(shape(dataSet))
m = dataSet.shape[0]
normDataSet = dataSet - tile(minVals, (m,1))
normDataSet = normDataSet/tile(ranges, (m,1))
return normDataSet, ranges, minVals

計算錯誤率

def datingClassTest():
# 將數據集中10%的數據留作測試用,其餘的90%用於訓練
hoRatio = 0.8
datingDataMat,datingLabels = file2matrix('D:\MachingLearning\KNN\machingKNN1.0\draining1.txt')       #load data setfrom file
print datingDataMat
normMat, ranges, minVals = autoNorm(datingDataMat)
m = normMat.shape[0]
numTestVecs = int(m*hoRatio)
errorCount = 0.0
#print normMat[0],normMat[0,:],normMat[0,:1],normMat[0,:2]
#normMat[0]代表list中的下標0,normMat[0,:]代表嵌套list的外部下標0,normMat[0,:1]代表嵌套list下標0的同時,截取下標1前面的數
for i in range(numTestVecs):
    classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],4)
    #print "the classifier came back with: %d, the real answer is: %d, result is :%s" % (classifierResult, datingLabels[i],classifierResult==datingLabels[i])
    if (classifierResult != datingLabels[i]):
        errorCount += 1.0
print numTestVecs
print "the total error rate is: %f" % (1-errorCount/float(numTestVecs))
print errorCount

判斷輸入數據

def classifyPerson():
a=0
b=0
c=0
resultList=['not','pai','pay']
datingDataMat,datingLabels=file2matrix('D:\MachingLearning\KNN\machingKNN1.0\draining1.txt')
print datingDataMat
normMat,ranges,minVals=autoNorm(datingDataMat)
datingDataMat1=file3matrix('D:\MachingLearning\KNN\machingKNN1.0\dest1.txt')
normMat1,ranges1,minVals1=autoNorm(datingDataMat1)
print len(normMat1)
for i in range(len(normMat1)):
    classifierResult=classify0((normMat1[i]-minVals)/ranges,normMat,datingLabels,5)
    #print "result:",resultList[classifierResult-1]
    if resultList[classifierResult-1]=='pai':
        a+=1
    if resultList[classifierResult-1]=='pay':
        b+=1
    if resultList[classifierResult-1]=='not':
        c+=1
print 'pai=',a
print 'pay=',b
print 'not=',c
#return resultList[classifierResult-1]
return a

函數調用

if __name__=="__main__":
datingDataMat,datingLabels=file2matrix('D:\MachingLearning\KNN\machingKNN1.0\draining.txt')
pictureshow(datingDataMat)
#autoNorm(datingDataMat)
#datingClassTest()
classifyPerson()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章