到达黄姚汽车站再做公交车,依照个人口味做了删减)

酒吧

参考

场景:

  有一家合作社, 里面有一个伙计, 售货员当然是要卖东西的啊,
客户进来买完东西, 找售货员结账, 那售货员得领会一起多少钱啊?

一. 起首设计

  商品类:

package org.elvin.strategy;

/***/
public class Goods {
    /**
     * 商品名
     */
    private String name;

    /**
     * 商品价格
     */
    private Long Price;

    public Goods() { }

    public Goods(String name, Long price) {
        this.name = name;
        Price = price;
    }

    //region getter / setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getPrice() {
        return Price;
    }

    public void setPrice(Long price) {
        Price = price;
    }
    //endregion
}

 

是因为价位我使用的是 Long 类型, 所以, 要有一个更换输出的方法.

package org.elvin.strategy;

import java.text.MessageFormat;

public class MoneyUtils {
    public static String getYuan(Long money){
        Long yuan = money / 100;
        Long jiao = money % 100 /  10;
        Long fen = money % 10;

        return MessageFormat.format("{0}.{1}{2}", yuan, jiao , fen );
    }
}

售货员:

package org.elvin.strategy;

import org.elvin.strategy.calculator.*;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * 环境角色(Context)*/
public class Seller {

    /**
     * 姓名
     */
    private String name;

    /**
     * 编号
     */
    private String code;

    //region getter / setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
    //endregion

    /**
     * 售卖商品
     */
    public void sellGoods(List<Goods> goods){
        Long sum = 0L;
        for (Goods good : goods) {
            sum += good.getPrice();
        }
        System.out.println("应付款: " + MoneyUtils.getYuan(sum) + " 元");
    }

    @Test
    public void func1(){
        List<Goods> goods = new ArrayList<>();
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("饼干", 250L));
        goods.add(new Goods("辣条", 300L));

        sellGoods(goods);
    }
}

来看一下计量结果:

图片 1

获取结果了, 没啥毛病, 挺好. 

明天首席营业官娘过生日, 突然想到, 要不要再店里搞个移动, 来个降价活动,
有些商品让利销售. 

前几日业主过生日, 主任娘说, 老娘喜笑颜开, 你打折销售, 前些天自我来个免单销售.

那现在咋做呢? 后天过后, 价格一定又要回升到正规价格.  what the fuck! 

Seller类写死了, 难道我在中间加多少个总结形式? 

加进去貌似可以缓解当时问题, 可是, 后天假设业主的老丈人过生日吗? 咋搞?

 

Ok, 到此处, 大致, 需求请出明日的大神 : 策略方式.
让他来帮大家解决这么些题目吧.

 

二. 设计改造

对此售货员来说, 她非得明白, 明日该怎么计算价格, 是有过之而无不及依然不打折,
或者是满多少钱, 送东西怎么的. 

那就是说, 将这么些让利或者说价格的计量方式抽象出来, 成为一个接口或者抽象类. 

让优惠或者不降价完成或者一而再他.

心想事成格局:

那边, 我将她抽象为一个接口

package org.elvin.strategy.calculator;

import org.elvin.strategy.Goods;

import java.util.List;

/**
 * 抽象策略角色(Strategy)
 * 优惠接口
*/
public interface PreferentialPrice {
    public void getPrice(List<Goods> goods);
}

PreferentialPrice 需要作为一个属性,出现在 Seller 类中.

在Seller中加入

    /**
     * 计算优惠后的价格
     * 抽象角色, 次角色给出所有具体策略类所需的接口
     */
    private PreferentialPrice preferentialPrice;

    public PreferentialPrice getPreferentialPrice() {
        return preferentialPrice;
    }

    public void setPreferentialPrice(PreferentialPrice preferentialPrice) {
        this.preferentialPrice = preferentialPrice;
    }

 

