用KNN算法实现对妇女体质的预测

# -*- coding: utf-8 -*-
"""
Created on Thu Feb  1 17:24:19 2018

@author: Administrator
"""
import pandas
#输入数组X,数组Y,数组x,k,输出y
def predict(X,Y,x,k):
    #定义一个数组D,用来统计每行的距离值。
    D=[]*len(X)
    #遍历数组X
    for i in range(len(X)):  
        #取出第i行的数据,放到数组T中
        T=X[i] 
        #让数组T与数组x的相同位置上的数相减,减值再平方得到平方值(距离值),得到新的数组s
        s=[(T[i]-x[i])*(T[i]-x[i]) for i in range(len(x))]
        #s的元素求和后放到D         
        D.append(sum(s))
    #定义一个数组r,长度为112,元素取值(0到111)
    r=[]
    for i in range(len(X)):
        r.append(i)
    #定义一个字典a,r作为key,D作为value
    a=dict(zip(r,D))
    #定义一个字典b,r作为key,Y作为value
    b=[x[0] for x in Y]
    #按照value的从小到大对a进行排序后得到一个list类型的c
    c=sorted(a.items(),key = lambda x:x[1])
    n=0
    f=[]
    for i,v in c:
        n=n+1
        if n<k+1:
            for j in range(len(b)):
                if j==i:
                    f.append(b[j])
    #数组num用来统计前4个最小距离所对应的类别值在f中出现的最多次数,并返回该最多次数对应的类别值               
    print(len(f))
    num=[]
    for v in set(f):
        num.append(f.count(v))
    for v in set(f):    
        if f.count(v)==max(num):
            y=v
    return y
X=pandas.read_csv('train_X.csv').values
Y=pandas.read_csv('train_y.csv').values
test_X=pandas.read_csv('test_X.csv').values
result=[]
for i in range(len(test_X)):
    x=test_X[i]
    result.append(predict(X,Y,x,5))       
#打印输出诊断结果,与实际的结果比较
#读取38位顾客的实际值
test_y=pandas.read_csv('test_y.csv')
labels=['女娃','男孩','没有怀孕']
i=0
#正确的诊断数
predictOKNum=0
print("编号,诊断值,实际值,")
while i<test_y.shape[0]:
    #第i个诊断结果与实际的第i个结果比较,相等表示诊断正确
    if result[i]==(test_y.values[i,0]):
        predictOKNum=predictOKNum+1
        okOrNo="准确"
    else:
        okOrNo="错误"
    print("%s,%s,%s,%s"%(i+1,labels[result[i]],labels[test_y.values[i,0]],okOrNo))
    i=i+1
    
print("诊断正确率:%s"%(predictOKNum/i))

数据集入群后跟我要,群号:228735640

猜你喜欢

转载自blog.csdn.net/qq_41424519/article/details/81738959
今日推荐