一、实验目的
(1)理解分类的基本概念。
(2)理解最近邻分类器的工作原理。
二、实验内容
1、代码题
训练数据见diabets_Tr.mat,测试数据见diabets_Tst.mat。编程实现K最近邻算法。函数为:[class]=KNN_Classify_E(trainingSamples, trainingLabels, testingSample,k)。测试代码如下:
import numpy as np
from KNN_Classify_E import *
def classify_data(Tr_file_path,Tst_file_path):
Tr = np.loadtxt(Tr_file_path, delimiter=",", dtype="double")
Tst = np.loadtxt(Tst_file_path, delimiter=",", dtype="double")
Tr=np.mat(Tr)
Tst=np.mat(Tst)
trAttr = Tr[:,:-1]
trLabels =Tr[:,-1]
tstAttr = Tst[:,:-1]
tstLabels =Tst[:,-1]
#trAttr=normalize(trAttr)
#tstAttr=normalize(tstAttr)
k=3
predictlabel=np.zeros((tstLabels.size,1))
for i in range(tstLabels.size):
predictlabel[i,0] =KNN_Classify_E(trAttr, trLabels ,tstAttr[i,:] ,k)
predict_right=predictlabel[predictlabel==tstLabels]
acc=predict_right.size/predictlabel.size
return acc
if __name__ == "__main__":
Tr_file_path='../0data/diabets_Tr.csv'
Tst_file_path='../0data/diabets_Tst.csv'
acc=classify_data(Tr_file_path,Tst_file_path)
print(acc)
函数KNN_Classify_E:
(将执行正确的python代码粘贴在此处,核心代码要求有注释)
//规范化代码
def normalize(Samples):
meanValue=np.mean(Samples,axis=0)
stuValue=np.std(Samples,axis=0)
Samples2=(Samples-meanValue)/stuValue
return Samples2
//详细代码
import numpy as np
import math
def KNN_Classify_E(traininSamples,trainingLables,testingSample,k):
M=traininSamples.shape[0]
N=traininSamples.shape[1]
# 初始化数组,用来存储训练样本与测试样本的距离
Distance =np.zeros((M,1))
# 计算每个训练样本与测试样本的距离
for i in range(M):
training=traininSamples[i,:]
Distance[i]=dist_E(training,testingSample)
# 对数组Distance进行升序
ind=np.argsort(Distance,axis=0)
# 将排序前k个距离对应的序号赋值给labs
labs=trainingLables[ind[:k]]
labs =np.array(labs)
# 使用unique函数去除重复元素
ALL_labs=np.unique(labs)
# 不重复元素的个数
LabNum=ALL_labs.size;
Vote=np.zeros((LabNum,1))
# 查找最近的k个类别labs中,等于all_labs[i]的有几个
for i in range(LabNum):
vect=labs[labs==ALL_labs[i]]
Vote[i]=vect.size
# 求最大索引
ind =Vote.argmax(0)
c=ALL_labs[ind]
return c
def dist_E(vect1,vect2):
dist=-1
if(vect1.size!=vect2.size):
print('长度不一致')
else:
t=np.multiply((vect1-vect2),(vect1-vect2))
dist=math.sqrt(t.sum())
return dist
做生活的高手,每天进步一点点!