# -*- coding: utf-8 -*-
"""
Created on Sun Jan 28 14:35:24 2018
@author: 李慧泽
"""
#根据给定的训练数据X,Y,预测x所属分类
def predict(X,Y,x):
#将数组Y的元素(类别值)嫁接到数组X每行的末尾
NEWX=X
for i in range(0,len(X)):
NEWX[i].append(Y[i])
#第一步:去重,提取Y的类别值,组成集合PureY
PureY=list(set(Y))
#第二步:计算所有类别结果值在Y中的出现次数,放到集合T中。
T=[0]*len(PureY)
for j in range(0,len(PureY)):
T[j]=Y.count(PureY[j])
#数组x与数组PureY每条映射关系的概率,放到集合P中。
P=[0]* len(PureY)
#定义一个二维数组D,统计每列不同的特征值与该特征值出现的的次数 ,以字典的形式作为元素储存在D
#定义一个数组div,用来承装每列不同的特征值出现的次数与T[j]的比值,如果分子为0,则
#分子与分母同时加0
D=[[] for j in range(len(PureY))]
div =[0]*len(x)
for j in range(0,len(PureY)):
#遍历数组PureY的元素,在数组X最后一列提取该元素所在的所有行,将这些行组成数组a
a=[x for x in NEWX if x[len(NEWX[0])-1]== PureY[j]]
for i in range(0,len(x)):
#取出数组a中的第i列,放到数组b中
b=[x[i] for x in a]
#遍历数组b,按照不同的元素和其对应的出现次数储存在字典c
c={k:b.count(k) for k in set(b)}
#将字典c添加到数组D
D[j].append(c)
for j in range(0,len(PureY)):
w=1
for i in range(0,len(x)):
if x[i] in D[j][i]:
for k in D[j][i]:
if k==x[i]:
div[i]=D[j][i].get(k)/T[j]
else:
div[i]=1/(T[j]+1)
w= w* div[i]
P[j]=w*(T[j]/len(NEWX))
#将所有的类别值与其对应的概率存放到字典中,遍历得到最大的概率所对应的类别,并返回
for k,v in dict(zip(PureY,P)).items():
if v==max(P):
return k
#测试
X = [[0, 0, 1],
[0, 1, 0],
[1, 0, 0]]
Y = [1, 2, 3]
x=[0,1,0]
print(predict(X,Y,x))