Softmax Regression算法实践
有了上篇博客的理论知识,我们可以利用实现好的函数,来构建Softmax Regression分类器,在训练分类器的过程中,我们使用多分类数据作为训练数据:如图
1、利用训练数据对模型进行训练:
完整代码为:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # -*- coding: UTF-8 -*- 2 # date:2018/5/29 3 # User:WangHong 4 import numpy as np 5 def gradientAscent(feature_data,label_data,k,maxCycle,alpha): 6 '''利用梯度下降法训练Softmax模型 7 :param feature_data: 特征 8 :param label_data: 标签 9 :param k: 类别个数 10 :param maxCycle: 最大迭代次数 11 :param alpha: 学习率 12 :return weights: 权重 13 ''' 14 m,n = np.shape(feature_data) 15 weights = np.mat(np.ones((n,k)))#初始化权重 16 i = 0 17 while i<=maxCycle: 18 err = np.exp(feature_data*weights) 19 if i % 500 == 0: 20 print(" --------iter:",i, 21 ",cost:",cost(err,label_data)) 22 rowsum = -err.sum(axis=1) 23 rowsum = rowsum.repeat(k,axis = 1) 24 err = err/rowsum 25 for x in range(m): 26 err[x,label_data[x,0]]+=1 27 weights = weights+(alpha/m)*feature_data.T*err 28 i+=1 29 return weights 30 31 def cost(err,label_data): 32 ''' 33 :param err: exp的值 34 :param label_data: 标签的值 35 :return: 损失函数的值 36 ''' 37 m = np.shape(err)[0] 38 sum_cost = 0.0 39 for i in range(m): 40 if err[i,label_data[i,0]]/np.sum(err[i,:])>0: 41 sum_cost -=np.log(err[i,label_data[i,0]]/np.sum(err[i,:])) 42 else: 43 sum_cost -= 0 44 return sum_cost / m 45 46 47 def load_data(inputfile): 48 '''导入训练数据 49 input: inputfile(string)训练样本的位置 50 output: feature_data(mat)特征 51 label_data(mat)标签 52 k(int)类别的个数 53 ''' 54 f = open(inputfile) # 打开文件 55 feature_data = [] 56 label_data = [] 57 for line in f.readlines(): 58 feature_tmp = [] 59 feature_tmp.append(1) # 偏置项 60 lines = line.strip().split(" ") 61 for i in range(len(lines) - 1): 62 feature_tmp.append(float(lines[i])) 63 label_data.append(int(lines[-1])) 64 65 feature_data.append(feature_tmp) 66 f.close() # 关闭文件 67 return np.mat(feature_data), np.mat(label_data).T, len(set(label_data)) 68 69 def save_model(file_name, weights): 70 '''保存最终的模型 71 input: file_name(string):保存的文件名 72 weights(mat):softmax模型 73 ''' 74 f_w = open(file_name, "w") 75 m, n = np.shape(weights) 76 for i in range(m): 77 w_tmp = [] 78 for j in range(n): 79 w_tmp.append(str(weights[i, j])) 80 f_w.write(" ".join(w_tmp) + " ") 81 f_w.close() 82 83 84 if __name__=="__main__": 85 inputfile = "SoftInput.txt" 86 #导入数据 87 print("--------------1.load data-------------") 88 feature,label,k = load_data(inputfile) 89 #训练模型 90 print("--------------2.traing----------------") 91 weights = gradientAscent(feature,label,k,5000,0.2) 92 #保存模型 93 print("--------------3.save model------------") 94 save_model("weights",weights)
训练结果为
weights文件内容
2、用训练好的模型对数据进行预测:
预测的代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # -*- coding: UTF-8 -*- 2 # date:2018/5/29 3 # User:WangHong 4 import numpy as np 5 import random as rd 6 def load_weights(weights_path): 7 '''导入训练好的Softmax模型 8 input: weights_path(string)权重的存储位置 9 output: weights(mat)将权重存到矩阵中 10 m(int)权重的行数 11 n(int)权重的列数 12 ''' 13 f = open(weights_path) 14 w = [] 15 for line in f.readlines(): 16 w_tmp = [] 17 lines = line.strip().split(" ") 18 for x in lines: 19 w_tmp.append(float(x)) 20 w.append(w_tmp) 21 f.close() 22 weights = np.mat(w) 23 m, n = np.shape(weights) 24 return weights, m, n 25 26 27 def load_data(num, m): 28 '''导入测试数据 29 input: num(int)生成的测试样本的个数 30 m(int)样本的维数 31 output: testDataSet(mat)生成测试样本 32 ''' 33 testDataSet = np.mat(np.ones((num, m))) 34 for i in range(num): 35 testDataSet[i, 1] = rd.random() * 6 - 3 # 随机生成[-3,3]之间的随机数 36 testDataSet[i, 2] = rd.random() * 15 # 随机生成[0,15]之间是的随机数 37 return testDataSet 38 39 40 def predict(test_data, weights): 41 '''利用训练好的Softmax模型对测试数据进行预测 42 input: test_data(mat)测试数据的特征 43 weights(mat)模型的权重 44 output: h.argmax(axis=1)所属的类别 45 ''' 46 h = test_data * weights 47 return h.argmax(axis=1) # 获得所属的类别 48 49 50 def save_result(file_name, result): 51 '''保存最终的预测结果 52 input: file_name(string):保存最终结果的文件名 53 result(mat):最终的预测结果 54 ''' 55 f_result = open(file_name, "w") 56 m = np.shape(result)[0] 57 for i in range(m): 58 f_result.write(str(result[i, 0]) + " ") 59 f_result.close() 60 61 62 if __name__ == "__main__": 63 # 1、导入Softmax模型 64 print("---------- 1.load model ----------------") 65 w, m, n = load_weights("weights") 66 # 2、导入测试数据 67 print("---------- 2.load data -----------------") 68 test_data = load_data(4000, m) 69 # 3、利用训练好的Softmax模型对测试数据进行预测 70 print("---------- 3.get Prediction ------------") 71 result = predict(test_data, w) 72 # 4、保存最终的预测结果 73 print("---------- 4.save prediction ------------") 74 save_result("result", result)
预测结果;
会生成一个result文件用于存储预测结果
在本次测试中随机生成4000个样本,最终分类的结果为: