using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApp4
{
class Program
{
static void Main(string[] args)
{
List<float[]> inputs_x = new List<float[]>();
inputs_x.Add( new float[] { 0.9f, 0.6f});
inputs_x.Add(new float[] { 2f, 2.5f } );
inputs_x.Add(new float[] { 2.6f, 2.3f });
inputs_x.Add(new float[] { 2.7f, 1.9f }); List<float> inputs_y = new List<float>();
inputs_y.Add( 2.5f);
inputs_y.Add( 2.5f);
inputs_y.Add( 3.5f);
inputs_y.Add( 4.2f); float[] weights = new float[3];
for (var i= 0;i < weights.Length;i++)
weights[i] = (float)new Random().NextDouble(); int epoch = 30000;
float epsilon =0.00001f;
float lr = 0.01f; float lastCost=0; for (var epoch_i = 0; epoch_i <= epoch; epoch_i++)
{
//随机获取input
var batch = GetRandomBatch(inputs_x, inputs_y, 2); float[] weights_in_poch = new float[weights.Length]; foreach (var x_y in batch)
{
var x1 = x_y.Item1.First();
var x2 = x_y.Item1.Skip(1).Take(1).First();
var target_y = x_y.Item2; float diffWithTargetY = target_y - fun(x1, x2, weights[1], weights[2], weights[0]); weights_in_poch[0] += diffWithTargetY * dy_b(x1, x2);
weights_in_poch[1] += diffWithTargetY * dy_theta1(x1, x2);
weights_in_poch[2] += diffWithTargetY * dy_theta2(x1, x2);
} for(var i=0;i<weights.Length;i++)
weights[i] += lr * weights_in_poch[i]; float totalErrorCost = 0f;
foreach (var x_y in batch)
{
var x1 = x_y.Item1.First();
var x2 = x_y.Item1.Skip(1).Take(1).First();
var target_y = x_y.Item2; float diffWithTargetY = target_y - fun(x1, x2, weights[1], weights[2], weights[0]);
totalErrorCost += (float)System.Math.Pow(diffWithTargetY, 2)/2;
} float cost = totalErrorCost / batch.Count; if (System.Math.Abs(cost - lastCost) <= epsilon)
{
Console.WriteLine(string.Format("EPOCH {0}", epoch_i));
Console.WriteLine(string.Format("LAST MSE {0}", lastCost));
Console.WriteLine(string.Format("MSE {0}", cost));
break;
} lastCost = cost; if (epoch_i % 100 == 0|| epoch_i==epoch)
{
Console.WriteLine(string.Format("MSE {0}", cost));
}
} print(weights[1], weights[2], weights[0]); Console.ReadLine();
} private static List<Tuple<float[], float>> GetRandomBatch(List<float[]> inputs_x, List<float> inputs_y, int maxCount)
{
List<Tuple<float[], float>> lst = new List<Tuple<float[], float>>(); System.Random rnd = new Random((int)DateTime.Now.Ticks); int count = 0;
while (count<maxCount)
{
int rndIndex = rnd.Next(inputs_x.Count);
var item=Tuple.Create<float[], float>(inputs_x[rndIndex], inputs_y[rndIndex]);
lst.Add(item);
count++;
} return lst;
} private static void print(float theta1, float theta2, float b)
{
Console.WriteLine(string.Format("y={0}*x1+{1}*x2+{2}", theta1, theta2, b));
}
private static float fun(float x1, float x2, float theta1, float theta2, float b)
{
return theta1 * x1 + theta2 * x2 + b;
}
private static float dy_theta1(float x1, float x2)
{
return x1;
} private static float dy_theta2(float x1, float x2)
{
return x2;
} private static float dy_b(float x1, float x2)
{
return 1;
}
}
}

  

