标签:knn 分类 label test shape Helen np traindata data
- knn流程
- 数据读取
- 数据归一化
- knn实现
- 数据分析
以数据的前两项特征对数据进行划分得到以下散点图:
- 具体实现
import numpy as np
def read_data(path):
lines=path.readlines()
data=[]
label=[]
for line in lines:
line=line.split()
data.append(list(map(float,line[0:3])))
if line[-1]=='didntLike':
label.append(3)
elif line[-1]=='largeDoses':
label.append(2)
else:
label.append(1)
return np.array(data),np.array(label)
def normalized(data):
mindata=data.min(0)
def standdata(traindata):
meandata0 = np.mean(traindata,axis=0)
stddata0 = np.std(traindata,axis=0)
length = traindata.shape[0]
meandata1 = np.tile(meandata0,(length,1))
stddata1 = np.tile(stddata0,(length,1))
standdata = (traindata-meandata1)/stddata1
return standdata, meandata0, stddata0
def autoNorm(x):
"""
最大值最小值归一化
:param x: 需要归一化的特征向量
:return: 新的数组、极差、最小值
"""
minVals=x.min(axis=0)
maxVals=x.max(axis=0)
ranges=maxVals-minVals
x_new=(x-minVals)/ranges # 广播
return x_new,ranges,minVals
def knn(traindata,testdata,label,k):
distance=np.sqrt(np.sum((traindata-testdata)**2,axis=1))
p=distance.argsort()
vote = [0, 0, 0]
for i in range(k):
vote[label[p[i]]-1]=vote[label[p[i]]-1]+1
return vote.index(max(vote))+1
def testknn(data,label,k):
# per=np.random.permutation(np.shape(data)[0])
# new_data=data[per,:]
# new_label=label[per]
train_data=data[0:int(np.shape(data)[0]*0.9)]
train_label=label[0:int(np.shape(data)[0]*0.9)]
test_data=data[int(np.shape(data)[0]*0.9):]
test_label = label[int(np.shape(data)[0] * 0.9):]
true_label=0
for i in range(len(test_label)):
result_a=knn(train_data,test_data[i],train_label,k)
if result_a==test_label[i]:
true_label=true_label+1
print(result_a,test_label[i])
acc=float(true_label)/len(test_data)
return acc
if __name__ == '__main__':
path='Knn_Helen'
true_label=["smallDoses",'largeDoses','didntLike']
file=open(path,'r')
print('=======')
data,label=read_data(file)
a,b,c=autoNorm(data)
acc=testknn(a,label,25)
print(acc)
准确率能达到95%以上
标签:knn,分类,label,test,shape,Helen,np,traindata,data 来源: https://www.cnblogs.com/peng-yuan/p/14703275.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。