zoukankan      html  css  js  c++  java
  • 2.2、Softmax 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("	--------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)
    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("	")
    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)
    View Code

    预测结果;

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

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

  • 相关阅读:
    网络编程总结
    网络编程进阶---->>> hamc模块 socketserver模块验证合法性 两者进行通信连接
    黏包
    socket概念 套接字
    网络协议
    python之路——网络基础
    模块复习 staticmethod和classmethod的区别
    Dubbo执行流程?
    Dubbo在安全机制方面是如何解决的
    Dubbo中有哪些角色?
  • 原文地址:https://www.cnblogs.com/wanshuai/p/9106413.html
Copyright © 2011-2022 走看看