SGD的更多相关文章

  1. [Machine Learning] 梯度下降法的三种形式BGD、SGD以及MBGD

    在应用机器学习算法时,我们通常采用梯度下降法来对采用的算法进行训练.其实,常用的梯度下降法还具体包含有三种不同的形式,它们也各自有着不同的优缺点. 下面我们以线性回归算法来对三种梯度下降法进行比较. ...

  2. 为什么是梯度下降?SGD

    在机器学习算法中,为了优化损失函数loss function ,我们往往采用梯度下降算法来进行优化.举个例子: 线性SVM的得分函数和损失函数分别为:                         ...

  3. 【原创】batch-GD, SGD, Mini-batch-GD, Stochastic GD, Online-GD -- 大数据背景下的梯度训练算法

    机器学习中梯度下降(Gradient Descent, GD)算法只需要计算损失函数的一阶导数,计算代价小,非常适合训练数据非常大的应用. 梯度下降法的物理意义很好理解,就是沿着当前点的梯度方向进行线 ...

  4. 逻辑回归:使用SGD(Stochastic Gradient Descent)进行大规模机器学习

    Mahout学习算法训练模型 mahout提供了许多分类算法,但许多被设计来处理非常大的数据集,因此可能会有点麻烦.另一方面,有些很容易上手,因为,虽然依然可扩展性,它们具有低开销小的数据集.这样一个 ...

  5. [Machine Learning] 梯度下降(BGD)、随机梯度下降(SGD)、Mini-batch Gradient Descent、带Mini-batch的SGD

    一.回归函数及目标函数 以均方误差作为目标函数(损失函数),目的是使其值最小化,用于优化上式. 二.优化方式(Gradient Descent) 1.最速梯度下降法 也叫批量梯度下降法Batch Gr ...

  6. 监督学习:随机梯度下降算法(sgd)和批梯度下降算法(bgd)

    线性回归 首先要明白什么是回归.回归的目的是通过几个已知数据来预测另一个数值型数据的目标值. 假设特征和结果满足线性关系,即满足一个计算公式h(x),这个公式的自变量就是已知的数据x,函数值h(x)就 ...

  7. tensorflow实现最基本的神经网络 + 对比GD、SGD、batch-GD的训练方法

    参考博客:https://zhuanlan.zhihu.com/p/27853521 该代码默认是梯度下降法,可自行从注释中选择其他训练方法 在异或问题上,由于训练的样本数较少,神经网络简单,训练结果 ...

  8. 深度学习——优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

    在机器学习.深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论 ...

  9. 【深度学习】深入理解优化器Optimizer算法(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

    在机器学习.深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论 ...

  10. 【DeepLearning】优化算法:SGD、GD、mini-batch GD、Moment、RMSprob、Adam

    优化算法 1 GD/SGD/mini-batch GD GD:Gradient Descent,就是传统意义上的梯度下降,也叫batch GD. SGD:随机梯度下降.一次只随机选择一个样本进行训练和 ...

随机推荐

  1. 一:Redis的7个应用场景

    Redis的7个应用场景   一:缓存——热数据 热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存,毕竟强大到冒泡的QPS和极强的稳定性不是所有类似工具都有的,而且相 ...

  2. Android 异步消息处理机制前篇(一):深入理解ThreadLocal

    版权声明:本文出自汪磊的博客,转载请务必注明出处. ThreadLocal简介 ThreadLocal是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储以后,只有在指定线程中可以获 ...

  3. P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper

    题目描述 给出n个物品,体积为w[i],现把其分成若干组,要求每组总体积<=W,问最小分组.(n<=18) 输入格式: Line 1: N and W separated by a spa ...

  4. parquet列式文件实战

    前言 列式文件,顾名思义就是按列存储到文件,和行式存储文件对应.保证了一列在一个文件中是连续的.下面从parquet常见术语,核心schema和文件结构来深入理解.最后通过java api完成writ ...

  5. Elasticsearch java api 基本搜索部分详解

    文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...

  6. 运行时动态库:not found 及介绍-linux的-Wl,-rpath命令

    ---此文章同步自我的CSDN博客--- 一.运行时动态库:not found   今天在使用linux编写c/c++程序时,需要用到第三方的动态库文件.刚开始编译完后,运行提示找不到动态库文件.我就 ...

  7. hdu 1496 Equations hash表

    hdu 1496 Equations hash表 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1496 思路: hash表,将原来\(n^{4}\)降 ...

  8. 项目实战8—tomcat企业级Web应用服务器配置与会话保持

    tomcat企业级Web应用服务器配置与实战 环境背景:公司业务经过长期发展,有了很大突破,已经实现盈利,现公司要求加强技术架构应用功能和安全性以及开始向企业应用.移动APP等领域延伸,此时原来开发w ...

  9. 可以在手机上看电脑本地html步骤,我自己总结的哦!

    1.打开控制面板 2.打开程序和功能 3.打开或关闭功能 4.internet信息服务展开后里面所有的都要选中 5.回到桌面,然后右键计算机,选择'管理' 6.先在E盘或者D盘创建一个文件夹,自己随意 ...

  10. .9-浅析webpack源码之NodeEnvironmentPlugin模块总览

    介绍Compiler的构造比较无趣,不如先过后面的,在用到compiler的时候再做讲解. 这一节主要讲这行代码: // 不管这里 compiler = new Compiler(); compile ...