def file2matrix(filename): """,下面我们就来说一说关于knn算法原理与实现步骤?我们一起去了解并探讨一下这个问题吧!

knn算法原理与实现步骤(KNN算法最新研究改进)

knn算法原理与实现步骤

def file2matrix(filename):

"""

从文件中读入训练数据,并存储为矩阵

"""

fr = open(filename)

arrayOlines = fr.readlines()

numberOfLines = len(arrayOlines) #获取 n=样本的行数

returnMat = zeros((numberOfLines,3)) #创建一个2维矩阵用于存放训练样本数据,一共有n行,每一行存放3个数据

classLabelVector = [] #创建一个1维数组用于存放训练样本标签。

index = 0

for line in arrayOlines:

# 把回车符号给去掉

line = line.strip()

# 把每一行数据用\t分割

listFromLine = line.split('\t')

# 把分割好的数据放至数据集,其中index是该样本数据的下标,就是放到第几行

returnMat[index,:] = listFromLine[0:3]

# 把该样本对应的标签放至标签集,顺序与样本集对应。

classLabelVector.append(int(listFromLine[-1]))

index = 1

return returnMat,classLabelVector

def autoNorm(dataSet):

"""

训练数据归一化

"""

# 获取数据集中每一列的最小数值

# 以createDataSet()中的数据为例,group.min(0)=[0,0]

minVals = dataSet.min(0)

# 获取数据集中每一列的最大数值

# group.max(0)=[1, 1.1]

maxVals = dataSet.max(0)

# 最大值与最小的差值

ranges = maxVals - minVals

# 创建一个与dataSet同shape的全0矩阵,用于存放归一化后的数据

normDataSet = zeros(shape(dataSet))

m = dataSet.shape[0]

# 把最小值扩充为与dataSet同shape,然后作差,具体tile请翻看 第三节 代码中的tile

normDataSet = dataSet - tile(minVals, (m,1))

# 把最大最小差值扩充为dataSet同shape,然后作商,是指对应元素进行除法运算,而不是矩阵除法。

# 矩阵除法在numpy中要用linalg.solve(A,B)

normDataSet = normDataSet/tile(ranges, (m,1))

return normDataSet, ranges, minVals

def datingClassTest():

# 将数据集中10%的数据留作测试用,其余的90%用于训练

hoRatio = 0.10

datingDataMat,datingLabels = file2matrix('datingTestSet2.txt') #load data setfrom file

normMat, ranges, minVals = autoNorm(datingDataMat)

m = normMat.shape[0]

numTestVecs = int(m*hoRatio)

errorCount = 0.0

for i in range(numTestVecs):

classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)

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("the total error rate is: %f" % (errorCount/float(numTestVecs)))

print(errorCount)

,