一个测试示例可以属于多个类别吗?

时间:2019-08-12 14:57:48

标签: python-3.x neural-network perceptron

我正在尝试从头开始为单层感知器编写代码,即不使用除numpy之外的任何库。我使用的激活函数为S型。

我有一个训练集,大小为50,具有2个属性,并且为了模拟多个类别,我有两个输出节点而不是1,所以我的输入矩阵的形式为1x2,权重矩阵的形式为2x2并且输出矩阵为1x2。

我使用正态梯度下降进行优化。我训练了连接到第一输出的两个权重,另外两个权重独立地连接到第二输出,即,因为第一输出的权重是根据我的训练输出的第一个元素来训练的,第二个类似地输出,则根据我的训练输出的第二个元素来训练附加的权重。

训练集是从正态分布中随机生成的,第一属性是从均值100和标准差为75的正态分布中生成的,而第二输出是从正态分布中生成的。平均得分为400和S.D. 75.这些班级是交替分配的,即第一个培训示例属于班级1,接下来是班级0,接下来是班级1,依此类推。

我的问题是,在随机生成的训练集上反复提供某些输入时,有时将输入分为两个类。从数学的角度来看,这可能吗?可能是因为我选择的训练集是随机的吗?我认为是这种情况,但我想确保在数学上确实是可能的,并且这不是我的代码或逻辑中的错误。

我的代码是:

import numpy as np


def sigmoid(x):
    #"Numerically-stable sigmoid function."
    if x >= 0:
        z = np.exp(-x)
        return 1 / (1 + z)
    else:
        z = np.exp(x)
        return z / (1 + z)
print("Number of input nodes is 2\n")

print("Number of output nodes is 2\n")

print("Stochastic Gradient descent used to avoid summing up and iterating till minima\n")

print("Activation function : Sigmoid\n")

#print("There are two attri

T_entries=[]
A_entries=[]



#design the input matrix X , the weight matrix W 

Rx=1
Cx=2 #Input vector is of size 1x2 , Weight is of size 2x2

W=np.array([[1.0,1.0],[1.0,1.0]]) #assigning initial value to weights
B=np.array([0.0,0.0]) #Assigning initial values to biases

#Training set

Rt=50
Ct=2 #10 training set. Classify between male and female . Attributes : Height>5'5" = 1 else 0 ; Weight > 60 =1 else 0

#print("Enter training set\n")
#print("Enter the attribute values in space seperate entries\n")

#Attributes
#T_entries=list(map(float, input().split()))

i=0
while i<50:
    pick=np.random.normal(100, 75,1)
    T_entries.append(pick)
    pick=np.random.normal(400, 75,1)
    T_entries.append(pick)
    i=i+1


T= np.array(T_entries).reshape(Rt, Ct)

#Annotation

#print("Enter annotations for training set\n")
Ra=50
Ca=2 #Annotations : 0 for male , 1 for female
#A_entries=list(map(float,input().split()))
i=0
pick=0
while i<50:
    pick=1-pick
    A_entries.append(pick)
    A_entries.append(1-pick)
    i=i+1

A=np.array(A_entries).reshape(Ra,Ca)

print("The random training set generated is\n")

i=0

while i < Ra:
    print(str(T[i][0])+" "+str(T[i][1])+" "+str(A[i][0])+" "+str(A[i][1])+"\n")
    i=i+1

print("Training....")

l_rate=0.05 #learning rate

i=0

while i<50:

       print("****************************************************************************************\n")
    print("Iteration: "+str(i)+"\n")
    x1=T[i][0]
    x2=T[i][1]
    y1=A[i][0]
    y2=A[i][1]
    print("The training example is: " +str(x1)+ " " +str(x2) +"\n")
    print("Corresponding annotations are : " +str(y1) +" " +str(y2) +"\n") 
    T_i=np.array([x1,x2]) #Getting the attributes
    A_i=np.array([y1,y2]) #Corresponding annotation
    f_x=np.matmul(T_i,W)+B #Compute the output to calculate the error

    print("Ultimate output for the training exmaple is :\n")

    print(f_x)
    calc=sigmoid(f_x[0])
    #print(calc)
    real=A_i[0]
    #print(real)

    print("Calculated value of y1 is " +str(calc) +" while the real value is " +str(real) +"\n")

    # w1 and w2 are responsible for out_1 and w3 and w4 for out_2

    err_out1=calc-real
    print("Error in y1 is "+str(err_out1)+"\n")
    W[0][0]=W[0][0]- l_rate*(2*err_out1*T_i[0]) #w1 modified 2*error*x1
    W[1][0]=W[1][0]- l_rate*(2*err_out1*T_i[1]) #w2 modified 2*error*x2
    B[0]=B[0]- l_rate*(2*err_out1) #b1 modified

    print("The weight matrix is \n")

    #print(W)

    calc=sigmoid(f_x[1])
    #print(calc)
    real=A_i[1]
    #print(real)

    print("Calculated value of y2 is " +str(calc) +" while the real value is " +str(real) +"\n")


    err_out2=calc-real
    print("Error in y2 is "+str(err_out2)+"\n")
    W[0][1]=W[0][1]-l_rate*(2*err_out2*T_i[0])
    W[1][1]=W[1][1]-l_rate*(2*err_out2*T_i[1])
    B[1]=B[1]-l_rate*(2*err_out2)
    print("The weight matrix is \n")
    print(W)

    i=i+1

#Testing our model

#print (W)

print("Enter x1 and x2")

Test_entries=list(map(float, input().split()))
Test=np.array(Test_entries).reshape(Rx,Cx)
print("Entered Test data is\n")
print(Test)
f=np.matmul(Test,W)+B
print(sigmoid(f[0][0]))
if sigmoid(f[0][0]) > 0.5 :
    print ("Class 1") 
else:
    print("Not Class 1")
print("\n")
print(sigmoid(f[0][1]))
if sigmoid(f[0][1]) > 0.5:
    print("Class 2")
else:
    print("Not Class 2")

此测试示例的输出:

Entered Test data is

[[223.  85.]]
1.0
Class 1


1.0
Class 2`

1 个答案:

答案 0 :(得分:0)

我认为-由于训练数据是随机生成的,因此将使用该模型在当时的数据(当前)进行训练,因此可能会有相同的输入在不同的运行过程中被分为两个类别。

(希望我很清楚,不要让您进一步困惑!:)如果我误解了您的问题,请纠正我)