解读设计模式—-单例模式(Singleton Pattern)

ID3 算法的优势及不足

它们是有关现有属性的有限离散值函数的一个整体空间。但是当遍历决策树空间时,ID3
仅维护单一的当下如果,这样就去了象征拥有同一而带来的优势,而且ID3
算法在摸着莫进行回顾,每当在塑造之之一一样层次选择了一个属性进行测试,它不会见再回想重新考虑这个选项,所以它爱让无回溯的登山搜索中之普遍风险影响:收敛到部分最优秀的答案,而休是全局最优异的。

1网球 1private void ratingToolStripMenuItem_Click(object sender, EventArgs e)
2网球 2网球 3网球 4{
3网球 5    ratForm rat = new ratForm();
4网球 6    rat.MdiParent = this;
5网球 7    rat.Show();
6网球 8
7网球 9}

处理决定树学的常见问题

避超负荷拟合数据

对此一个只要,当是其他的设对教练多少样例的拟合比它不同,但实在在实例的方方面面分布着见得也再度好经常,我们说这只要过度拟合。

免决策树学着之忒拟合的主意给分成两近乎:

  • 赶早停止树增长,在ID3算法完美分类训练多少之前就是停下树增长。
  • 继修剪法:即允许树过度拟合数据,然后对这培训进行后修剪。

在实践中证实第二种办法后修剪更加成功的施行规则:

1:使用和训练样例截然不同之等同套分离的样例,来评估通过后修剪方法从树上修剪结点的效果。

2:使用所有可用数据进行训练,但是进展统计测试来估算扩展(或修理)一个特定的结点是否生或改善以教练集合外的实例上之属性。

3:使用一个明确的正经来衡量训练样例和决策树的复杂度,当这编码的长短最小时停树增长。

联合连续值的属性

咱早期的ID3定义被限也取离散值的特性。所以,我们好事先管连续值属性的值域分割为离散的距离集合。例如,对于连续值的属性A,算法可以动态的创始一个初的布尔属性Ac,如果A<c,那么Ac为确实,否则也假。这样,就管连续值的性能之值离散化了。

特性选择的旁度量标准

发一些不过的事例里,采取信息增益来作挑选树之结点的优先性,有时就株树虽然可可以的分类训练多少,但是于实例的数据的性质非常不同,不是一个格外好之预测器。所以我们选取了新的量标准:增益比率。增益比率的乘除办法先稍微过,这个自家于末端的总里会详细的执教到。

处理缺少属性值的教练样例

  1. 赋给属性A决策结点n的训样例中该属性之无比常见值。
  2. 否属性A的每个可能价值与一个概率。

拍卖不同代价的特性

在一些学习任务中,实例的性能可能与代价相关。例如,在攻分类疾病经常,我们也许坐这些性来叙述患者:体温、活组织切片检查、脉搏、血液化验结果等,这些性在代价方面差距很大。对于这么的天职,我们以优先选项尽量采取低代价属性的决策树,通过引入一个代价项到性选择度量中,我们得以用信息增益除以属性的代价,这样咱们就算好假设没有代价的性能会让优先选项。仅当得发出可靠的分类时我们才乘高代价属性。

 一、单例模式图
      保证一个近似闹还仅生一个实例,并提供一个造访它的全局访问点。

仲裁树学之算法ID3

主干的ID3算法通过自顶向下组织决定树来进展学习。构造过程是起“哪一个性能将从今养之根结点被测试?”这个题材开始之。我们下统计测试来规定各一个实例属性单独分类训练样例的力量。分类能力最好的性(即信息增益最老的性质)被选作树的根结点的测试。然后为根本结点属性的每个可能价值产生一个岔,并把训练样例排列到当的分之下。然后再次整个经过,用每个分支结点关联的训练样例来选择在该点被测试的特等属性。这形成了针对性合格决策树的贪欲搜索,也就算是算法从不回溯重新考虑以前的选取。

熵:表示了任意样例集的纯度。

假定S为训练集,S的对象属性C有m个可能的类标号值,C={C1,C2,C3…Cm},每个类标号值相应的票房价值为p1,p2,p3…pm。那么训练集S的音讯熵定义为:Entropy(S)=Entropy(p1,p2,,,,pm)=-(p1*log2(p1)+p2*log2(p2)+pm*log2(pm));

