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("\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)

训练结果为

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)

预测结果;

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

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

原文地址:https://www.cnblogs.com/wanshuai/p/9106413.html

时间: 2024-10-09 08:25:03

2.2、Softmax Regression算法实践的相关文章

1.1、Logistics Regression算法实践

 1.1.Logistics Regression算法实践 有了上篇博客的理论准备后,接下来,我们用以及完成的函数,构建Logistics Regression分类器.我们利用线性可分的数据作为训练样本来训练.在构建模型的过程中,主要有两个步骤:(1)利用训练样本训练模型,(2)利用训练好的模型对新样本进行预测. 1.1.1 原文地址:https://www.cnblogs.com/wanshuai/p/9099772.html

学习笔记TF024:TensorFlow实现Softmax Regression(回归)识别手写数字

TensorFlow实现Softmax Regression(回归)识别手写数字.MNIST(Mixed National Institute of Standards and Technology database),简单机器视觉数据集,28X28像素手写数字,只有灰度值信息,空白部分为0,笔迹根据颜色深浅取[0, 1], 784维,丢弃二维空间信息,目标分0~9共10类.数据加载,data.read_data_sets, 55000个样本,测试集10000样本,验证集5000样本.样本标注信

以German信用数据为例的logistics regression算法在评分卡上的实践

以德国信用数据为例,用logistict regression算法做信用评分卡原理性实现,因此并未考虑feature selection. 第一步:导入必要的库 import pandas as pd import numpy as np from sklearn.cross_validation import train_test_split 第二步:导入数据 german = pd.read_csv('D:/CreditDatasets/german.data', sep=' ', head

ufldl学习笔记与编程作业:Softmax Regression(vectorization加速)

ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说,不必深究其他机器学习的算法,可以直接来学dl. 于是最近就开始搞这个了,教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 本节是对ufldl学习笔记与编程作业:Softmax Regression(softmax回归)版本的改进. 哈哈,把向量化的写法给写出来了,尼玛好快啊.只需要2分钟,2

ufldl学习笔记和编程作业:Softmax Regression(softmax回报)

ufldl学习笔记与编程作业:Softmax Regression(softmax回归) ufldl出了新教程.感觉比之前的好,从基础讲起.系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说,不必深究其它机器学习的算法,能够直接来学dl. 于是近期就開始搞这个了.教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 本节学习链接:http://ufldl.stanford.edu/tutoria

ufldl学习笔记与编程作业:Softmax Regression(softmax回归)

ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说,不必深究其他机器学习的算法,可以直接来学dl. 于是最近就开始搞这个了,教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 本节学习链接:http://ufldl.stanford.edu/tutorial/supervised/SoftmaxRegression/ softmax回归其实是逻

UFLDL实验报告1: Softmax Regression

PS:这些是今年4月份,跟斯坦福UFLDL教程时的实验报告,当时就应该好好整理的…留到现在好凌乱了 Softmax Regression实验报告 1.Softmax Regression实验描述 Softmax回归模型是逻辑回归模型的推广,它可以把数据分类到两个以上的类别.在本实验中,我们的目标是采用Softmax回归模型对MNIST手写数字数据库进行分类,识别每个手写数字,把它们归类于0到9之间的10个类别.实验中需要计算成本函数J,参数Theta,成本函数的梯度,及预测假设h. Figure

机器学习方法(五):逻辑回归Logistic Regression,Softmax Regression

技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 前面介绍过线性回归的基本知识,线性回归因为它的简单,易用,且可以求出闭合解,被广泛地运用在各种机器学习应用中.事实上,除了单独使用,线性回归也是很多其他算法的组成部分.线性回归的缺点也是很明显的,因为线性回归是输入到输出的线性变换,拟合能力有限:另外,线性回归的目标值可以是(?∞,+∞),而有的时候,目标值的范围是[0,1](可以表示概率值),那么就不方便了. 逻辑回归可以说是最为常用的机器学习算法之一,最经典的场景就

深度学习 Deep Learning UFLDL 最新Tutorial 学习笔记 5:Softmax Regression

Softmax Regression Tutorial地址:http://ufldl.stanford.edu/tutorial/supervised/SoftmaxRegression/ 从本节开始,难度开始加大了,我将更详细地解释一下这个Tutorial. 1 Softmax Regression 介绍 前面我们已经知道了Logistic Regression,简单的说就判断一个样本属于1或者0,在应用中比如手的识别,那么就是判断一个图片是手还是非手.这就是很简单的分类.事实上,我们只要把L