import numpy as np
def load_data(file_name):
'''
导入数据函数
'''
returnMat=np.loadtxt(file_name)
returnMat=np.mat(returnMat)
feature_data=np.delete(returnMat,-1,axis=1)
a=np.ones((feature_data.shape[0],1))
feature_data=np.c_[feature_data,a]
label_data=returnMat[:,-1]
return feature_data,label_data
def softmax_function(w,Xi,k,j):
'''
softmax的单个样本的所属类别的概率
input:w(mat)是权重矩阵k*(n+1)
Xi是第i个样本,是行向量
k是第k个类别
j是第i个样本属于第类
output:s(float)表示sofmax函数值
'''
d=0
for i in range(0,k):
d=d+np.exp(w[i,:]*Xi.T)
m=np.exp(w[j,:]*Xi.T)
s=m/d
s=s[0,0]
return s
def I_function(j,label):
'''
指示函数I(.)的函数设计
input: j(int)表示的是第j类别
label(int)表示的是第i类样本的标签值
output: 0或者1
'''
if label==j:
return 1
else:
return 0
def sf_train(feature_data,label_data,maxCycle,alpha,k):
''' 利用梯度下降法训练SF模型
input: feature_data(mat)样例数据
label_data(mat)标签数据
maxCyxle(int)最大迭代次数
alpha(float)学习率
k分类的数量
'''
m=np.shape(feature_data)[0] #共有m个训练样本
n=np.shape(feature_data)[1] #共有n个特征
w=np.mat(np.ones((k,n)))
for j in range(0,k):
c=0
while c
6,最终的生成训练模型,生成预测值
def model(train_data,k):
'''
生成最终的训练模型,并且返回预测的值
input:train_data(mat):输入数据的特征
k(int):输入预测的类别数量
otput::b:列向量,最终的预测结果
'''
m=np.shape(feature_data)[0] #共有m个训练样本
c=np.mat(np.ones((m,k)))
b=np.mat(np.ones((m,1)))
for j in range(0,m):
for i in range(0,k):
c[j,i]=softmax_function(w,train_data[j,:],k,i)
for i in range(0,m):
s=list(np.array(c[i,:]))
b[i,0]=np.argmax(s)
return b
def error(label_data,b):
'''简单的计算错误率
input:label_data:标签值,
b:预测值
output:正确率
'''
m=np.shape(label_data)[0]
T=0
for i in range(0,m):
if b[i]==label_data[i]:
T=T+1
return T/m
if __name__ =="__main__":
print("-------1.导入数据-----------")
feature_data,label_data=load_data("manytest_data.txt")
print("-------2.梯度下降法训练模型---")
w=sf_train(feature_data,label_data,1000,0.001,4)
print("--------3.预测模型--------")
b=model(feature_data,4)
print("---------4.输出错误率------")
erro=error(label_data,b)
print(erro)
这是简单的softmax 多分类的编程代码,适合初学者进行学习,代码中的很多公式都是经过推导的公式。我会在后期,针对softmax 回归进行一个详细的推导,结合该源代码,我想对初学者,是一个很好的学习素材,代码中的数据集,可以在网上自己下载,多分类数据集,也可以在我的csdn的博客上下载多分类的数据集。