消息增益:一个属性的信增益就是出于采取是特性分割样例而造成的冀望熵降低。

使训练集为S,并为此属性A来划分S,那么属性A的音增益Gain(S,A)为训练集S的熵减去按照属性A划分S后底子集的熵,即Gain(S,A)
= Entropy(S) – Entropy_A(S)。

Entropy_A(S)=abs(Si)/abs(S)Entropy(Si)(Si代表描述属性A的相距散值的汇聚,abs(Si)表示属性A当前这价的个数)

    
通过单例模式的引入,改善了序的计划性,在窗体调用处只需要通过全局访问点这个静态方法就足以获得唯一的实例对象,然后调用其Show()方法,就达了咱们的求。

自今日上马,坚持每天读书一个机器上的初知识,加油!

老三、示例解说单例模式
      看看下面这简单的演示:

决定树学之适用问题

  • 实例是由于“属性-值”对(pair)表示的
  • 靶函数具有离散的输出值
  • 恐用析取的描述
  • 教练多少可涵盖错误
  • 训练多少足以蕴涵缺少属性值的实例

季、真实项目面临之单例
     
我既做了一个网球场的军事管制体系,客户要求利用C/S,(随便PS下客户,在自家举行需求的时节建议客户做B/S系统,管理暨配备就够呛有益于,也未用带达几百M的.NET
Frameworks去作于客户电脑及了。可好心讨不了客户之一颦一笑,他身残志坚说自是在让他举行网页,还说他若之是软件不是网页,汗过……..),在运C/S做程序的时节自己眷恋大家还遇到了这样的图景,无论是通过本扭点击还是菜单来导航,通常咱们是比如说下这样实现的:

表决树表示法

表决树通过将实例从根结点排列到有叶子结点来分类实例,叶子结点即为实例所属的分类。树上的各级一个结点指定了针对实例的某属性之测试,并且该结点的诸一个晚分支对应于该属性的一个恐怕价值。分类实例的道是从马上棵树之绝望节点开始,册数这个结点指定的特性,然后照让得实例的该属性对应之树枝为下移动,然后是进程又为新结点为清之子树上再。

网球 10

上画出了平等粒典型的习到的决策树,这颗决策树因天气情况分类“星期六上午是不是可由网球”。貌似很多机械上及数目挖掘的书籍提到这个决策树的时刻还是说之这事例,汗!不过呢,我们还足以依据当时颗决策树写来相应之表达式:

网球 11

    
通过单例模式的引入,私有了构造方法,并透过一个静态的法初始化静态字段,保证了近似的绝无仅有实例,方法GetInstance()就是单例的全局访问点。这样设计后虽由此GetInstance()方法就得矣是窗体的唯一实例。

决策树学

     
这样举世瞩目是无符合要求的,我们该好为每个窗体只能Show一个出,这时
单例模式
就能够派上用场了。要保证表面不可知缔造类的实例,才单例中不怕是由此安装构造方法为患得患失出private,所谓模式可说是一律栽设计套路,这里我们便抄来作画一蹩脚单例,设置构造方法私有,代码如下;

核定树学是行使最普遍的归纳推理算法有,是如出一辙种植逼离散值目标函数的主意,在这种方法中上学到之函数被代表也平粒决策树。

1网球 12private void ratingToolStripMenuItem_Click(object sender, EventArgs e)
2网球 13网球 14网球 15{
3网球 16    //ratForm rat = new ratForm();
4网球 17    //rat.MdiParent = this;
5网球 18    //rat.Show();
6网球 19    ratForm.GetInstance().Show();
7网球 20}

表决树学之概括偏置

要吃得一个教练样例的汇聚,那么普通发生过多决定树和这些样例一致。所以,要描述ID3
算法的综合偏置,应该找到她起持有同一的如中摘一个底依据。ID3从这些决策树被见面选取啊一个为?它会挑于利用简答到复杂的登山算法遍历可能的养空间时遇的首先单可承受之培育。总结的说,ID3归纳偏置的检索策略也:较短的培养于长之扶植优先;那些信息增益高之性更贴近根结点的培训优先。

