#!/usr/bin/python
# -*- coding: UTF-8 -*-
import numpy as np
from numpy import *
import operator
#添加测试数据
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group,labels
# print createDataSet()
group,labels = createDataSet()
# print group
# print "----------"
# print labels
def knn_classify(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0] #只想读取 dataSet 第一维度长度,使用shape[0]
diffMat = tile(inX, (dataSetSize,1)) - dataSet #将 inX 扩展为 4 行,组成一个4行两列的矩阵,与数据集每行做减
sqDiffMat = diffMat**2 #计算出来上述每个差每个特征距离的平方
sqDistances = sqDiffMat.sum(axis=1) #计算出每个点与点每个特征下的距离之平方和
distances = sqDistances**0.5 #由平方和计算出来两点间的欧氏距离
sortedDistIndicies = distances.argsort() #返回排序后元素在原对象中的下标
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]] # 取回在labels标签集中相应位置的标签
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 # 计算某个类别标签出现的次数,其中get方法表示有
# voteIlabel这个标签出现就在原来的基础上加1,没有就返回一个0值
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) #operator.itemgetter函数
# 获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。operator.itemgetter的形式通过classCount的第一个域排序
return sortedClassCount[0][0]
# print knn_classify([8,0],group,labels,3)
def file2matrix(filename):
fr = open(filename)
numberOfLines = len(fr.readlines()) #get the number of lines in the file
returnMat = zeros((numberOfLines,3)) #prepare matrix to return
classLabelVector = [] #prepare labels return
fr = open(filename)
index = 0
for line in fr.readlines():
line = line.strip()
listFromLine = line.split('\t')
returnMat[index, :] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index += 1
return returnMat,classLabelVector
# subdataSet,
dataSet,dataLabels = file2matrix('datingTestSet2.txt')
# print dataSet,dataLabels
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)) #element wise divide
return normDataSet, ranges, minVals
# normMat,ranges,minvals = autoNorm(dataSet)
# print normMat
# print ranges
# print minvals
# hoRatio = 0.2 #hold out 10%
# datingDataMat,datingLabels = file2matrix('datingTestSet2.txt') #load data setfrom file
# print datingDataMat
# print datingLabels
# normMat, ranges, minVals = autoNorm(datingDataMat)
# m = normMat.shape[0]
# numTestVecs = int(m*hoRatio)
# errorCount = 0.0
# for i in range(numTestVecs):
# classifierResult = knn_classify(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
# print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i])
# if (classifierResult != datingLabels[i]):
# errorCount += 1.0
# print "the total error rate is: %f" % (errorCount/float(numTestVecs))
# print errorCount
# print datingClassTest()
resultlist = ['not at all','in small doses','in large doses']
percentTats = float(raw_input("times play video games ?:" ))
miles = float(raw_input("frequent per year ?:" ))
creame = float(raw_input("ice creame per year ?:" ))
datingDataMat,datingLabels = file2matrix('datingTestSet2.txt') #load data setfrom file
normMat, ranges, minVals = autoNorm(datingDataMat)
inArr = array([miles,percentTats,creame])
classifierResult = knn_classify((inArr-minVals)/ranges,normMat,datingLabels,3)
# -*- coding: UTF-8 -*-
import numpy as np
from numpy import *
import operator
#添加测试数据
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group,labels
# print createDataSet()
group,labels = createDataSet()
# print group
# print "----------"
# print labels
def knn_classify(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0] #只想读取 dataSet 第一维度长度,使用shape[0]
diffMat = tile(inX, (dataSetSize,1)) - dataSet #将 inX 扩展为 4 行,组成一个4行两列的矩阵,与数据集每行做减
sqDiffMat = diffMat**2 #计算出来上述每个差每个特征距离的平方
sqDistances = sqDiffMat.sum(axis=1) #计算出每个点与点每个特征下的距离之平方和
distances = sqDistances**0.5 #由平方和计算出来两点间的欧氏距离
sortedDistIndicies = distances.argsort() #返回排序后元素在原对象中的下标
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]] # 取回在labels标签集中相应位置的标签
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 # 计算某个类别标签出现的次数,其中get方法表示有
# voteIlabel这个标签出现就在原来的基础上加1,没有就返回一个0值
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) #operator.itemgetter函数
# 获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。operator.itemgetter的形式通过classCount的第一个域排序
return sortedClassCount[0][0]
# print knn_classify([8,0],group,labels,3)
def file2matrix(filename):
fr = open(filename)
numberOfLines = len(fr.readlines()) #get the number of lines in the file
returnMat = zeros((numberOfLines,3)) #prepare matrix to return
classLabelVector = [] #prepare labels return
fr = open(filename)
index = 0
for line in fr.readlines():
line = line.strip()
listFromLine = line.split('\t')
returnMat[index, :] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index += 1
return returnMat,classLabelVector
# subdataSet,
dataSet,dataLabels = file2matrix('datingTestSet2.txt')
# print dataSet,dataLabels
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)) #element wise divide
return normDataSet, ranges, minVals
# normMat,ranges,minvals = autoNorm(dataSet)
# print normMat
# print ranges
# print minvals
# hoRatio = 0.2 #hold out 10%
# datingDataMat,datingLabels = file2matrix('datingTestSet2.txt') #load data setfrom file
# print datingDataMat
# print datingLabels
# normMat, ranges, minVals = autoNorm(datingDataMat)
# m = normMat.shape[0]
# numTestVecs = int(m*hoRatio)
# errorCount = 0.0
# for i in range(numTestVecs):
# classifierResult = knn_classify(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
# print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i])
# if (classifierResult != datingLabels[i]):
# errorCount += 1.0
# print "the total error rate is: %f" % (errorCount/float(numTestVecs))
# print errorCount
# print datingClassTest()
resultlist = ['not at all','in small doses','in large doses']
percentTats = float(raw_input("times play video games ?:" ))
miles = float(raw_input("frequent per year ?:" ))
creame = float(raw_input("ice creame per year ?:" ))
datingDataMat,datingLabels = file2matrix('datingTestSet2.txt') #load data setfrom file
normMat, ranges, minVals = autoNorm(datingDataMat)
inArr = array([miles,percentTats,creame])
classifierResult = knn_classify((inArr-minVals)/ranges,normMat,datingLabels,3)
print resultlist[classifierResult-1]
代码和数据来源 《机器学习实战》