此间提供三种统计方法:

  1. 好端端艺术

    /**

    • 现实政策角色(ConcreteStrategy)
      */
      public class NoPreferential implements PreferentialPrice {

      @Override
      public void getPrice(List goods) {

       Long sum = 0L;
       for (Goods good : goods) {
           sum += good.getPrice();
       }
       System.out.println("应付款: " + MoneyUtils.getYuan(sum) + " 元");
      

      }
      }

  2. 免单方式

    /**

    • 切切实实策略角色(ConcreteStrategy)
      */
      public class Free implements PreferentialPrice {
      @Override
      public void getPrice(List goods) {

       System.out.println("免单, 不要钱 !");
      

      }
      }

  3. 部分降价格局

    /**

    • 具体政策角色(ConcreteStrategy)
      */
      public class ReduceSomeGoods implements PreferentialPrice {

      @Override
      public void getPrice(List goods) {

       Long sum = 0L;
       for (Goods good : goods) {
           switch (good.getName()) {
               case "泡面":
                   sum += good.getPrice() - 50L;
                   break;
      
               case "火腿":
                   sum += good.getPrice() - 20L;
                   break;
      
               case "鸡蛋":
                   sum += good.getPrice() - 10L;
                   break;
      
               default:
                   sum += good.getPrice();
                   break;
           }
       }
       System.out.println("应付款: " + MoneyUtils.getYuan(sum) + " 元");
      

      }
      }

  

 将Seller类中, 计算的不二法门修改一下:

    public void sellGoods(List<Goods> goods){
        if(preferentialPrice == null){
            setPreferentialPrice(new NoPreferential());
        }
        preferentialPrice.getPrice(goods);
    }

在测算的时候, 即使没有传到促销, 则默许使用无打折格局

再看测试方法:

    @Test
    public void func1(){
        List<Goods> goods = new ArrayList<>();
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("饼干", 250L));
        goods.add(new Goods("辣条", 300L));

        setPreferentialPrice(new Free());
        sellGoods(goods);
        System.out.println("-----------------------");
        setPreferentialPrice(new ReduceSomeGoods());
        sellGoods(goods);
        System.out.println("-----------------------");
        setPreferentialPrice(new NoPreferential());
        sellGoods(goods);
    }

结果:

  图片 2

策略形式作为一种对象行为格局, 在那里应该仍旧显示到了吧.

那统计一下?给个不易于精晓(网上抄的):

  策略格局属于对象的行事情势。其用意是针对性一组算法,将每一个算法封装到具备协同接口的独自的类中,从而使得它们得以互相替换。策略情势使得算法可以在不影响到客户端的图景下发生变化。

说的比较空虚, 来个有血有肉的啊:

  一帅哥喜欢约妹子, 那咋约出来吗? 不是有着的三妹都爱不释手进食看视频吧.
那针对差其余妹子, 使用不一样的情势来约. 约喜欢看电影的阿妹看电影,
约喜欢吃小吃的妹妹吃小吃.

那吃饭, 看电影, 吹海风…… 等等, 那一个手段,
目标都是为了让二嫂做她女对象(这里不琢磨时间). 目标不变, 手段司空见惯.
这个办法, 就可以通晓为差其他 strategy. 

 

透过下面的例子, 可以见见, 具体的算法与算法之间没有信赖关系,
都是一如既往的(平等性), 可以并行替换的. 那在运转的时候,
每便都只能动用一种(唯一性). 

大水墨画师的少时时光

引入交叉熵代价函数

要化解上学进度下降的题目,我们需求从七个偏导数上面做作品。要么换一个代价函数,要么更换
\(\sigma\)
函数。那里,大家使用第一种做法,将代价函数更换为交叉熵函数(cross-entropy)。

率先用一个例子来介绍陆续熵函数。

倘诺大家有如下神经元:

图片 3

则陆续熵函数被定义为(那里假定 y 是个票房价值值,在 0~1 时期,那样才能跟 a
相搭):
\[ C=-\frac{1}{n}\sum_x{[y \ln a +
(1-y) \ln (1-a)]} \tag{57} \]
理所当然,直觉上看不出这几个函数能解决学习速率下跌的题材,甚至看不出那足以成为一个代价函数。