为何缺的只要优先?

而物理学家优先选项行星运动简便易行的说明,而休用繁体的说,为什么?一种植解释是短假设的数据有限长假设的数据,所以找到一个缺失的但是与此同时和教练多少拟合的若的可能性比较小。相反,常常出广大非常复杂的要拟合当前的训练多少,但可无计可施对地泛化到后来底多寡。比如考虑决策树要,500个结点的决定树于5单结点的裁决树多得几近,如果给得一个20独教练样例的汇,可以预想会找到多500个结点的仲裁树和训练多少一致,而要一个5只结点的决定树为堪到的拟合这些数据当然是竟然的。所以我们见面信任5单结点的培育不太可能是统计巧合,因而优先挑选是5独结点的决策树的假设,而非拣500单结点的。

     
单例模式可保一个近乎产生且仅出一个实例,并提供一个走访它的大局看点.在程序设计受到,有许多情形要确保一个看似只能发出一个实例.从当时句话可观看,Singleton模式之中坚:如何决定用户使用new对一个近乎的实例构造器的人身自由调用。如何绕了正常的构造器,提供平等种机制来确保一个类就出一个实例?这当是近乎设计者的事,而不是使用者的义务。

核定树学之下列举

  • 根据疾病分类患者
  • 依据起因分类设备故障
  • 基于拖欠支付的可能分类贷款申请

 1网球 21public class SameSingleton
 2网球 22网球 23网球 24{
 3网球 25   //要想看静态字段,那静态构造器就率先实施
 4网球 26   public static readonly SameSingleton Instance;
 5网球 27        
 6网球 28网球 29   /**//// <summary>
 7网球 30   /// 静态构造器-初始化Instance
 8网球 31   /// 静态构造器-完成静态字段(Instance)的初始化
 9网球 32   /// </summary>
10网球 33  static SameSingleton()
11网球 34网球 35  网球 36{
12网球 37      Instance = new SameSingleton();
13网球 38  }
14网球 39
15网球 40网球 41  /**//// <summary>
16网球 42  /// 私有构造器
17网球 43  /// </summary
18网球 44  private SameSingleton()
19网球 45网球 46  网球 47{
20网球 48 
21网球 49  }
22网球 50}

 1网球 51namespace DesignPattern.Singleton
 2网球 52{
 3网球 53    public class Singleton
 4网球 54    {
 5网球 55        //静态私有属性
 6网球 56        private static Singleton instance;
 7网球 57
 8网球 58        /// <summary>
 9网球 59        /// 私有结构器–让类的使用者调用不顶这构造器
10网球 60        /// </summary>
11网球 61        private Singleton()
12网球 62        { }
13网球 63
14网球 64        public static Singleton Instance
15网球 65        {
16网球 66            get 
17网球 67            {
18网球 68                if (instance == null)
19网球 69                {
20网球 70                    instance = new Singleton();
21网球 71                }
22网球 72                return instance;  //返回的连年第一浅实例的对象
23网球 73            }
24网球 74        }
25网球 75    }
26网球 76
27网球 77    //测试类
28网球 78    class TestSingleton
29网球 79    {
30网球 80        public static void Main2(string[] args)
31网球 81        {
32网球 82            Singleton t1 = Singleton.Instance;
33网球 83            Singleton t2 = Singleton.Instance;
34网球 84            Console.WriteLine(object.ReferenceEquals(t1, t2) == true);
35网球 85        }
36网球 86    }
37网球 87}

 1网球 88private static ratForm ratf = null;
 2网球 89public static ratForm GetInstance()
 3网球 90网球 91网球 92{
 4网球 93   if (ratf == null || ratf.IsDisposed)
 5网球 94网球 95   网球 96{
 6网球 97      ratf = new ratForm();
 7网球 98      ratf.MdiParent = mainForm.ActiveForm;
 8网球 99   }
 9网球 100   return ratf;
10网球 101}

 1网球 102using System;
 2网球 103using System.Collections.Generic;
 3网球 104using System.Text;
 4网球 105
 5网球 106//多线程的Singleton模式实现
 6网球 107namespace DesignPattern.Singleton
 7网球 108网球 109网球 110{
 8网球 111    public class SingletonMultithread
 9网球 112网球 113    网球 114{
10网球 115        private static object lockHelper = new object();
11网球 116
12网球 117        private static volatile SingletonMultithread instane = null;
13网球 118        public static SingletonMultithread Instane
14网球 119网球 120        网球 121{
15网球 122            get 
16网球 123网球 124            网球 125{
17网球 126                if (instane == null)  //双检查
18网球 127网球 128                网球 129{
19网球 130                    lock (lockHelper)
20网球 131网球 132                    网球 133{
21网球 134                        if (instane == null)
22网球 135网球 136                        网球 137{
23网球 138                            instane = new SingletonMultithread();
24网球 139                        }
25网球 140                    }
26网球 141                }
27网球 142                return instane;
28网球 143            }
29网球 144        }
30网球 145        
31网球 146
32网球 147        //私有构造方法
33网球 148        private SingletonMultithread() 
34网球 149网球 150        网球 151{
35网球 152
36网球 153        }
37网球 154    }
38网球 155
39网球 156    class TestSingletonMultithread
40网球 157网球 158    网球 159{
41网球 160        public static void Main()
42网球 161网球 162        网球 163{
43网球 164            SingletonMultithread s1 = SingletonMultithread.Instane;
44网球 165            SingletonMultithread s2 = SingletonMultithread.Instane;
45网球 166            Console.WriteLine(object.ReferenceEquals(s1, s2) == true);
46网球 167        }
47网球 168    }
48网球 169}
49网球 170

    
我此是用的菜谱控件,通过点击打开新窗体。如果是如此问题即使应运而生了,每当我们点击一糟糕菜单上的食谱项就会见启动一个窗体,点几涂鸦就是会启动几个窗体。见下图:
网球 171

