我正在尝试从头开始为单层感知器编写代码,即不使用除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`
答案 0 :(得分:0)
我认为-由于训练数据是随机生成的,因此将使用该模型在当时的数据(当前)进行训练,因此可能会有相同的输入在不同的运行过程中被分为两个类别。
(希望我很清楚,不要让您进一步困惑!:)如果我误解了您的问题,请纠正我)