精华内容
下载资源
问答
  • 如何用R建立多重线性回归模型(上)这篇文章中,我们已经给出了一个mpg和hp以及wt关系的多元线性模型模型建立前提是,我们认为自变量之间是没有相互影响的。但是有的时候,变量之间会相互作用,因而在模型中应该...

    如何用R建立多重线性回归模型(下)

    在如何用R建立多重线性回归模型(上)这篇文章中,我们已经给出了一个mpg和hp以及wt关系的多元线性模型。模型的建立前提是,我们认为自变量之间是没有相互影响的。但是有的时候,变量之间会相互作用,因而在模型中应该加入交互项,以之前的题目为例:模型的方程应写为
    y=β0+β1x1+β2x2+β3x1x2 y = \beta_0+\beta_1x_1+\beta_2x_2+\beta_3x_1x_2
    其中

    yy : mpg

    x1x_1 : hp

    x2x_2 : wt

    多出来的一项β3x1x2\beta_3x_1x_2 即为交互项。

    那么问题来了,在构建线性模型的时候,有没有什么方法可以判断有没有交互项?有的,大致有以下几种情况

    • 计算模型中每队自变量之间的相关系数rr​
    • 整体模型的F检验显著,而单个参数的T检验不显著
    • 参数的符号与预期的相反

    以我们之前的模型为例,它并没有出现三种情况的任意一张,所以我们可以不用加入交互项,但是,为了说明如何在R中构建含有交互项的多重线性回归模型,我们这里就假设模型是 :
    y=β0+β1x1+β2x2+β3x1x2 y = \beta_0+\beta_1x_1+\beta_2x_2+\beta_3x_1x_2
    这次的代码与上次的有些不一样(之后会解释)。我们先将mtcars数据集中的mpg,hp,wt列分别赋值给y,x1,x2

    > y <- mtcars$mpg   # 或者写成 y<- mtcars[,"mpg"],下同
    > x1 <- mtcars$hp
    > x2 <- mtcars$wt
    

    然后使用lm函数进行拟合,并将结果赋值给result

    result <- lm(y~x1+x2+x1:x2)
    

    这里,x1:x2表示X1和X2有交互作用

    使用summary函数查看拟合情况

    > summary(result)
    
    Call:
    lm(formula = y ~ x1 + x2 + x1:x2)
    
    Residuals:
        Min      1Q  Median      3Q     Max 
    -3.0632 -1.6491 -0.7362  1.4211  4.5513 
    
    Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
    (Intercept) 49.80842    3.60516  13.816 5.01e-14 ***
    x1          -0.12010    0.02470  -4.863 4.04e-05 ***
    x2          -8.21662    1.26971  -6.471 5.20e-07 ***
    x1:x2        0.02785    0.00742   3.753 0.000811 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    
    Residual standard error: 2.153 on 28 degrees of freedom
    Multiple R-squared:  0.8848,	Adjusted R-squared:  0.8724 
    F-statistic: 71.66 on 3 and 28 DF,  p-value: 2.981e-13
    
    

    首先查看p值,表明所有自变量对mpg都有显著作用,故拟合方程为:
    y=49.808420.12010x18.21662x2+0.027853x1x2(r2=0.8848) y = 49.80842-0.12010x_1-8.21662x_2+0.027853x_1x_2\quad (r^2 = 0.8848)
    注意:我们只需要对交互项系数进行检验(原假设H0:β3=0H_0 : \beta_3 = 0 ),而不必对一阶项进行检验[1]。因为如果交互作用存在,说明交互的几个自变量都是重要的。

    拟合模型的参数的95%Cl、残差分析和之前一元的方法一样(confint函数和plot函数)

    模型建立完之后,要用它进行预测,预测函数是predict函数。

    在这篇文章中,我是将三列分别赋值给三个不同的变量,而在(上)这篇文章我却是直接将这三列赋值给一个变量,这有什么区别吗?答案是有的,而且和接下来要说的predict函数有关。

    predict函数用法如下:

    predict(object, newdata, se.fit = FALSE, scale = NULL, df = Inf,
            interval = c("none", "confidence", "prediction"),
            level = 0.95, type = c("response", "terms"),
            terms = NULL, na.action = na.pass,
            pred.var = res.var/weights, weights = 1, ...)
    

    使用过程中,使用object, newdata两参数即可,其余的不用给出,函数会返回预测值以及其95%Cl。

    object :为拟合的内容,就是lm函数的结果,在上题中就是result

    newdata : 为dataframe类型数据,数据为要预测的值。

    以(上)这篇文章中的建立的多元元线性函数模型为例,现在我们要预测 x1 = 3,x2 = 4时候的数据

    > analysis_data <- mtcars[,c("mpg","disp","hp","wt")]
    > result <- lm(analysis_data$mpg~analysis_data$disp+analysis_data$hp+analysis_data$wt)
    > predict(result,newdata = data.frame(3,4))
    

    得到的结果为

           1        2        3        4        5        6        7 
    23.09547 21.78138 25.58488 20.02924 17.28996 18.88542 15.40745 
           8        9       10       11       12       13       14 
    21.65887 20.84992 18.55379 18.55379 15.14994 16.23929 16.07909 
          15       16       17       18       19       20       21 
    12.02179 11.89490 12.50221 27.84866 32.63195 30.24587 24.56317 
          22       23       24       25       26       27       28 
    17.57441 17.91776 15.03111 15.93596 29.53900 26.71871 28.56630 
          29       30       31       32 
    15.36033 19.52990 13.54587 22.31363 
    Warning message:
    'newdata'必需有1行 但变量里有32行 
    

    注意到警告信息’newdata’必需有1行 但变量里有32行

    现在我们用这篇文章中的方法,将三列分别赋值给三个不同的变量,然后拟合,最合利用得到的结果,对x = 3.2 时候预测

    > y <- mtcars$mpg   # 或者写成 y<- mtcars[,"mpg"],下同
    > x1 <- mtcars$hp
    > x2 <- mtcars$wt
    > result <- lm(y~x1+x2+x1:x2)
    > predict(result,newdata = data.frame(x1 = 3, x2 = 4))
    

    得到预测结果为 16.9158 。

    是不是很奇怪,似乎两种过程都一样,为什么第二个给出了预测值?

    我查了一下资料,说

    在lm函数的公式中,不要使用datasetname $ variablename模式引用变量。而是使用variablename + variablename …

    所以以后在用lm的时候,尽量不用$这种去变量的形式。这样可以避免报错。

    好了,关于如何用R建立多重线性回归模型就告一段落了。如果有什么问题,欢迎在下方评论区评论。同时也欢迎关注我的公众号,有理有数据。
    在这里插入图片描述

    展开全文
  • 面对一个新的知识体系,我们仅仅只依赖于感性思维和过去经历所累积下来的经验,而要理性的思考,这门学科是如何建立的、前人是如何探索学习这门学科的等等。理解了这种思维,才能一直保持学习效率上的高效。本篇...

    1.引言:
    学习学习再学习,这不是鸡汤,展开了讲是学习了学习的方法论再去学习。这是李笑来先生提倡的一种终身学习思维。

    面对一个新的知识体系,我们不应仅仅只依赖于感性思维和过去经历所累积下来的经验,而要理性的思考,这门学科是如何建立的、前人是如何探索学习这门学科的等等。理解了这种思维,才能一直保持学习效率上的高效。

    本篇文章介绍了一种高级语言学习模型,换句话说是我在学习C#的过程中搭建起来的一个知识框架。文章以C#中的委托为例,通过深入的剖析委托来解释这个模型。当然受限于我自己的知识存量,模型会有些不完善,欢迎各位的拍砖指正。

    2.高级语言学习模型图解:
    这里写图片描述

    基础语法:如C#语言中的基本数据类型,如何定义变量,对象与类型的概念,数组,类型强制转换,继承,封装,多态等基本概念。

    高级特性及应用:如C#中的泛型,集合,委托,lambda表达式,事件,LINQ,正则表达式等等。

    机器模型:在C#中若是专注于winform开发,则应该对windows API 或是操作系统有一个基本的认识,知道如何进行不同系统间的程序交互。
    若是专注于web开发,如:ASP.NET中基本的请求响应模型,ViewState原理。
    计算机网络的五层模型:物理层,链路层,网络层,传输层,应用层等。
    在这一阶段我们逐渐从语言在单一场景化的应用中脱离了出来,不再是一个只知道敲代码的程序猿了,而逐渐开始了解各种基本原理,知道了语言的高级特性的实现机制,知道了诸如像ASP.NET这些框架的实现原理。

    设计模式及原则:这一部分我的探究很少,现在主要在看《head first 设计模式》这本书,对于程序设计模式和原则,需要深厚的实践经验的积累,才能从中逐渐提炼出来抽象的原则,或是理解为何一门语言的复杂特性需要这样来实现。
    以SRP原则举例:
    SRP—即单一职责原则,该原则规定每个类都应该有一个责任,这个责任应该由类完全封装。
    它的所有服务应向责任侠义看齐。简单总结:一个类或模块应该有一个且只有一个理由去改变。

    原来我在看书《C#高级编程(第九版)》的时候其实一直很奇怪,在介绍.C#的一些新特性时,书中总是首先抛出一个基本类型,比如集合中的 List,这只是一个包含有集合这个概念的基本功能的类,如图所示:

    这里写图片描述

    要想对这个类进行扩充或者是需要具有某种特定行为特征的集合类时,
    如:队列(Queue),栈(Stack),链表(LinkedList),字典(Dictionary)和集(SortedSet,HashSet),
    总是以接口的方式来定义该行为特征,实现了指定单一责任的接口之后,也就完善了这个类应有的功能。如图示:

    这里写图片描述
    一些接口的说明:
    这里写图片描述

    在模型中的上下两个模块没有进行说明,是由于这需要一个实例来配合说明。在下面的深入剖析委托中,我会逐步的介绍这两个模块。

    3.深入剖析委托:

    委托属于C#这门语言的一个高级特性,并且可以说是最核心的高级特性之一。关于下述内容的撰写,有四个参考链接:
    

    1 2 3 4
    3.1 委托的定义:

    委托是对函数的引用。

    委托是一种类型安全的函数回调机制。

    从C语言开始就有使用函数指针来创建回调函数的用法(代码截图如下),到了C#,委托可以被视为一个更高级的指针,它不仅仅能把地址指向另一个函数,而且还能传递参数,返回值等多个信息。

    .Net还为委托对象自动生成了同步、异步的调用方式,我们只要使用 BeginInvoke、EndInvoke 方法就可以抛开 Thread 而直接使用多线程调用 。

    对于委托的说法有许多,但从本质上说委托仍旧是一个类,在C#中用delegate关键字声明一个委托:

    public delegate void Log();

    再次使用Reflector将这段代码反编译之后,就可以看到它的层次结构:
    这里写图片描述

    从图中可以很清晰的看出Log—>MulticastDelegate—>Delegate这种继承机制。

    尽管委托继承自System.MulticastDelegate类,但我们并不能显示地声明一个继承自System.MulticastDelegate类的委托。委托必须使用delegate关键字声明,编译器会自动为我们生成继承代码。

    由于委托的本质是类,所以可它就可以被定义在任何地方,既可以定义在类的内部,也可以定义在类的外部。

    那么既然委托也是一个类,那委托也是由四个部分组成:字段,属性,方法,事件。

    其中最重要的是这样的三个字段:
    这里写图片描述

    这里写图片描述

    3.2 委托的使用实例:

    如果看到这里,对于为什么要使用委托,以及委托的作用是什么还不是很清晰的话,可以参考这篇文章
    [把委托说透]http://www.cnblogs.com/kirinboy/archive/2009/08/26/intensive-delegate-1.html)

    现在我提供一个使用委托来传递函数方法的实例:

    通常我们使用冒泡排序时指的是对数字进行排序,即对定义过,“大于号、小于号”这类关系运算符的数据类型进行排序,排序代码如下:

    //冒泡排序写法1
            public static void Sort(int[] sortArray)
            {
                bool swapped = true;
                do
                {
                    swapped = false;
                    for (int i = 0; i < sortArray.Length - 1; i++)
                    {
                        if (sortArray[i] > sortArray[i + 1])
                        {
                            int temp = sortArray[i];
                            sortArray[i] = sortArray[i + 1];
                            sortArray[i + 1] = temp;
                            swapped = true;
                        }
                    }
                } while (swapped);
            }
    
    //顺便贴出来之前看过的一个比较**的冒泡排序写法 2:
            public static void BubbleSorterInInt(int[] sortArray)
            {
                int count = sortArray.Length - 1, lastChange, i = 0;
                while (i < count)
                {
                    lastChange = 0;
                    for (i = 0; i < count; i++)
                    {
                        if (sortArray[i] > sortArray[i + 1])
                        {
                            //不使用中间变量进行数据元素交换
                            sortArray[i] = sortArray[i] + sortArray[i + 1];//a=a+b
                            sortArray[i + 1] = sortArray[i] - sortArray[i + 1];//b=a-b
                            sortArray[i] = sortArray[i] - sortArray[i + 1];//a=a-b
                            lastChange = i;
                        }
                    }
                    i = 0;
                    count = lastChange;//判断是否进行了数组元素交换
                }
                //输出int数组
                for (int j = 0; j < sortArray.Length; j++)
                {
                    Console.Write(sortArray[j]);
                    Console.Write(",");
                }
            }

    那么现在问题来了,由于这种排序算法只能对int类型的数据管用,如果我想对其它数据类型的对象排序呢?难不成每次有了新的数据类型,都要新写一个排序函数吗?

    这样就太过麻烦了,并且每次都要修改已经封装好了的类,这样就不太好。所以我们考虑将冒泡排序写法1中的函数功能再次进行分离。

    如上述代码所示,函数功能可以表示成两个部分:
    1.判断数组中前后两个元素的大小,并决定谁先谁后;
    2.根据大小比较结果,改变数组中元素的顺序。
    据此我们可以将功能1交给使用者来实现,而改进后的冒泡排序只实现功能2。改进代码如下:

    //实现功能2的冒泡排序写法3
     public static void Sort<T>(IList<T> sortArray, Func<T, T, bool> comparison)
            {
                bool swapped = true;
                do
                {
                    swapped = false;
                    for (int i = 0; i < sortArray.Count-1; i++)
                    {
                        if (comparison(sortArray[i+1],sortArray[i]))
                        {
                            T temp = sortArray[i];
                            sortArray[i] = sortArray[i + 1];
                            sortArray[i + 1] = temp;
                            swapped = true;
                        }
                    }
                } while (swapped);
            }    

    从上述代码段中可以看出,功能1的实现是使用者通过传入自定义的comparison函数来实现的。

    其中:Func<T,T,bool> 是.NET Framework定义好的一个委托,“T,T”是传入的参数类型,bool是返回值类型。

    为了应用冒泡排序写法3,我们需要先自定义一个类:

        public class Employee
        {
            public Employee(string name,decimal salary)
            {
                this.Name = name;
                this.Salary = salary;
            }
    
            public string Name { get; private set; }
    
            public decimal Salary { get; private set; }
    
            public override string ToString()
            {
                return string.Format("{0},{1:C}", Name, Salary);
            }
    //实现比较该类型的两个对象的大小的功能
            public static bool CompareSalary(Employee e1, Employee e2)
            {
                return e1.Salary < e2.Salary;
            }
        }
    然后在控制台中进行输出:
    
    static void Main(string[] args)
    {
        Employee[] employees =
                {
                    new Employee("Bugs Bunny",20000),
                    new Employee("Elmer Fudd",10000),
                    new Employee("Daffy Duck",25000),
                    new Employee("Wile Coyote",1000000.38m),
                    new Employee("Foghorn Leghorn",23000),
                    new Employee("RoadRunner",50000)
                };
                BubbleSorter.Sort<Employee>(employees, Employee.CompareSalary);
    
                foreach (var employee in employees)
                {
                    Console.WriteLine(employee.ToString());
                }
                Console.ReadKey();
    }

    以上就已经实现了对一般类型对象进行排序的功能。
    在上述代码中我们应用到了委托来传入用户自定义的比较函数,通过比较函数返回的布尔值来判断比较中的对象谁先谁后。

    3.3 Action<T>和Func<T>委托
    泛型Action<T>委托表示引用了一个void返回类型的方法,该委托类存在许多变体,可以传递至多16中不同的参数类型。
    其中没有泛型参数的Action类调用没有参数的方法。

    泛型Func<T>可以以类似的方法使用。Func允许调用带返回参数的方法。与Action类似,Func也定义了不同的变体,至多也可以传递16个参数类型和一个返回类型。Func<out TResult>委托类型可以调用带返回类型的且无参数的方法。

    展开全文
  • 在本文中,我们介绍了一个框架,该框架用于确定应如何在组织内分配分析功能。 我们的框架强调了建立关键数量的分析人员,集中或分散分析人员以支持业务流程以及建立分析治理结构以确保整个组织都支持分析流程的重要...
  • 这就引出了一个问题,遗传方差应如何随时间变化? 人们会期望,在没有突变的情况下,选择会减少变异,因为合适的基因型将从人群中消失。 这种消失的速度以及消失本身很难描述。 为了对此进行调查,我建立了一个由...
  • 答:关于模型部分,我采用标准的两阶段方法,首先使用多因素模型来捕获隐含波动率表面的特征,然后建立时间序列模型来分析其行为。 至于编程部分,我使用matlab作为主要语言,其中一些软件包专门用于拟合函数,并且...
  • 针对问题一, 我们的目的是既要很好地满足同学们的需要又要节约用电, 于是就以用电量最低为目标函数, 以学生去上自习的可能性, 满座率等为约束条件, 引入0-1变量, 建立0-1规划模型, 然后运用LINGO软件求解得出应该...
  • 在这种情况下,公司应如何制定有效的门户策略? 鉴于农村经济发展不平衡和电信网络极低,互联网如何为那些正在数字化以支持和提高其商业价值的农业综合企业增值? 进行数字化有任何商业意义吗? 由独立发起人推动的...
  • 提供了一些用于去噪MRI-CEST图像的滤波器,包括我们开发的NLmCED滤波器和一些已建立的滤波器:BM3D,高斯和平滑三次样条方法。 提供了几个Z光谱数据集来测试脚本,包括: 通过模拟几种浓度的碘帕醇,半固体成分的pH...
  • [转]用Struts建立MVC应用的介绍

    千次阅读 2005-04-23 14:59:00
    本文讲述了如何用Struts建立MVC应用。Model 1 和Model 2简介我们在开发Web应用时经常提到的一个概念是Model 1/Model 2,那么到底它是什么意思呢?其实它是对采用JSP技术构成Web应用的不同模型的描述。下面对这个概念...
    本文讲述了如何用Struts建立MVC应用。

    Model 1 和Model 2简介

    我们在开发Web应用时经常提到的一个概念是Model 1/Model 2,那么到底它是什么意思呢?其实它是对采用JSP技术构成Web应用的不同模型的描述。下面对这个概念做一个简单的介绍。

    Model 1

    在使用JAVA技术建立Web应用的实例中,由于JSP技术的发展,很快这种便于掌握和可实现快速开发的技术就成了创建Web应用的主要技术。JSP页面中可以非常容易地结合业务逻辑(jsp:useBean)、服务端处理过程(jsp:scriplet)和HTML(<html>),在JSP页面中同时实现显示,业务逻辑和流程控制,从而可以快速地完成应用开发。现在很多的Web应用就是由一组JSP页面构成的。这种以JSP为中心的开发模型我们可以称之为Model 1。

    当然这种开发模式在进行快速和小规模的应用开发时,是有非常大的优势,但是从工程化的角度考虑,它也有一些不足之处:

    1. 应用的实现一般是基于过程的,一组JSP页面实现一个业务流程,如果要进行改动,必须在多个地方进行修改。这样非常不利于应用扩展和更新。
    2. 由于应用不是建立在模块上的, 业务逻辑和表示逻辑混合在JSP页面中没有进行抽象和分离。所以非常不利于应用系统业务的重用和改动。

    考虑到这些问题在开发大型的Web应用时必须采用不同的设计模式--这就是Model2

    Model 2

    Model 2 表示的是基于MVC模式的框架。MVC是Model-View-Controller的简写。"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。从而弥补了Model 1的不足。

    Model 2具有组件化的优点从而更易于实现对大规模系统的开发和管理,但是开发MVC系统比简单的JSP开发要复杂许多,它需要更多的时间学习和掌握。同时新东西的引入会带来新的问题(这让我想起来关于"自动计算"的一篇文章,中间提到为了降低系统的复杂度,却导致更高的复杂度)。

    1. 必须基于MVC组件的方式重新思考和设计应用结构。原来通过建立一个简单的JSP页面就能实现的应用现在变成了多个步骤的设计和实现过程。
    2. 所有的页面和组件必须在MVC框架中实现,所以必须进行附加地开发工作。

    MVC本身就是一个非常复杂的系统,所以采用MVC实现Web应用时,最好选一个现成的MVC框架,在此之下进行开发,从而取得事半功倍的效果。现在有很多可供使用的MVC框架,由于Struts有完整的文档并且相对来讲比较简单,所以用它开发MVC系统还是比较方便地。

    Struts的结构和处理流程简介

    Struts是Apache组织的一个项目,像其他的Apache组织的项目一样,它也是开放源码项目。Struts是一个比较好的MVC框架提供了对开发MVC系统的底层支持,它采用的主要技术是Servlet,JSP和custom tag library。获取它的使用版本和具体信息可以查阅 http://jakarta.apache.org网站。

    Struts框架的基本构成由下图所示:

    图 1 struts uml图
    图 1 struts uml图

    作为一个MVC的框架,Struts对Model、View和Controller都提供了对应的实现组件,对应上面的UML图,分别进行介绍,并且看看它们是如何结合在一起的。

    1. Controller:控制器的作用是从客户端接受请求,并且选择执行相应的业务逻辑,然后把响应结果送回到客户端。在Struts中Controller功能由图中ActionServlet和ActionMapping对象构成:核心是一个Servlet类型的对象ActionServlet,它用来接受客户端的请求。ActionServlet包括一组基于配置的ActionMapping对象,每个ActionMapping对象实现了一个请求到一个具体的Model部分中Action处理器对象之间的映射。
    2. Model: MVC系统中的Model部分从概念上可以分为两类--系统的内部状态,和改变系统状态的动作。Struts为Model部分提供了Action和ActionForm对象:所有的Action处理器对象都是开发者从Struts的Action类派生的子类。Action处理器对象封装了具体的处理逻辑,调用业务逻辑模块,并且把响应提交到合适的View组件以产生响应。Struts提供的ActionForm组件对象,它可以通过定义属性描述客户端表单数据。开发者可以从它派生子类对象,利用它和Struts提供的自定义标记库结合可以实现对客户端的表单数据的良好封装和支持,Action处理器对象可以直接对它进行读写,而不再需要和request、response对象进行数据交互。通过ActionForm组件对象实现了对View和Model之间交互的支持。Struts通常建议使用一组JavaBean表示系统的内部状态,根据系统的复杂度也可以使用像Entity EJB 和 Session EJB等组件来实现系统状态。Struts建议在实现时把"做什么"(Action)和"如何做"(业务逻辑)分离。这样可以实现业务逻辑的重用。
    3. View:Struts应用中的View部分是通过JSP技术实现的。Struts提供了自定义的标记库可以使用,通过这些自定义标记可以非常好地和系统的Model部分交互,通过使用这些自定义标记创建的JSP表单,可以实现和Model部分中的ActionForm的映射,完成对用户数据的封装,同时这些自定义标记还提供了像模板定制等多种显示功能。

    Struts框架的处理流程清楚的体现了MVC系统的特点,简单的Struts组件结构如图2所示。Struts Controller ActionServlet处理客户请求,利用配置的ActionMapping对象把请求映射到Action处理器对象进行处理。Action处理对象访问ActionForm中的数据,处理和响应客户请求,它还调用后台的Bean组件,这些组件封装了具体的业务逻辑。Action处理器对象根据处理结果通知Controller,Controller进行下一步的处理。

    图2 Struts框架的组件结构图
    图2 Struts框架的组件结构图

    利用Struts框架开发MVC系统要做的工作

    由于Struts已经为我们提供了一个非常好的MVC框架,我们利用Struts开发MVC系统时可以大大加快开发的速度。在开发时可以采用的一个开发流程如下(引自资料3):

    1. 收集和定义应用需求。
    2. 基于数据采集和显示的原则定义和开发"屏幕显示"需求 。
    3. 为每一个"屏幕显示"定义访问路径。
    4. 定义ActionMappings建立到应用业务逻辑之间的联系。
    5. 开发满足"屏幕显示"需求的所有支持对象。
    6. 基于每一个"屏幕显示"需求提供的数据属性来创建对应的ActionForm对象
    7. 开发被ActionMapping调用的Action对象。
    8. 开发应用业务逻辑对象 (Bean,EJB,等等)。
    9. 对应ActionMapping设计的流程创建JSP页面。
    10. 建立合适的配置文件struts-config.xml , web.xml。
    11. 开发/测试/部署

    具体在使用Struts框架时,对应各个部分的开发工作主要包括:

    1. Model部分:采用JavaBean和EJB组件,设计和实现系统的业务逻辑。根据不同的请求从Action派生具体Action处理对象。完成"做什么"的任务来调用由Bean构成的业务组件。创建由ActionForm 的派生类实现对客户端表单数据的封装。
    2. Controller部分:Struts为我们提供了核心控制部分的实现。我们只需要配置ActionMapping对象
    3. View部分:为了使用Model中的ActionForm 对象,我们必须用Struts提供的自定义标记创建HTML 表单。利用Struts提供的自定义标记库编写用户界面把应用逻辑和显示逻辑分离。Struts框架通过这些自定义标记建立了View和Model之间的联系。Struts的自定义标记还提供了很多定制页面的功能。
    4. 同时需要编辑两个配置文件:web.xml和struts-config.xml。通过它们配置Struts系统中的各个模块之间的交互。下面对这两个配置文件做一些介绍:

      web.xml文件的配置:

      web应用中的web.xml是第一个要配置的地方,它描述了系统的Controller对象。在web.xml中增加如下标记

      
      <servlet>
      	<servlet-name>action</servlet-name>
      <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
      	<init-param>
      		<param-name>application</param-name>
      	・・・・・・
      </servlet>
      

      说明:这个servlet对象就是Struts提供的Controller,还可以为它指定初始化参数,比如对系统应用属性的支持。

      
      <servlet-mapping>
      	<servlet-name>action</servlet-name>
      	<url-pattern>*.do</url-pattern>
      </servelt-mapping>
      

      说明:实现客户请求的url信息和服务器端具体处理的映射关系。

      
      <taglib>
      	<taglib-url>/WEB-INF/struts-bean.tld</taglib-url>
      	<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
      </taglib>
      ・・・・・・・
      

      说明:添加对Struts提供的应用所使用的自定义标记库的引用。

      struts-config.xml文件的配置:

      struts-config.xml是用于建立Controller和Model之间的关系的。它描述了Controller所使用的把请求对应到具体处理的法则,同时它还描述了客户提供的数据与ActionForm组件的对应映射关系。

      在struts-config.xml中增加如下标记

      
      <form-beans>
      	<form-bean name="loginForm" type="loginForm" />
      </form-beans>
      

      说明:<form-bean>标记描述一个具体的ActionForm子类对象,通过它和JSP页面中的自定标记的结合使用可以实现ActionForm和View之间的数据映射。

      
      <action-mappings>
      <action
      path="/login"
      type="loginAction"
      name="loginForm"
      input="/login.jsp" ・・・ />
      </action-mappings>
      

      说明:<action-mappings>标记描述了请求和处理的一对一映射关系。input和path属性唯一的标记了客户端的一个请求,name属性描述封装客户端的数据的ActionForm子类对象。Type属性描述处理这个请求的Action子类对象。

      通过对两个配置文件的配置,把Struts框架中MVC的各个部分联系起来,实现一个真正的MVC系统。

    可供参考的例子

    编写一个好的例子演示是比较占篇幅的,可以从 http://jakarta.apache.org/下载Struts最新的发表包,在这个包中有详细的用户帮助和API文档,还有非常好的演示程序可供参考。具体的安装步骤可以参考附带的文档。参考这些例子可以很快地理解如何利用struts框架开发MVC系统。

    参考资料

    1. The Struts User's Guide http://Jakarta.apache.org
    2. "Struts Tutorial" 作者:Stephan Wiesner 主页 www.stephanwiesner.de
    3. Struts系列文章 http://www.onjava.com/onjava/open_source/
    4. 《设计模式》Gamma 等四人

    关于作者
    赵晨希,一直集中在服务器端的程序开发上,喜欢用C++和Java编程,对新技术有极大的兴趣,目前个人兴趣在J2EE上和Open Source的项目上。希望和更多的爱好者交流。 Email: zhaochenxi@vip.sina.com
    展开全文
  • 虽然这可能是迈向更复杂系统的合适的第一步,但如果最终要开发出足够的系统,我们需要定义问责制系统最终瞄准的现实目标。 我们为开发充分限制信息使用的问责制规定了许多障碍。 有些问题完全是非技术性的; 有些...
  • 该项目是如何改善任何机器学习项目的两个部分(数据验证和模型评估)的示例。 目的是分享实用的想法,您可以在项目中相对简单地介绍这些想法,但仍能获得巨大的收益。 数据验证是确保数据存在,正确和有意义的过程...
  • 昨天讲到“驱动用户增长运营”的文章时,小编需要清醒地认识到,只有那些能够被激活的用户与商家有互动、长期留存、...在用户分层模型中,某一个用户在某一特定时间只属于一个用户层级。以生命周期阶段为依据的用户分

    昨天讲到“驱动用户增长运营”的文章时,小编需要清醒地认识到,只有那些能够被激活的用户与商家有互动、长期留存、消费,甚至主动为你做传播的用户,才是真正优质的、核心的、正在创造价值的用户。

    如何找到这群真正的优质核心用户呢?我们要做的第一件事就是分层。

    一、何为用户分层?
    用户分层是建立用户标签体系、用户分层体系和分层转化策略,实现商家精细化运营的目的。更是一种对用户进行标签划分的方法,通常用于描述某一用户的当前状态。

    在用户分层模型中,某一个用户在某一特定时间应只属于一个用户层级。以生命周期阶段为依据的用户分层方法。根据用户属性、行业属性等进行标签划分。常用的分法,如按性别、年龄、消费能力、地域或业务线等进行划分。

    在按用户标签做用户分层的过程中,我们需要以不同的“行为”的触发情况,标识用户的当前状态。以此判断用户正处于新增、活跃、留存、传播、付费的哪一个阶段。

    二、如何给用户分层?
    举几个例子:

    1)社群用户分层:

    第一层是新增访客,只要启动应用就算一个访客,访客中流失的记为流失访客;

    第二层可以标记为活跃用户,至少触发一次浏览事件的才算一个有效活跃,流失的记为流失参与者者;

    第三层标记为互动用户,有点赞评论的用户就是互动用户,流失用户记为流失使用者;

    第四层记为回访用户,以多次启动应用并且多次互动为标准,如果他们流失了,则记为流失高价值用户。

    2)积分商城用户分层:

    第一层是访客用户,以打开网站为基准,访客中流失的记为流失访客;

    第二层记为评估用户,以深度浏览或查看官网demo为准,流失的记为流失评估者;

    第三层标记为试用用户,以完成注册为标准,流失用户记为流失试用者;

    第四层记为付费用户,以完成合同流程为准,流失用户记为流失客户。

    在通兑吧积分商城系统中,在【用户管理】-【用户标签】栏目内,商家可以根据用户属性或用户行为,自动或手动给用户打上标签,帮助商家更快速了解用户,降低流失、提升活跃;
    操作步骤如下:
    ①点击新建标签,创建新的用户标签;
    ②依次输入标签名称、标签备注:
    ③选择打标方式,支持手动打标或自动打标。选择自动打标的,系统将在每日0点给已满足条件的用户打上标签
    ④添加打标条件,支持添加用户属性或用户行为。
    打标条件可以选择且、或两种状态,且:同时满足所有条件,或:满足任意一个条件
    ⑤配置完成后点击保存即可;

    积分商城用户分层积分商城用户分层

    完整地展现了该产品的用户分层层级。企业可以通过跟踪研究用户行为,快速地明确用户生命周期中的不同阶段,并以此划分用户层级。这种基于行为的用户研究方法,会极大地提升企业的用研效率,了解不同层级的用户量及其转化途径,为用户增长的突破提供数据支撑。

    结合漏斗分析、同期群分析、留存率分析等多种分析模型,究竟哪些用户在为企业创造价值、用户为何购买为何流失……这些困扰着企业运营的难题都将迎刃而解。

    用户分层的展现与应用,可以通过堆积面积图、同期群百分比堆积图等形式进行。关于这两类数据展示形式的设计与解读,我们将在后期撰写独立内容做讲述。

    三、 用户分层的价值
    用户运营更加精细化和精准化,就不要根据实际情况调整用户标签的结构。这是第三个关键步骤,也是商城、社群用户运营能否突破的一步。调整结构有三种方法,如用户筛选功能、添加标签或移除标签。

    不过这种方法所需要的人力成本也比较多,目前比较行之有效的办法,就是利用自动标签中的行为规则来区分和分类用户。当用户在商城、社群上有一个明显的操作的记录时,系统会根据这个操作的倾向来给用户建立和归类标签。自动标签的运用价值比较高,可以有效地提高用户运营的效率,更重要的是可以根据用户喜好及时准确地传达信息

    用户分层,除了能够为企业提供科学的用户研究方法,其更重要的作用,在于拆分和构建业务流程中的指标衡量体系。在任何一个企业或团队里,不角色、不同部门、不同岗位的人,需要关注的指标是不尽相同的。表1是个简单的例子:

    关注用户的生命周期,对用户进行分层分析与管理,探索各个层级阶段的核心指标,以此衡量业务部门的工作成效,这是每一个企业实现增长的必由之路。

    当然,这个过程并不是一蹴而就一成不变的。用户生命周期价值的分析与提升,同样遵循着精益分析的循环(loop of lean analysis),即:产生想法构建指标体系设计产品/方案衡量实施结果对过程数据进行分析从分析中学习经验产生新的想法。

    一个好的用户分层标签对于积分商城而言固然重要,但更重要的,是对用户需求的深刻理解和对用户价值的深入挖掘。想要实现这个两个“小目标”,用户生命周期价值分析必不可少,用户分层模型及其指标体系必不可少。

    展开全文
  • Citron 2010),我们认为,私下且经常被大数据秘密“审判”的个人享有与法院判决的相似的权利。他们的个人数据已用于此类裁决中。 我们使用程序性正当程序原则,模拟了一种监管系统,该系统将针对私有大数据参与...
  • 围绕之前文章中我们提到的用户运营工作的三个核心目标,在搭建用户运营体系时,按照以下步骤进行: 针对不同阶段目标,制定相应用户分群分层模型与指标; 通过数据分析制定相应运营策略,包括运营周期、推送方式;...
  • 我们选择扭转因果关系并提出一个解决方案,即在开始分析实际数据之前,通过定义应如何指定模型来决定框架。 我们应该通过正确地制定具有财务或经济意义的模型假设来定义框架,然后仔细确定回归模型中因变量的数量,...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 188
精华内容 75
关键字:

我们应如何建立模型