1网球 172private ratForm()
2网球 173网球 174网球 175{
3网球 176    InitializeComponent();
4网球 177}

     
这样的单例实现的本质平等于提供一个静态的习性字段,通过静态构造器来初始化这个属于性.因为要想访问静态字段,那静态构造器就率先实施,下面是代码示例:

 1网球 178网球 179/**//// <summary>
 2网球 180/// MSDN上Singleton模式的实现
 3网球 181/// </summary>
 4网球 182public class MsdnSingleton
 5网球 183网球 184网球 185{
 6网球 186   //声明的还要开展初始化
 7网球 187   public static readonly MsdnSingleton Instance = new MsdnSingleton();
 8网球 188        
 9网球 189网球 190   /**//// <summary>
10网球 191   /// 私有构造器
11网球 192   /// </summary>
12网球 193   private MsdnSingleton()
13网球 194网球 195   网球 196{
14网球 197   }
15网球 198}

上面总结源于MSDN WebCast

    
提供一个静态的私房属性,并提供get来促成一个概括的单例.此外我们尚可以通过静态只读属性来实现.看看下面是MSDN上提供的以身作则:

五、使用单线程Singleton模式要 –Singleton模式面临的实例构造器可以安装为protected以也许子类派生。
–Singleton模式相似不要支持ICloneable接口,因为就也许造成对只对象实例,与Singleton的企图违背。
–Singleton模式相似不要支持序列化,因为当时为起或导致多单对象实例,同样与Singleton模式之作用违背。
–Singleton模式只考虑到了对象创建的管住,没有考虑对销毁的田间管理。对于自带垃圾回收的平台可以考虑这点。

其中:private static volatile Singleton instance=null;
–volatile:保证一定平台的贯彻必须毫无去于新调整指令,保证对象组织的一个十分严厉的一一。

其次、单例模式UML图(该图来至http://www.dofactory.com/)
      网球 199

     
上面的落实全好达标单例模式的来意,保证一个好像才且发出一个实例,并提供一个大局看点.而及时当实际上应用我们还得注意一点,就是当多线程的调用.于这个,我们尚得管线程安全.要管线程安全其实呢是大简短就得兑现之,只需要经加锁和重复判断即便OK,下面是简约的多线程的线程安全的实现:

      通过一个静态方法来针对好静态属性的初始化;