`
daweibalong
  • 浏览: 45620 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Machine Learning系列实验--SoftMax Regression

阅读更多

SoftMax回归可以用来进行两种以上的分类,很是神奇!实现过程实在有点坎坷,主要是开始写代码的时候理解并不透彻,而且思路不清晰,引以为戒吧!

SoftMax Regression属于指数家族,证明见( http://cs229.stanford.edu/notes/cs229-notes1.pdf 及http://ufldl.stanford.edu/wiki/index.php/Softmax_Regression),最后得出的结论是:

Matchine <wbr>Learning系列实验--SoftMax <wbr>Regression
最后写出似然估计: 
Matchine <wbr>Learning系列实验--SoftMax <wbr>Regression

Matchine <wbr>Learning系列实验--SoftMax <wbr>Regression

之后采用梯度或牛顿方法进行逼近:
Matchine <wbr>Learning系列实验--SoftMax <wbr>Regression
注意,上面公式采用的是批量梯度,随机梯度当然也是可以的。

参数theta的更新如下:
Matchine <wbr>Learning系列实验--SoftMax <wbr>Regression
要注意的是,theta[j]是一个向量。

实验还是参考大牛pennyliang(http://blog.csdn.net/pennyliang/article/details/7048291),代码如下:
#include <iostream>
#include <cmath>
#include <assert.h>
using namespace std;

const int K = 2;//有K+1类
const int M = 9;//训练集大小
const int N = 4;//特征数

double x[M][N]={{1,47,76,24}, //include x0=1
	{1,46,77,23},
	{1,48,74,22},
	{1,34,76,21},
	{1,35,75,24},
	{1,34,77,25},
	{1,55,76,21},
	{1,56,74,22},
	{1,55,72,22},
};

double y[M]={1,
	1,
	1,
	2,
	2,
	2,
	3,
	3,
	3,};

double theta[K][N]={
	{0.3,0.3,0.01,0.01},
	{0.5,0.5,0.01,0.01}}; // include theta0

double h_value[K];//h(x)向量值

//求exp(QT*x)
double fun_eqx(double* x, double* q)
{
	double sum = 0;
	for (int i = 0; i < N; i++)
	{
		sum += x[i] * q[i];
	}
	return pow(2.718281828, sum);
}

//求h向量
void h(double* x)
{
	int i;
	double sum = 1;//之前假定theta[K+1]={0},所以exp(Q[K+1]T*x)=1
	for (i = 0; i < K; i++)
	{
		h_value[i] = fun_eqx(x, theta[i]);
		sum += h_value[i];
	}
	
	assert(sum != 0);
	
	for (i = 0; i < K; i++)
	{
		h_value[i] /= sum; 
	}
}

void modify_stochostic()
{
	//随机梯度下降,训练参数
	int i, j, k;
	for (j = 0; j < M; j ++)
	{
		h(x[j]);
		for (i = 0; i < K; i++)
		{
			for (k = 0; k < N; k++)
			{
				theta[i][k] += 0.001 * x[j][k] *  ((y[j] == i+1?1:0) - h_value[i]);
			}
		}
	}
}
void modify_batch()
{
	//批量梯度下降,训练参数
	int i, j, k ;
	for (i = 0; i < K; i++)
	{
		double sum[N] = {0.0};
		for (j = 0; j < M; j++)
		{
			h(x[j]);
			for (k = 0; k < N; k++)
			{
				sum[k] += x[j][k] * ((y[j] == i+1?1:0) - h_value[i]);
			}
		}
		for (k = 0; k < N; k++)
		{
			theta[i][k] += 0.001 * sum[k] / N;
		}
	}
}

void train(void)
{
	int i;
	for (i = 0; i < 10000; i++)
	{
		//modify_stochostic();
		modify_batch();
	}
}

void predict(double* pre)
{
	//输出预测向量
	int i;
	for (i = 0; i < K; i++)
		h_value[i] = 0;
	train();
	h(pre);
	for (i = 0; i < K; i++)
		cout << h_value[i] << " ";
	cout << 1 - h_value[0] - h_value[1] << endl;
}

int main(void)
{
	for (int i=0; i < M; i++)
	{
		predict(x[i]);
	}
	cout << endl;
	double pre[] = {1,20, 80, 50 };
	predict(pre);
	return 0;
}
 代码实现了批量梯度和随机梯度两种方法,实验最后分别将训练样本带入进行估计,迭代10000次的结果为:
stochastic:
0.999504 0.000350044 0.000145502
0.997555 0.00242731 1.72341e-005
0.994635 1.24138e-005 0.00535281
2.59353e-005 0.999974 6.07695e-017
0.00105664 0.998943 -1.09071e-016
4.98481e-005 0.99995 3.45318e-017
0.0018048 1.56509e-012 0.998195
0.000176388 1.90889e-015 0.999824
0.000169041 8.42073e-016 0.999831

batch:
0.993387 0.00371185 0.00290158
0.991547 0.0081696 0.000283336
0.979246 0.000132495 0.0206216
0.000630111 0.99937 4.9303e-014
0.00378715 0.996213 9.37462e-014
0.000299602 0.9997 3.50739e-017
0.00759726 2.60939e-010 0.992403
0.0006897 1.09856e-012 0.99931
0.000545117 5.19157e-013 0.999455

可见随机梯度收敛的更快。
对于预测来说,输出结果每行的三个数表示是:对于输入来说,是1 2 3三类的概率分别是多少。
分享到:
评论

相关推荐

    MachineLearning-master-python.zip

    [Softmax_sgd(or logistic_sgd)]Softmax回归算法的实现,应用于MNIST数据集,基于Python+theano。 - **PCA** 基于python+numpy实现了主成份分析PCA算法 - **kNN** 基于python+numpy实现了K近邻算法,并将其应用在...

    softmax regression

    softmax regression 源代码 源码用的armadillo数学库,如何安装armadillo数学库,请看我的博客 http://blog.csdn.net/seamanj/article/details/49892715

    code_softmax_Softmax鸢尾花_machinelearning_

    这个模型是逻辑回归(Logistic Regression)的扩展,可以处理超过两个类别的分类任务。在这个项目中,我们使用了Softmax函数来解决鸢尾花数据集上的三分类问题。 鸢尾花数据集是一个经典的数据集,包含了三种不同...

    Softmax Regression训练程序

    总的来说,这个Softmax Regression训练程序提供了从数据预处理、模型训练、参数优化到模型评估和保存的完整流程。通过运行和分析这个程序,我们可以深入理解多分类问题的解决策略,以及如何利用Python和相关的机器...

    MachineLearning_irisdataset_Logistic_

    在这个项目中,“MachineLearning_irisdataset_Logistic_”显然是使用鸢尾花数据集来应用逻辑回归算法进行分类。 逻辑回归(Logistic Regression)是一种广泛使用的分类方法,尽管它的名字里有“回归”,但它实际上...

    Machine-Learning

    逻辑回归适用于处理线性可分问题,并且可以用于多分类任务的one-vs-rest或softmax方法。 在这个项目中,作者使用Jupyter Notebook来实现这些算法,这是一个交互式的计算环境,允许开发者结合代码、文本和可视化,...

    深度学习基础加进阶视频教程

    非线性回归 Logistic Regression 回归中的相关度和决定系数 回归中的相关性和R平方值应用 Kmeans算法 Kmeans应用 Hierarchical clustering 层次聚类 进阶 基本概念 软件包安装和环境配置总述 环境配置分部详解 ...

    主成分回归代码matlab及例子-machine-learning-r:R中的机器学习

    主成分回归代码matlab及示例R中的机器学习 这是我在机器学习期间开发的R脚本的存储库。 一些代码已从其原始Matlab实现中进行了改编并转换为R。...Softmax回归成本函数和梯度(softmax_cost) Softmax回归

    毕业设计_论文正文_宋启迪1

    ax regression model and a Convolutional Neural Network (CNN) model using TensorFlow, a machine learning framework developed by Google, for handwritten digit recognition. The focus is on comparing ...

    MachineLearning:该存储库包括我对机器学习中一些想法的理解

    C5_LogisticRegression C6_SVM C7_AdaBoost 预言 C8_回归 C9_CART 无监督学习 C10_K-均值 C11_Apriori C12_FP-增长 免费工具 C13_PCA C14_SVD 第二部分---&gt; Coursera的研究-吴恩达的机器学习 线性回归 ...

    stanford-classifier-2018-10-16.rar

    A classifier is a machine learning tool that will take data items and place them into one of k classes. A probabilistic classifier, like this one, can also give a probability distribution over the ...

    ml_algo:Dart编程语言中的机器学习算法

    在Dart编程语言中,机器学习(Machine Learning, ML)算法的应用正变得越来越普遍,尤其在数据科学领域。本文将深入探讨如何使用Dart来实现和应用各种机器学习算法,包括分类器、回归分析和超参数调整等核心概念。 ...

    四天速成Tensorflow PPT-香港科技大学-理论基础01

    Recap: Machine Learning Basics 1、Linear Regression 2、Logistic Regression (Binary classification) 3、Softmax Classification 4、XOR with Logistic Regression (Binary classification) 5、Solution: Deep ...

    威斯康星州乳腺癌:[ICMLSC 2018]乳腺癌检测:机器学习算法在威斯康星州诊断数据集上的应用

    本文对威斯康星州的六种机器学习(ML)算法进行了比较: ,线性回归,多层感知器(MLP),最近邻(NN)搜索,Softmax回归和支持向量机(SVM)诊断性乳腺癌(WDBC)数据集通过测量其分类测试的准确性以及其敏感性和...

    基于深度卷积神经网络的多字体印刷体汉字识别.pdf

    6. Softmax回归层(Softmax Regression Layer):一种输出层,用于多分类问题的概率预测。 7. 印刷体汉字识别(Printed Chinese Character Recognition):一种基于计算机视觉和机器学习的技术,用于识别和分类印刷...

    GDLibrary:Matlab库用于梯度下降算法

    GDLibrary:MATLAB中的梯度下降库作者:最后页面更新时间:2017年4月19日最新库版本:1.0.1(有关更多信息,请参见发行说明)介绍GDLibrary是一个纯Matlab库,包含无约束优化算法的集合。 这解决了形式为min f(x)...

    斯坦福机器学习笔记

    - 神经网络可以用来解决多类分类问题,通常使用softmax函数作为输出层的激活函数。 #### 8. 神经网络:学习 - **8.1 神经网络代价函数** - 神经网络的学习过程是通过调整权重和偏置来最小化代价函数的过程。 -...

    TensorFlow-Book:TensorFlow的机器学习随附源代码。 请参阅这本书以获取分步说明

    概念4 :Softmax分类 -聚类 概念1 :集群 概念2 :细分 概念3 :自组织图 -隐藏的Markov模型 概念1 :转发算法 概念2 :维特比解码 -自动编码器 概念1 :自动编码器 概念2 :将自动编码器应用于图像 概念3 :去噪...

    40种回归、分类、特征选择降维等方法合集

    - `regress_elm_tr.m`:极小化误差反向传播网络(Extreme Learning Machine, ELM)用于回归任务。ELM是一种快速的单隐藏层前馈神经网络训练方法,它通过随机初始化权重和偏置来实现高效的学习。 2. 分类方法: - ...

Global site tag (gtag.js) - Google Analytics