当前位置: 代码迷 >> 综合 >> #实战项目:KNN算法进行车辆满意度测评 选用经典的Car Evaluation Database数据集
  详细解决方案

#实战项目:KNN算法进行车辆满意度测评 选用经典的Car Evaluation Database数据集

热度:81   发布时间:2024-02-06 01:40:44.0

#实战项目:KNN算法进行车辆满意度测评
选用经典的Car Evaluation Database数据集
通过对六个特征值进行测评,得到用户对车辆的满意程度
数据集来源于下面的网站:http://archive.ics.uci.edu/ml/index.php
计算测试数据相对于测试集中每一组数据的距离,并且根据k值来选取最近的K的个数据,并且统计k个数据中,出现次数最高的结果,作为测试数据的结果
选取文本中10%的数据进行测试,进行数据归一化,读取二维数组的行数,确定测试的数量,记录错误数量的变量,通过KNN算法进行判断

coding=utf-8
“”"
KNN算法进行车辆评测

“”"
from numpy import *
import operator
#数据处理
#数字化处理
def KeyToNum(line):
#将一行的字符串变成对应的数字
numline = []
switcher = {
‘vhigh’ : 4 ,
‘high’ : 3 ,
‘med’ : 2 ,
‘low’ : 1 ,
‘5more’ : 5 ,
‘more’ : 6 ,
‘small’ : 1 ,
‘big’ : 3 ,
‘unacc’ : 1 ,
‘acc’ : 2 ,
‘good’ : 3 ,
‘vgood’ : 4 ,
}
for key in line:
numline.append(switcher.get(key, key))
return numline

#读数据集并保存到数组中
def filecarmatrix(filepath):
f = open(filepath,‘r’)
arraylines = f.readlines()
numberlines = len(arraylines)
returnMat = zeros((numberlines, 6)) #生成零数组
classLabelVector = []
index = 0;
for line in arraylines:
line = line.strip() #移除字符串头尾指定的字符(默认为空格)
listfromline = line.split(’,’)
numline = KeyToNum(listfromline) #将数据进行数字化处理
returnMat[index, :] = numline[0:6]#将特征赋给二维数组
classLabelVector.append(int(numline[-1])) #将分类(最后一列)赋给一维数组
index += 1
return returnMat, classLabelVector

#归一化处理数据
‘’’
归一化数值
newValue = (oldValue - min) / (max - min)*1+0
‘’’
def autoNorm(DataSet):
minVals = DataSet.min(0 )#将每列中的最小值放在变量minVals中
maxVals = DataSet.max(0) #将每列中的最da值放在变量minVals中
ranges = maxVals - minVals #将每列中的最小值放在变量minVals中
normDataSet = zeros(shape(DataSet)) #生成一个与dataSet相同的零数组
m = DataSet.shape[0] #求出dataSet列长度
normDataSet = DataSet - tile(minVals, (m, 1)) #求出oldValue - min
normDataSet = normDataSet / tile(ranges, (m,1)) #求出归一化数值
return normDataSet, ranges, minVals

#KNN算法
def knncls(dataSet,cur,lables,k):
#1.判断当前点到每个样本点的距离
a=tile(cur,(1292,1))
#a与dataSet的距离
diff=dataSet-a
diff=diff2
diff=sum(diff,axis=1) #压缩列,将行加起来
diff=diff0.5
#对diff进行排序
indexes=argsort(diff) #返回排好序的元素原来的下标
#将标签与次数写成字典形式
dic={}
for i in range(k):
key=lables[indexes[i]]
dic[key]=dic.get(key,0)+1
#对字典按照次数(value)进行排序,次数多的在前面
lst=sorted(dic.items(),key=lambda kv:kv[1],reverse=True) #key为value,kv为编辑器item中的每一个元组,kv[1]表示value
#获取次数出现最多的标签 lst的类型类似于[(‘爱情’,10),(‘武打’,18)]
return lst[0][0]

if name==‘main’:
k=0
k=input(“请输入k:”)
k=int(k)
#创建训练数据
dataSet, CarLabels=filecarmatrix(r’d:\car.txt’)
#测试数据
basePer = 0.1 #测试基数,选取文本中10%的数据进行测试
CarDataMat, CarLabels = filecarmatrix(r’d:\car.txt’)
normMat, ranges, minVals = autoNorm(CarDataMat) #进行数据归一化
m = normMat.shape[0] #读取数据行数
numTestVecs = int(m * basePer) #确定测试的行数
correctCount = 0.0 #记录正确数量的变量
for car in range(numTestVecs):
#读取这个文件,然后将文件内容转为一维数组
res=knncls(normMat[numTestVecs:m, :],normMat[car, :] ,CarLabels[numTestVecs:m],k)
#print(res)
#判断正确的个数记为correctCount
if CarLabels[car]==res:
correctCount+=1
cor=round(100*correctCount/(CarDataMat.shape[0]*0.1),3) #计算正确率
print(“正确率为:{}%”.format(cor))

  相关解决方案