大家先表明为啥那个函数可以看做代价函数。首先,这么些函数是非负的,即
\(C>0\)(注意 \(a\) 的值在 0~1
时期)。其次,当神经元实际出口跟大家想要的结果接近时,交叉熵函数值会趋近
0。因而,交叉熵满意代价函数的焦点原则。

除此以外,交叉熵解决了学习速率下跌的题材。大家将 \(a=\sigma(z)\) 代入 (57)
式,并采取链式法则可以赢得(那里的 \(w_j\) 应该特指最后一层的参数,即 \(w_j^L\)):
\[ \begin{eqnarray} \frac{\partial
C}{\partial w_j} & = & -\frac{1}{n} \sum_x \left( \frac{y
}{\sigma(z)} -\frac{(1-y)}{1-\sigma(z)} \right) \frac{\partial
\sigma}{\partial w_j} \tag{58}\\ & = & -\frac{1}{n} \sum_x
\left( \frac{y}{\sigma(z)} -\frac{(1-y)}{1-\sigma(z)}
\right)\sigma'(z) x_j. \tag{59}\end{eqnarray} \]
化简上式并将 \(\sigma(z)=\frac{1}{1+e^{-z}}\)
代入后获取:
\[ \frac{\partial C}{\partial
w_j}=\frac{1}{n}\sum_x {x_j(\sigma(z)-y)} \tag{61} \]
本条表明式正是我们想要的!它标志,学习速率由 \(\sigma(z)-y\)
控制,也就是说,当误差越大时,学习速率越快。而且防止了 \(\sigma'()\) 导致的就学速率下跌的题材。

类似地,大家可以测算出:
\[ \frac{\partial C}{\partial
b}=\frac{1}{n}\sum_x{(\sigma(z)-y)} \tag{62} \]
当今,大家将陆续熵应用到前边的事例中,看看神经元的练习有如何变动。

先是是权重和谬误的初步值为 0.6 和 0.9 的例子:

图片 4

可以见到网络的陶冶进程近乎完美。

然后是权重和偏差开始值均为 2.0 的事例:

图片 5

那四次,正如我们希望的那样,神经元学习得越发快。

那五次试验中,选拔的学习率是
0.005。事实上,对于不一样的代价函数,学习率要作出相应的调动。

地点对交叉熵函数的议论都只针对一个神经元,其实很容易将它延伸到多层神经元的网络布局。借使
\(y=y_1, y_2, \dots\)
是想要的网络出口,而 \(a_1^L, a_2^L,
\dots\) 是网络的骨子里出口,则 cross-entropy 函数可以定义为:
\[ C=-\frac{1}{n}\sum_x \sum_y {[y_j
\ln a_j^L + (1-y_j) \ln(1-a_j^L)]} \tag{63} \]
好了,介绍了如此多,那大家如曾几何时候用平方差函数,哪天用交叉熵呢?小编给出的看法是,交叉熵大概连接更好的接纳,而原因也跟上文提到的同一,平方差函数简单在开班的时候碰到磨练速率较慢的题材,而交叉熵则没有那种烦扰。当然,那几个题目应运而生的前提是平方差函数中用了
sigmoid 函数。

前言:

  先不管方式, 把她和她的名字都忘了, 来看看问题 和 设计思路.
为什么要那样做. 

小剧场

(本文是基于
neuralnetworksanddeeplearning
那本书的第三章Improving the way neural networks
learn
整治而成的读书笔记,依照个人口味做了除去)

黄姚夜色

交叉熵函数(cross-entropy)

实际上生活中,大家都会有那般的经验:当碰到错误的时候,往往是大家学到东西最多的时候,而只要大家对自己的不当模糊不清,进步反而会变慢。

同样地,我们盼望神经网络可以从错误中更快地上学。那实在意况是如何的呢?来看一个简便的例子。

图片 6

以此事例只包涵一个神经元,并且唯有一个输入。大家会练习那个神经元,使得:当输入为
1 时,输出为 0。大家将权重和偏差分别初阶化为 0.6 和 0.9。当输入为 1
时,网络出口为 0.82 (\(\frac{1}{1+e^{-1.5}}
\approx
0.82\))。大家选择平方差函数来操练网络,并将学习率设为 0.15。

本条网络其实已经落伍成一个线性回归模型。上面用一个卡通来演示网络的教练进度:

图片 7

从中大家得以看看,神经元火速地读书参数,最终输出 0.09 (已经很类似 0
了)。现在,我们将参数和错误开首化为 2.0,网络的先河输出为 0.98
(跟我们想要的结果偏离甚远),学习率依旧为
0.15。看看这次网络会什么学习:

图片 8

虽说学习率和上次同样,但网络一发轫上学的快慢却很慢,在最开端的 150
次学习里,参数和错误大约没有改动,之后,学习进程突然增进,神经元的输出飞速降到接近
0.0。那一点很令人差别,因为当神经元的出口严重错误时,学习的快慢反而不是很快。

上边我们要求通晓问题爆发的起点。神经元在教练的时候,学习进程除了受学习率影响外,还受偏导数
\(\partial C/ \partial w\) 和 \(\partial C / \partial b\)
影响。所以,学习进度很慢,也就是偏导数的值太小。按照
\[ C=\frac{(y-a)^2}{2} \tag{54}
\]
(其中,\(a=\sigma(z)\),\(z=wx+b\)),大家得以求出(下边七个姿态中,已经将
x 和 y 的值替换为 1 和 0):
\[ \frac{\partial C}{\partial w} =
(a-y)\sigma'(z)x=a\sigma'(z) \tag{55} \]

\[ \frac{\partial C}{\partial b} =
(a-y)\sigma'(z)=a\sigma'(z) \tag{56} \]

要想深切掌握那多少个姿态,大家要求回想一下 sigmoid 函数的始末,如下图:

图片 9

从函数图像大家可以发现,当函数值接近于 1 或 0 时,函数导数趋于
0,从而造成 (55) 和 (56) 多个姿态的值趋于
0。那也是为什么神经元一初阶的求学速率会那么慢,而当中有些学习进程会忽然升高。

西塘一角

这个方法包蕴:

过三人会以为长汀最美的时候是夜晚的夜色,色彩斑斓,和建筑结构的碰撞,妙不可言。但自己个人最欢畅的是早上的青山绿水,越发在六点多时候,整个景区灯光都照亮,上苍还有稍稍亮光的时候,晚霞与夜的重组,白天和黑夜的交接,像极了一张壁画。

  • 更好的代价函数:交叉熵(cross-entropy)函数
  • 四种标准方法:L1L2dropout以及数据集的人工增广
  • 一种更好的早先化权值的方法
  • 一密密麻麻选拔 hyper-parameters 的诱导策略
  • 其余部分小技巧

图片 10

Softmax

前一节中,大家任重先生而道远介绍了接力熵怎么样缓解操练进程回落的题材,这是从代价函数的角度思考问题。其实,大家还有另一种格局,那就是更换
\(\sigma()\)
函数。那里要简单介绍一个新的 \(\sigma()\) :Softmax。

Softmax 的意义和 sigmoid 类似,只但是前者的函数形式是如此的:
\[
a_j^L=\frac{e^{z_j^L}}{\sum_k{e^{z_k^L}}} \tag{78} \]
⚠️分母是所有出口神经元的总和。那意味,经过 Softmax
函数后,所有神经元的输出会展现出概率分布的样式。

图片 11

当增大其中一个神经元输出时,其余神经元的输出值会变小,而且变小的总数十分前者增加的值。反之亦然。那是因为所有神经元的输出值总和始终为
1。

此外,Softmax 的出口始终为正值。

文:五十年过去了  大家都老了  还是能写信给你  真的很欢悦

英:还记得那封信吗  我毕生都并未拆迁  可自我用毕生读懂了它 西塘都没变
然则世界变的好快啊

文:西塘也变了 和那个世界一样拥有的都变

Softmax 解决学习速率下跌的问题

那三次,大家定义一个 log-likelihood 代价函数,通过它来打听 Softmax
怎么样化解 learning slowdown 的问题。

log-likelihood 的函数情势为:
\[ C \equiv -\ln a_y^L \tag{80}
\]
先解释一下 \(a_y^L\),比方说,在
MNIST 数据汇总,大家要咬定一张图片属于 10
类中的哪一种,那么,输出结果应当是一个 10 维的向量 \(a^L\),而实在结果则是数字 \(y\),比如 7。那么,\(a_y^L\) 则表示 \(a_7^L\)
那些项对应的概率值有多高。若是概率值(靠近
1)越高,声明估量结果越正确,那么 \(C\) 的值就越小,反之越大。

有了代价函数后,大家照例求出偏导数:
\[ \frac{\partial C}{\partial
b_j^L}=a_j^L-y_j \tag{81} \]

\[ \frac{\partial C}{\partial
w_{jk}^L}=a_k^{L-1}(a_j^L-y_j) \tag{82} \]

那里不设有类似 sigmoid 导数那样使学习速率下落的状态。

(写到这里的时候,我忽然发生一个迷惑:不管是那里的
Softmax,照旧的穿插熵,大家都只是对最终一层的导数和不是求了偏导,但后面层的偏导数却尚未测算,怎么能自然前边层的偏导就不会遇到
\(\sigma'()\) 趋于 0
的题目吗?要驾驭,依照 BP 算法的公式,误差有这么的传递公式:\(\delta^l\)=\(((W^{l+1})^T \delta^{l+1}) \odot
\sigma'(z^l)\),注意,这里照旧会产出 \(\sigma'()\),而前面层的权重和偏差的偏导数又是基于那一个误差统计的,那样的话,前边层的读书速率下跌的题材不如故没解决吧?那些问题先暂时放着,看看之后小编有没有解答。)

写了那样多,大家又要问一个像样的题目:什么日期用 sigmoid 和
cross-entropy,几时用 softmax 和
log-likelihood。事实上,大多数状态下那多少个拔取都能带来不错的结果,当然,固然想要输出结果显示概率分布的话,Softmax
无疑会更好。

乌镇夜色

上一章中,大家明白了神经网络中最要害的算法:后向传来算法(BP)。它使得神经网络的操练成为可能,是别的高级算法的根基。先天,大家要接二连三学习其余艺术,那些主意使得网络的磨炼结果更好。

图片 12

陆续熵到底是怎样,它是怎么来的?

这一节中,我们想理解,首个吃螃蟹的人是怎么想到交叉熵函数的。

设若大家发现了上学速率下跌的发源在于 \(\sigma'(z)\)
函数,大家要什么样解决这么些题目呢?当然,方法有无数,那里大家着想那样的笔触:是还是不是能找一个新的代价函数,将
\(\sigma'(z)\)
那一个项消掉?如果大家盼望最后的偏导数满意下边的款型:
\[ \frac{\partial C}{\partial w_j}=x_j
(a-y) \tag{71} \]

\[ \frac{\partial C}{\partial b}=(a-y)
\tag{72} \]

那三个偏导数能使神经网络在误差越大时,磨炼进程越快。

想起 BP 的七个公式,可以收获:
\[ \frac{\partial C}{\partial
b}=\frac{\partial C}{\partial a}\sigma'(z) \tag{73} \]
这里的 \(\sigma()\) 函数选择的是
sigmoid,所以 \(\sigma'(z)=\sigma(z)(1-\sigma(z))=a(1-a)\),将那一个姿势代入
(73) ,得到:
\[ \frac{\partial C}{\partial
b}=\frac{\partial C}{\partial a}a(1-a) \]
跟我们最终的对象 (72) 式相比较,须求满意:
\[ \frac{\partial C}{\partial
a}=\frac{a-y}{1(1-a)} \tag{75} \]
对 (75) 举办积分后,便赢得:
\[ C=-\frac{1}{n}\sum_x{[y\ln
a+(1-y)\ln(1-a)]}+constant \tag{77} \]
迄今甘休,我们早就生产了接力熵函数的款型。

理所当然啦,交叉熵真正的发源是音讯论,更切实的介绍超出了本课程的框框,所以就不再深刻了。

Day4

西塘夜色

黄姚夜色

图片 13

黄姚夜景

山高水长,哪日在周庄,不约而遇,再叙。

乌镇夜色

:大家在西溪那天中午订的旅社,我锲而不舍订在离开景区不远的一处公寓,朋友想订在景区内部的民宿,价格上差了一点倍。景区外酒店是98/晚,景区内是400/晚以上不等。后来我们决定分别体验,结果景区内的民宿客满了。

图片 14

长汀夜色

木心美术馆

:马那瓜火车站坐车到桐乡火车站,下了火车之后,有一班直达西塘小车站的公交车,5/人。到达长汀汽车站再做公交车,便可抵达景区门口。

小店窗户

周庄夜色

夕阳泛舟

图片 15


图片 16

图片 17

周庄分为东栅和西栅,东栅属于比较安静,还从未太多付出,西栅通过开发从此,游客相比多,景象也比东栅更美妙。本次西塘之行因为相当原因只去了西栅,没有逛东栅也变成遗憾,那也是自己专门想再回黄姚原因之一。从景区大门到西栅还需求一趟船,大家坐船的岁月基本上中午四点多,太阳快要落山。船上客人熙熙攘攘,相比较湖面愈发平静,船夫不时地吆喝,望着岸上的人家,分外美好。“小乔流水人家”在越发时刻是最好的形容词了。对于周庄印象最深不是江南水乡的修建,而是当地人的纯朴。在周庄,并没有像置身于异乡的局促感,景区内包罗镇上的居住者,店家都会笑脸相迎,那种热情不包罗任何功利关联,是发自内心的收纳与欢迎。对待,大城市的旅途总会有种距离感和生疏感,做不到确实的忘我。

黄姚夜景

西塘一角

黄姚特色小吃——黑米糍

图片 18

图片 19

图片 20

图片 21

图片 22

图片 23

图片 24

图片 25

图片 26

那一年《似水年华》热播,黄磊先生和刘若英爆红同时,也让世人感受到西塘长远的魅力。小乔曲巷,骑牛少年,浣纱姑娘,无不令人憧憬。西塘的美,就像从壁画上走出来的,落落大方,一眼难忘。时光荏苒,黄磊先生从当年小鲜肉变成方今的父辈,每年会如期插手西塘戏剧节,奶茶刘若英照旧乌镇的形象代言人。每年都有很多剧组入驻拍摄,《红楼梦》《奶娘》《旗袍》等很多杰出小说也落地于此。

图片 27

图片 28

图片 29

Tips:提议享受型游玩的意中人可以住在西栅景区内,就算标价略贵,但体验完全不等同的。同时,到景区门口给店老板打电话,基本都会出来接,免门票费,还能逛到尽兴,不会有末班船的限量。东栅门票是120/人,西栅门票是150/人,行程相比赶的对象可以买东西栅门票200/人,白天逛东栅,晚上游西栅。联票隔天无效。

图片 30

西塘夜景

美如画

图片 31

图片 32

赤坎的店堂很有风味,有那些还原了建筑本身的古朴味。在此间,你会突然走进某个电视机剧的情景里,如梦如幻。夜里,下起淅淅沥沥小雨,雨珠打在石板上,声音清脆又空灵,八月的南方古城,诉说着之前的时光。走到尽头的一座桥上,酒吧里的歌唱家唱着《花房姑娘》,大家听得如痴如醉,进去一看,是个黑人朋友,四处洋溢着惊喜。

图片 33

固然在黄姚只待了一天一夜,可是拥有回忆却是永生难忘。我想,我会再去的,带上爱人去寻找有关西塘更加多点滴。卢布尔雅那西塘六日的远足,除了体验特别,还有身边人的陪同,一个人旅行和同伴的远足不可比较,你多了足以享受的对象,也多了千千万万旅行上的不快和争议。但具备东西的最后归宿都是好的,所以,我很肯定那句话,想询问一个人,那就去旅行吗。

相关文章