2.2Softmax Regression算法实践

Posted 田湾第一帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.2Softmax Regression算法实践相关的知识,希望对你有一定的参考价值。

 

Softmax Regression算法实践

  有了上篇博客的理论知识,我们可以利用实现好的函数,来构建Softmax Regression分类器,在训练分类器的过程中,我们使用多分类数据作为训练数据:如图

1、利用训练数据对模型进行训练:

完整代码为:

 

 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("\\t--------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("\\t")
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("\\t".join(w_tmp) + "\\n")
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)
View Code

 

训练结果为

 

weights文件内容

 

 

 2、用训练好的模型对数据进行预测:

预测的代码:

 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("\\t")
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]) + "\\n")
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)
View Code

预测结果;

会生成一个result文件用于存储预测结果

 在本次测试中随机生成4000个样本,最终分类的结果为:

 

以上是关于2.2Softmax Regression算法实践的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow使用softmax regression算法实现手写识别

python逻辑回归(logistic regression LR) 底层代码实现 BGD梯度下降算法 softmax多分类

Softmax回归的简洁实现(softmax-regression-pytorch)

Softmax回归(Softmax Regression, K分类问题)

UFLDL教程答案:Exercise:Softmax Regression

Softmax回归的从零开始实现(softmax-regression-scratch)