#-*-coding:utf-8-*-
from numpy import *
import operator
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def file2matrix(filename):
fr=open(filename)
arrayOLines=fr.readlines()#读取文件的所有内容转换成一个行的列表
numberOfLines=len(arrayOLines)
returnMat=zeros((numberOfLines,3))#生成一个numberoflines行3列全是0的矩阵
classLabelVector=[]
index=0
for line in arrayOLines:
line=line.strip()#去除两侧的空格
listFromLine=line.split('\t')#将字符串分割成序列
returnMat[index,:]=listFromLine[0:3]#选取前三个元素,存储在特征矩阵中
classLabelVector.append(int(listFromLine[-1]))#将列表的最后一列存储到向量classLabelVector中
index+=1
return returnMat,classLabelVector
def autoNorm(dataSet):
minVals=dataSet.min(0)#参数0使得函数可以从列中选取最小值
maxVals=dataSet.max(0)
ranges=maxVals-minVals
normDataSet=zeros(shape(dataSet))#创建一个和dataset一样大小的矩阵初始化为0
m=dataSet.shape[0]#返回dataset第一维的长度
normDataSet=dataSet-tile(minVals,(m,1))#tile函数将变量内容复制成同样大小的矩阵
normDataSet=normDataSet/tile(ranges,(m,1))
return normDataSet,ranges,minVals
def classify0(inX, dataSet, labels, k): # #inX是你要输入的要分类的“坐标”,dataSet是上面createDataSet的array,
#就是已经有的,分类过的坐标,label是相应分类的标签,k是KNN,k近邻里面的k
dataSetSize = dataSet.shape[0] #shape函数返回读取矩阵第一维的长度
diffMat = tile(inX, (dataSetSize,1)) - dataSet #前面用tile,把一行inX变成4行一模一样的
#(tile有重复的功能,dataSetSize是重复4遍,
#后面的1保证重复完了是4行,而不是一行里有四个一样的),
#然后再减去dataSet,是为了求两点的距离,先要坐标相减,这个就是坐标相减
sqDiffMat = diffMat**2 #上一行得到了坐标相减,然后这里要(x1-x2)^2,要求乘方
sqDistances = sqDiffMat.sum(axis=1) #axis=1是列相加,这样得到了(x1-x2)^2+(y1-y2)^2
distances = sqDistances**0.5 #开根号,这个之后才是距离
sortedDistIndicies = distances.argsort() #argsort是排序,将元素按照由小到大的顺序返回下标,比如([3,1,2]),它返回的就是([1,2,0])
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #get是取字典里的元素,
#如果之前这个voteIlabel是有的,那么就返回字典里这个voteIlabel里的值,
#如果没有就返回0(后面写的),这行代码的意思就是算离目标点距离最近的k个点的类别,
#这个点是哪个类别哪个类别就加1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
#key=operator.itemgetter(1)的意思是按照字典里的第一个排序,
#{A:1,B:2},要按照第1个(AB是第0个),即‘1’‘2’排序。reverse=True是降序排序
return sortedClassCount[0][0] #返回类别最多的类别
from numpy import *
import operator
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def file2matrix(filename):
fr=open(filename)
arrayOLines=fr.readlines()#读取文件的所有内容转换成一个行的列表
numberOfLines=len(arrayOLines)
returnMat=zeros((numberOfLines,3))#生成一个numberoflines行3列全是0的矩阵
classLabelVector=[]
index=0
for line in arrayOLines:
line=line.strip()#去除两侧的空格
listFromLine=line.split('\t')#将字符串分割成序列
returnMat[index,:]=listFromLine[0:3]#选取前三个元素,存储在特征矩阵中
classLabelVector.append(int(listFromLine[-1]))#将列表的最后一列存储到向量classLabelVector中
index+=1
return returnMat,classLabelVector
def autoNorm(dataSet):
minVals=dataSet.min(0)#参数0使得函数可以从列中选取最小值
maxVals=dataSet.max(0)
ranges=maxVals-minVals
normDataSet=zeros(shape(dataSet))#创建一个和dataset一样大小的矩阵初始化为0
m=dataSet.shape[0]#返回dataset第一维的长度
normDataSet=dataSet-tile(minVals,(m,1))#tile函数将变量内容复制成同样大小的矩阵
normDataSet=normDataSet/tile(ranges,(m,1))
return normDataSet,ranges,minVals
def classify0(inX, dataSet, labels, k): # #inX是你要输入的要分类的“坐标”,dataSet是上面createDataSet的array,
#就是已经有的,分类过的坐标,label是相应分类的标签,k是KNN,k近邻里面的k
dataSetSize = dataSet.shape[0] #shape函数返回读取矩阵第一维的长度
diffMat = tile(inX, (dataSetSize,1)) - dataSet #前面用tile,把一行inX变成4行一模一样的
#(tile有重复的功能,dataSetSize是重复4遍,
#后面的1保证重复完了是4行,而不是一行里有四个一样的),
#然后再减去dataSet,是为了求两点的距离,先要坐标相减,这个就是坐标相减
sqDiffMat = diffMat**2 #上一行得到了坐标相减,然后这里要(x1-x2)^2,要求乘方
sqDistances = sqDiffMat.sum(axis=1) #axis=1是列相加,这样得到了(x1-x2)^2+(y1-y2)^2
distances = sqDistances**0.5 #开根号,这个之后才是距离
sortedDistIndicies = distances.argsort() #argsort是排序,将元素按照由小到大的顺序返回下标,比如([3,1,2]),它返回的就是([1,2,0])
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #get是取字典里的元素,
#如果之前这个voteIlabel是有的,那么就返回字典里这个voteIlabel里的值,
#如果没有就返回0(后面写的),这行代码的意思就是算离目标点距离最近的k个点的类别,
#这个点是哪个类别哪个类别就加1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
#key=operator.itemgetter(1)的意思是按照字典里的第一个排序,
#{A:1,B:2},要按照第1个(AB是第0个),即‘1’‘2’排序。reverse=True是降序排序
return sortedClassCount[0][0] #返回类别最多的类别