自度量的取值范围怎么表示

余弦计算相似度度量【转】
http://blog.csdn.net/u/article/details/
余弦计算相似度度量
相似度度量(Similarity),即计算个体间的相似程度,相似度度量的值越小,说明个体间相似度越小,相似度的值越大说明个体差异越大。
对于多个不同的文本或者短文本对话消息要来计算他们之间的相似度如何,一个好的做法就是将这些文本中词语,映射到向量空间,形成文本中文字和向量数据的映射关系,通过计算几个或者多个不同的向量的差异的大小,来计算文本的相似度。下面介绍一个详细成熟的向量空间余弦相似度方法计算相似度
向量空间余弦相似度(Cosine
Similarity)
余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。
上图两个向量a,b的夹角很小可以说a向量和b向量有很高的的相似性,极端情况下,a和b向量完全重合。如下图:
如上图二:可以认为a和b向量是相等的,也即a,b向量代表的文本是完全相似的,或者说是相等的。如果a和b向量夹角较大,或者反方向。如下图
两个向量a,b的夹角很大可以说a向量和b向量有很底的的相似性,或者说a和b向量代表的文本基本不相似。那么是否可以用两个向量的夹角大小的函数值来计算个体的相似度呢?
向量空间余弦相似度理论就是基于上述来计算个体相似度的一种方法。下面做详细的推理过程分析。
想到余弦公式,最基本计算方法就是初中的最简单的计算公式,计算夹角
的余弦定值公式为:
但是这个是只适用于直角三角形的,而在非直角三角形中,余弦定理的公式是
三角形中边a和b的夹角 的余弦计算公式为:
在向量表示的三角形中,假设a向量是(x1,
y1),b向量是(x2, y2),那么可以将余弦定理改写成下面的形式:
向量a和向量b的夹角 的余弦计算如下
扩展,如果向量a和b不是二维而是n维,上述余弦的计算法仍然正确。假定a和b是两个n维向量,a是
&,b是 &,则a与b的夹角 的余弦等于:
余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,夹角等于0,即两个向量相等,这就叫"余弦相似性"。
【下面举一个例子,来说明余弦计算文本相似度】
&举一个例子来说明,用上述理论计算文本的相似性。为了简单起见,先从句子着手。
  &&&&&&
句子A:这只皮靴号码大了。那只号码合适
句子B:这只皮靴号码不小,那只更合适
怎样计算上面两句话的相似程度?
基本思路是:如果这两句话的用词越相似,它们的内容就应该越相似。因此,可以从词频入手,计算它们的相似程度。
第一步,分词。
句子A:这只/皮靴/号码/大了。那只/号码/合适。
句子B:这只/皮靴/号码/不/小,那只/更/合适。
第二步,列出所有的词。
这只,皮靴,号码,大了。那只,合适,不,小,很
第三步,计算词频。
句子A:这只1,皮靴1,号码2,大了1。那只1,合适1,不0,小0,更0
句子B:这只1,皮靴1,号码1,大了0。那只1,合适1,不1,小1,更1
第四步,写出词频向量。
  句子A:(1,1,2,1,1,1,0,0,0)
  句子B:(1,1,1,0,1,1,1,1,1)
到这里,问题就变成了如何计算这两个向量的相似程度。我们可以把它们想象成空间中的两条线段,都是从原点([0, 0,
...])出发,指向不同的方向。两条线段之间形成一个夹角,如果夹角为0度,意味着方向相同、线段重合,这是表示两个向量代表的文本完全相等;如果夹角为90度,意味着形成直角,方向完全不相似;如果夹角为180度,意味着方向正好相反。因此,我们可以通过夹角的大小,来判断向量的相似程度。夹角越小,就代表越相似。
使用上面的公式(4)
计算两个句子向量
句子A:(1,1,2,1,1,1,0,0,0)
和句子B:(1,1,1,0,1,1,1,1,1)的向量余弦值来确定两个句子的相似度。
计算过程如下:
计算结果中夹角的余弦值为0.81非常接近于1,所以,上面的句子A和句子B是基本相似的
由此,我们就得到了文本相似度计算的处理流程是:
(1)找出两篇文章的关键词;
 (2)每篇文章各取出若干个关键词,合并成一个集合,计算每篇文章对于这个集合中的词的词频
 (3)生成两篇文章各自的词频向量;
 (4)计算两个向量的余弦相似度,值越大就表示越相似。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。View - AntV View视图,由 Chart 生成和管理,拥有自己独立的数据源、坐标系和图层,用于异构数据的可视化以及图表组合,一个 Chart 由一个或者多个视图 View 组成。因此 view 上的 api 同 chart 基本相同。如何创建视图对象:chart.view();
下面是创建视图的语法,首先你需要创建一个 chart 对象,然后调用 chart.view(cfg) 方法生成:const view = chart.view({
chart.view(cfg) 方法中的参数 cfg 可以为空或者传入以下属性:{
start: null,
end: null,
data: null,
animate: {boolean}
属性start绘制区域的起始坐标,结构如下:{
对于 view,我们的起始点是从左上角开始的。end绘制区域的终点坐标,结构如下:{
data视图的数据源,同时也可以使用 view.source(data) 方法设置数据源。animate视图是否执行动画,默认执行。!注意:chart 下创建的 view 将默认使用 chart 的 、坐标轴 axis 配置、坐标系 coord 配置,即如果 view 不自己定义则默认同 chart 的配置相同;如果 view 自己定义了相应的配置,则以自己的为准。如下实例所示:方法source同 。getXScale同 ,只是返回该视图 x 轴对应的度量。getYScales同 ,只是返回该视图 y 轴对应的度量。getXY同 。filter同 。axis同 。guide同 。scale同 。coord同 。tooltip(enable: boolean)view 上的 tooltip 方法只用于开启和关闭 tooltip。view.tooltip(false);
animate同 。clear同 。changeData同 。changeVisible同 。repaint同 。destroy同 。line同 。path同 。interval同 。area同 。point同 。polygon同 。edge同 。schema同 。heatmap同 。您的位置: &
GPS GDOP度量分析
优质期刊推荐you have been blocked摘要软件度量模型是基于软件工程项目的度量值(如项目团队大小)为将来的软件工程预 测目标软件度量值,例如软件的开发工作量和错误率。很明显,构建这样的软件度量模型 需要利用过去的类似项目的数据样本。但是,这些数据样本中往往存在缺失数据的现象。 回归建模中确定选择哪些度量变量作为自变量很可能基于直觉或是经验性的假设。模型建 立以后很少对经验性的假设做事后检验,这样就容易产生多余的度量变量,从而增加不必 要的复杂性。再者,这些度量值很可能既有连续型又有离散型的变量。如何对带有缺失数 据的数据样本构建简化的软件度量模型是本论文讨论和研究的主要课题。本论文的主要内 容包括以下几个部分: 第一章为绪论,讲述论文的主要研究背景,以及初步介绍所遇到的 3 个困难和现有的 相关解决方法(这些会在二,三,四章里详细论述) 。 第二章是缺失数据的统计处理。该部分首先介绍了一些缺失数据相关的背景知识;然 后提出了一些对缺失数据问题的处理方法; 最后详细地阐述了本文所采用的 k-NN 法及蒙 特卡洛模拟法。 第三章主要考虑离散型变量的处理方法。介绍一种比较常见的虚拟变量的方法。 第四章是变量选择的方法。在本章中,我们介绍了 3 种传统的变量选择方法。通过比 较我们选出比较好的逐步回归作为本文变量选择的方法。 第五章是案例分析。用 R、SPSS、Java 等语言及程序把二,三,四章介绍的方法和理 论应用到实际的数据样本中,完成了数据缺失下软件度量数据模型的简化。关键词:软件度量,变量选择,缺失数据,逐步回归,虚拟变量法1 ABSTRACTSoftware metric models can predict target software metric(s), e.g. the development work effort or defect rates for any future software project based on the project predictor software metric(s) such as project team size. Obviously, the construction of such software measurement model requires use of past similar project data samples. However incomplete data often appear in such data samples. The decision on whether a particular predictor metric should be included is most likely based on the intuition or experienced-based assumption. Unfortunately this assumption is usually not verifiable after the model is constructed, leading to redundant predictor metric(s) and/or unnecessary complexity of predictor metric selection. Moreover, these predictor metrics may contain continuous and discrete variables. This thesis mainly considers how to simplify the software metrics model with incomplete data. The contents of this thesis include the following sections: Chapter 1 is an introduction about the background of this study and details on three main problems encountered and their solutions (details will be discussed in Chapters 2, 3 and 4). Chapter 2 discusses the methods how to deal with the missing data in statistics. In this chapter, we describe current research progress associated with the missing data processing and provided some methods related to this study. At last, we discuss the k-NN method and Monte-Carlo simulation method. Chapter 3 mainly focuses on the processing method for discrete variables. A relatively simple approach using so called virtual variables is discussed. Chapter 4 shows the study details of a method for variable selection. In this chapter we introduce 3 classical methods often used for variable selection. After some comparison, we choose stepwise regression method for our paper. Chapter 5 gives a case study. Using R, SPSS, and Java language, we apply the methods from Chapter 2, 3 and 4 to the real data, a simplified software metrics model is constructed successfully. Key words: software metrics, variable selection, missing data, stepwise regression, virtual variable method2 目录第一章 绪论???????????????????????????????? 4 第一节 课题背景及意义????????????????????????? 4 第二节 研究内容及方法????????????????????????? 4 一、 缺失数据的处理??????????????????????????4 二、变量选择????????????????????????????4 三、离散型变量(度量)的分类简化??????????????????4 第二章 缺失数据的统计处理????????????????????????? 4 第一节 缺失数据相关背景介绍????????????????????? 5 第二节 形成缺失数据的原因??????????????????????? 5 第三节 缺失数据的处理方法??????????????????????? 6 一、人工填写(filling manually) ???????????????????6 二、平均值填充(Mean/Mode Completer) ????????????????6 三、K 最近邻法(k-nearest neighbor method,简记 k-NN) ???????6 四、演绎估计法?????????????????????????? 6 第四节 k-NN 填补法??????????????????????????? 7 第三章 离散型变量的处理方法???????????????????????? 8 第一节 简单情况???????????????????????????? 9 第二节 复杂情况???????????????????????????? 9 第四章 变量选择的方法(经典方法)??????????????????9 第一节 前进法?????????????????????????????10 第二节 后退法?????????????????????????????10 第三节 逐步回归法???????????????????????????10 第五章 案例分析??????????????????????????????11 第一节 数据资料说明及预处理?????????????????????? 11 第二节 用改进的 k-NN 方法填补缺失数据??????????????????13 第三节 虚拟变量法处理离散型变量??????????????????? 13 第四节 模型简化???????????????????????????? 14 第五节 多重填补方法?????????????????????????? 18 第六节 总结????????????????????????????? 19 结 论?????????????????????????????????20 致 谢?????????????????????????????????20 参考文献????????????????????????????????? 20 附录内容名称???????????????????????????? ? 203 第一章第一节 课题背景及意义绪论软件度量就是对软件系统的一些性能或者规格的测量。为了探究这些度量中可能存在 的相关性,就必须构造恰当的模型。所有这些模型被认为是软件度量模型。通常,每一个 模型都给出了一个特定的目标度量(应变量)和一个或多个度量(自变量)之间的关系。 例如,对一项工程根据 “工程函数点的数量”建立一个模型去预测“总工作量” 。这个模 型非常重要,因为它能在一项工程发展的早期阶段估计出预期的总工作量。在这个估计的 基础上,我们就可以确定这个工程是否应该被继续或者为了在最终期限之前完成这项工程 需要进行哪些方面的调整(比如说聘请更多的开发者) 。第二节 研究内容及方法一、缺失数据的处理另一点值得注意的就是缺失数据经常出现在用于构造度量模型的数据样本中。因为缺 失数据的问题并不是软件工程中所特有的,所以可以毫不惊讶地发现有很多处理缺失数据 的方法已经被提出。常见的处理缺失数据的方法如平均值填补,EM 算法,演绎估计法等, 大多存在一定的局限性或者误差较大。最近的研究表明 k 最近邻(k-NN)填补方法是一种 比其他填补方法更加稳健的方法。因此在这篇论文里面,我们运用 k-NN 填补方法来处理 缺失数据。二、变量选择在软件度量模型的构建中所面临的挑战之一就是自变量的选择。一般情况下,一个度 量变量是否应该包含在软件度量模型中,常于直觉或者根据经验做出的假设,即认为该度 量对目标变量的影响在统计上显著。有大量的文献关于变量选择的讨论。比较经典的方法 有前进法、后退法和逐步回归法,经我们后面的分析,选用逐步回归法。三、离散型变量(度量)的分类简化此外,我们面临的另一个挑战——分类简化。是不是所有开头指定的离散型的度量自 变量的分类都是必需的呢?它们是否可以合并到一起来减少离散型自变量的分类数目? 在含有离散型自变量的回归中, 常用虚拟变量的方法来重新编码离散变量。 例如: 对于 “开 发类型”这一离散型度量变量 x7,假设它有三个种类: “新型开发” , “进一步开发” , “重 新开发” 。我们用虚拟变量的方法把原先用 1,2,3 区分的类,改用 2 个 0-1 型变量 x71 x72 表示, (x71,x72)分别取(1,0) , (0,1) , (0,0)对应 x7 取 1,2,3。然后,我们再对引 入虚拟变量的回归模型进行变量选择,从而达到同时变量选择和分类合并的目的。第二章缺失数据的统计处理4 我们运用线性回归分析来确定一个目标度量(或称为因变量)和一个或多个预测度 量(或称为自变量)之间的关系。这种模型的一般形式如下:y ? ? 0 ? ?1 x1 ? ?? ? p x p ? ? p?1 x p?1 ? ?? ? q xq(1)(1)这里 y 是因变量, 设 x1 ,?, x p 是连续型的自变量,x p?1 ,?, xq 是离散型的自变量(例如, “开发类型”变量,取值 1,2,3 分别对应“新型开发” , “进一步开发”和“重新开发” ) 。 本文主要考虑软件度量模型(1)的优化与简化。因为缺失数据在用来构造软件度量 模型的数据样本中经常碰到。对于缺失数据的处理已经有很多种技巧,如用基于非缺失数 据获得的估计来替代缺失数据。在这些技巧中,填补法在必须用完全数据集的情况下特别 有用。例如,在多元回归分析中,所有的观测值都必需是完全的。下面对缺失数据相关背 景及其处理方法作详细介绍。第一节 缺失数据相关背景介绍缺失数据又称不完备数据。在各种科学研究中,数据的缺失现象很普遍,缺失数据给 数据的使用和分析带来了很大的困难,也是造成信息系统不确定的主要原因之一,缺失数 据是指数据传输或采集中的错误、空值、超出范围或者不符合要求的值。2001 年,荷兰统 计与运筹协会下属的统计软件分会组织了一个关于缺失数据的讨论会。讨论会提醒人们, 即使表面上看缺失数据对研究结果不可能构成威胁时,也不要简单地将其删除。因为虽然 缺失数据可能只占到 4%-5%的比例,但那些重要信息中往往有 30%-95%的数据来自这 些数据。如果恰好重要信息完全不在这些“盲区”(缺失数据)中,那么也就没有什么问题。 但很显然这样的风险太大了,所以绝对不能存在侥幸心理,而要妥善处理好不完备数据。第二节 形成缺失数据的原因在各种实用的数据库中,属性值缺失的情况经常发生甚至是不可避免的。因此,在大 多数情况下,信息系统是不完备的,或者说存在某种程度的不完备。造成数据缺失的原因 是多方面的,主要可能有以下几种: 一、有些信息暂时无法获取。例如在医疗数据库中,并非所有病人的所有临床检验结果都 能在给定的时间内得到,就致使一部分属性值空缺出来。又如在申请表数据中,对某些问 题的反映依赖于对其他问题的回答。 二、有些信息是被遗漏的。可能是因为输入时认为不重要、忘记填写了或对数据理解错误 而遗漏,也可能是由于数据采集设备的故障、存储介质的故障、传输媒体的故障、一些人 为因素等原因而丢失了。 三、有些对象的某个或某些属性是不可用的。也就是说,对于这个对象来说,该属性值是 不存在的,如一个未婚者的配偶姓名、一个儿童的固定收入状况等。 四、有些信息(被认为)是不重要的。如一个属性的取值与给定语境是无关的,或训练数据 库的设计者并不在乎某个属性的取值。 五、 获取这些信息的代价太大。 六、系统实时性能要求较高,即要求得到这些信息前迅速做出判断或决策。5 第三节 缺失数据的处理方法处理缺失数据的方法有完全观测数据法,即将存在缺失数据的记录删除,从而得到一 个完备的数据表。这种方法简单易行,当对象有多个属性缺失值,且被删除的含缺失值的 对象与数据表中的数据量相比非常小的情况下是非常有效的。显然这种方法却有很大的局 限性,它会消除掉大量有效信息或者使某个类消失,并且如果数据表中包含的对象很少, 删除少量对象就足以严重影响到数据挖掘结果的客观性和正确性。 处理缺失数据问题,填补是另一个常用、方便的方法。填补方法就是用一定的值去填 充空值,从而使信息表完备化。通常基于统计学原理,根据决策表中其余对象取值的分布 情况来对一个空值进行填充,譬如用其余属性的平均值来进行填补等。数据挖掘中常用的 有以下几种填补方法:一、人工填写(filling manually)由于最了解数据的还是用户自己,因此这个方法产生数据偏离最小,可能是填充效果 最好的一种。然而一般情况,该方法很费时,当数据规模很大、空值很多的时候,该方法 是不可行的。二、平均值填充(Mean/Mode Completer)将信息表中的属性分为数值属性和非数值属性来分别进行处理。如果空值是数值型 的,就根据该属性在其他所有对象的取值的平均值来填充该缺失的属性值;如果空值是非 数值型的, 就根据统计学中的众数原理, 用该属性在其他所有对象的取值次数最多的值(即 出现频率最高的值)来补齐该缺失的属性值。另外有一种与其相似的方法叫条件平均值填 充法(Conditional Mean Completer)。在该方法中,缺失属性值的补齐同样是靠该属性在 其他对象中的取值求平均得到,但不同的是用于求平均的值并不是从信息表所有对象中 取,而是从与该对象具有相同决策属性值的对象中取得。这两种数据的补齐方法,其基本 的出发点都是一样的,以最大概率可能的取值来补充缺失的属性值,只是在具体方法上有 一点不同。与其他方法相比,它是用现存数据的多数信息来推测缺失值。三、K 最近邻法(k-nearest neighbor method,简记 k-NN)此算法的基本思路为基于一系列未缺失数据的观察值来弥补数据。 k-NN 是通过在定义 的距离空间上寻找 K 个距离最近的完全数据来估计缺失值。而对这 k 个数值采用了加权平 均法。最近的一些研究显示,相比其他填补方法来说,k-NN 填补方法似乎是一个更稳健的 填补方法。在本文中,将用 k-NN 填补方法来处理缺失数据问题。四、演绎估计法演绎估计法适用于这样一种情况,目标变量 Y 的缺失值可以以很高的确定性由其它辅 助变量来决定。这意味着,目标变量与辅助变量之间存在着已知的函数关系,即 ZI=f(Xi)。 式中 ZI,是第 i 个单位目标变量缺失值的估计值(替补值), Xi 是第 i 个单位已知的辅助变 量值。6 例如美国在一项关于医疗设备使用和费用的调查中,多处使用演绎估计法对缺失值进 行填补。 ①对种族缺失值的填补函数式为 ZI=XI,即如果某人种族数据缺失,可采用其配偶的种 族;如果某家庭成员种族资料缺失,可使用户主的种族。②如果年龄项目数据缺失,则利 用出生年份资料进行估计。若调查是在 1990 年进行,令 X1 为出生年份,则 ZI=1990-Xi 。 ③若就业收入的数据缺失,则利用其它 4 个相关的辅助变量信息推算,令 X11 、X21 分别为 该被调查者的主要职业和第二职业的周工资率。X31 、X41 分别为其在主要职业和第二职业 上的工作周数,则劳动收入的估计值为 Zi=X11 .X31+X21 .X41 。 由此看出,f(X1)可假定为许多不同的形式。使用的条件是 Y 与 X 之间存在确定的函数 关系,且 X 值已知。实践中.可以把演绎估汁法视为对数据进行逻辑审核的—部分。 期望值最大化 (Expectation maximization,EM)算法是一种在不完全数据情况下计 算极大似然估计或者后验分布的迭代算法:在每一迭代循环过程中交替执行两个步骤: E 步(Expectation step,期望步),在给定完全数据和前一次迭代所得到的参数估计的情况 下计算完全数据对应的对数似然函数的条件期望;M 步(Maximization step,极大化步), 用极大化对数似然函数以确定参数的值,并用于下步的迭代。算法在 E 步和 M 步之间不断 迭代直至收敛,即两次迭代之间的参数变化小于一个预先给定的阈值时结束。该方法可能 会陷入局部极值,收敛速度也不是很快,并且计算很复杂。第四节 k-NN 填补法下面对本文使用的 k-NN 填补法作详细介绍。 k-NN 法是要在不完整的观测值内找到 k 个最接近的完整的观测值。 这 k 个最接近的完 整的观测值的加权平均值作为该缺失数据的填补值。 下面我们用公式对 k-NN 填补法进行说明。模型(1)中的数据样本可分为有缺失数据 的观测值(或称不完整的观测值)和没有缺失数据的观测值(或者完整的观测值) 。令 mi = T (miy, mi1, mi2, ??, miq) 为不完整的观测值测量的目标度量值和预测度量值的矢量,令 cj = (cjy, cj1, cj2, ??,cjq)T 为所有完整的观测值测量的目标度量值和预测度量值的向量。 因为,每个度量值 miy, mi1, mi2, ??, miq 和 cjy, cj1, cj2, ??, cjq 的量可能差别较 大,我们在计算各个度量值的欧氏距离之前,我们要将其基准归一,否则欧氏距离将被度 量值取值范围大的所主导。基准归一转换方式如下:milN =mil ? ml , min ml , max ? ml , min以及cilN =cil ? cl , min cl , max ? cl , minl = 1, 2, ??, q,其中,ml,min 和 ml,max 为{mil: i = 1, ??, n}的最小和最大值, cl,min 和 cl,max 为{cil: i = 1, ??, n}的最小和最大值,n 为数据样本中的观测值数目。这样,所有基准归一后的度量值都在[0, 1]范围内。 不完整的观测值 i 和完整的观测值 j 之间的欧氏距离如下:Eij =? (mlN il? cN )2 jl7 其中,求和运算包括不完整观测值 i 中 l 所对应的所有没有缺失的度量值数据。 我们将不完整的观测值 i 的 k 个最接近的完整的观测值标识为观测值 i1, i2, ??, ik, 它们与不完整的观测值 i 之间的欧氏距离分别为 Eii1, Eii2, ??, Eiik。根据 k-NN 填补法, 这 k 个最接近的完整观测值被用来计算缺失数据的加权值,这个加权值是通过距离反比加 权算法得出的。例如,如果 mil 为缺失值,则填补值应为:?Et ?1 k t ?1k?1iit itl?1c?Eiit当所有的缺失值都被填补之后,数据样本即为完整的,可按完整的数据样本进行任何 分析。第三章离散型变量的处理方法在回归分析中,我们对一些自变量是离散型变量的情形先给予数量化处理,但简单的 数量化常常存在一些问题。一种更好的处理方法是引进适当个数的只取 0 和 1 的虚拟自变 量。当某一属性出现时,虚拟变量取值 1,否则取值为 0。下面就这一方法作一介绍。第一节 简单情况首先讨论离散变量只取两类可能值的情况,例如研究粮食产量问题,y 为粮食产量,x 为施肥量,另外再考虑气候问题,分为正常年份和干旱年份两种情况,对这个问题的数量 化方法是引入—个 0—1 型变量 D,令 Di=l, 表示正常年份 Di=0, 表示干旱年份 粮食产量的回归模型为 yi=β 0+β 1Xi+β 2Di +ε i (2) 其中,i=1,?,n,在以下回归模型中不再一一注明。干旱年份的粮食平均产量为 E(yi| Di=0)=β 0+β 1Xi 正常年份的粮食平均产量为 E(yi| Di=1)=(β 0+β 2)+β 1Xi 这里有—个前提条件, 就是认为干旱年份与正常年份回归直线的斜率β 1 是相等的,也 就是说,不论是干旱年份还是正常年份,施肥量 x 每增加一个单位,粮食产量 y 平均都增 加相同的数量β 1。对(2)式的参数估计仍采用普通最小二乘法。第二节 复杂情况某些场合离散自变量可能取多类值,例如某商厦策划营销方案,需要考虑销售额的季 节性影响,季节因素分为春、夏、秋、冬 4 种情况。为了用定性自变量反映春、夏、秋、 冬四季,我们初步设想引入如下 4 个 0-1 型自变量: X1=l,春季 X2=1,夏季8 X1=0,其他 X2=0,其他 X3=l,秋季 X4=1,冬季 X3=0,其他 X4=0,其他 可是这样做产生了一个新的问题,即 4 个自变量 x1,x2,x3,x4 之和恒等于 1 ,即 x1+x2+x3+x4=1,构成完全多重共线性,解决这个问题的方法很简单,我们只需去掉一个 0-1 型自变量即可,例如去掉 x4,只保留 x1,x2,x3。 对一般情况,一个离散变量有 K 类可能的取值时,需要引入 K-1 个 0-1 型自变量,当 K=2 时,只需要引入一个 0-1 型自变量即可。 对于包含多个 0-1 型自变量的计算,仍然是采用普通的线性最小二乘回归方法,在此 就不举例了。第四章经典变量选择的方法在多元线性回归分析中,并不是所有自变量都对因变量 y 有显著的影响,这就存在着 如何挑选出对因变量有显著影响的自变量问题。 自变量的所有可能子集构成 2m-1 个回归方 程。当可供选择的自变量不太多时,可以对—切可能的回归方程用某个准则去挑出最优的 方程;但是当自变量的个数较多时,要求出所有可能的回归方程是非常困难的。为此.要 用一些较为简便、实用、快速的选择最优方程的方法。不同的方法各有优缺点,至今还没 有绝对最优的方法,目前常用的方法有“前进法” 、 “后退法” 、 “逐步回归法” ,而逐步回 归法应用最广。第一节 前进法前进法的思想是变量由少到多,每次增加一个.直至没有可引入的变量为止。具体做 法是首先将全部 m 个自变量,分别对因变量 y 建立 m 个一元线性回归方程,并分别计算这 m 个一元回归方程的 m 个回归系数的 F 检验值,记为{F11,F12, · · · ,F1m},选其最大者记为 F1j=max{F11,F12, · · · ,F1m},给定显著性水平α 。 .若 F1j≥Fα (1,n 一 2),则首先将 xj,引 入回归方程,为了方便,设 xj 就是 x1。接下来因变量 Y 分别与(x1,x2),(x1,x3),?,(x1, xm,)建立 m-1 个二元线性回归方程.对这 m-1 个回归方程中 x2,x3,?,xm 的回归系数 进行 F 检验,计算 F 值.记为{F22,F23, · · · ,F2m},选其最大的记为 F2j=max{F22,F23, · · · ,F2m} 若 F2j≥Fα (1,n-3),则接着将 xj,引入回归方程。 依上述方法接着做下去。直至所有未被引入方程的自变量的 F 值均小于 Fα (1,n-p -1)时为止。这时,得到的回归方程就是最终确定的方程。每步检验中的临界值 Fα (1,n -p-1)与自变量数目 p 有关, 在用软件计算时, 我们实际使用的是显著性 P 值(或记为 Sig) 作检验。第二节 后退法后退法与前进法相反,首先用全部 m 个变量建立一个回归方程,然后在这 m 个变量中 选择一个最不重要的变量,将它从方程中剔除。在回归系数的显著性检验中,用的就是这9 种思想, 把回归系数检验的 F 值最小者对应的自变量剔除。 设对 m 个回归系数进行 F 检验, m m m 记求得的 F 值为{F 1,F 2, · · · ,F m},选其最小者记为 m m m F j=min{F 1,F 2, · · · ,Fmm} 给定显著性水平α , 若 Fmj≤Fα (1, n-m-1), 则首先将 xj 从回归方程中剔除, 为方便, 设 xj 就是 xm。接着对剩下的 m-1 个自变量重新建立回归方程,进行回归系数的显著性检 验,像上面那样计算出 Fm-1j,如果又有 Fm-1j≤Fα (1,n-(m-1) -1),则剔除 xj,重新建 立 y 关于 m-2 个自变量的回归方程。依此下去,直至回归方程中所剩余的 P 个自变量的 F 检验值均大于临界值 Fα (1,n-p-1).没有可剔除的自变量为止。这时,得到的回归方程 就是最终确定的方程。 前进法和后退法显然都有明显的不足。前进法可能存在这样的问题,即不能反映引进 新的自变量后的变化情况。因为某个自变量开始可能是显著的,但当引入其他自变量后它 变得并不显著了,但是再没有机会将其剔除。即一旦引入,就是“终身制”的;这种只考 虑引入,而没有考虑剔除的做法显然是不全面的。而且,我们在许多例子中会发现可能最 先引入的某个自变量,当其他自变量相继引入后,它会变得对因变量 y 很不显著。 后退法的明显不足是,一开始把全部自变量引入回归方程,这样计算量很大。 如果有些自变量不太重要,一开始就不引入,就可减少一些计算量;再就是一旦某个 自变量被剔除, “一棍子就把它打死了” ,它再也没有机会重新进入回归方程。 如果说我们的问题涉及的自变量 x1,x2,?,xm 是完全独立的(或不相关),那么在取 α 进=α 出时,前进法与后退法所建的回归方程是相同的。然而在实际中很难碰到自变量间 真正无关的情况,尤其是经济问题中,我们所研究的绝大部分问题。自变量间都有一定的 相关性。这就会使得随着回归方程中变量的增加和减少,某些自变量对回归方程的影响也 会发生变化。这是因为自变量间的不同组合,由于它们相关的原因,对因变量 y 的影响可 能大不一样。如果几个自变量的联合效应对 y 有重要作用,但是单个自变量对 y 的作用都 不显著,那么前进法就不能引入这几个自变量,而后退法却可以保留这几个自变量 ,这是 后退法的一个优点。 从前进法和后退法的思想及方法,以及我们看到的它们的不足,人们比较自然地想构 造一种方法,即吸收前进法和后退法的优点 ,克服它们的不足,把两者结合起来,这就产 生了逐步回归法。第三节 逐步回归法逐步回归的基本思想是有进有出,具体做法是将变量一个一个引入.当每引入一个自 变量后,对已选入的变量要进行逐个检验,当原引入的变量由于后面变量的引人而变得不 再显著时,要将其剔除。引入一个变量或从回归方程中剔除一个变量,为逐步回归的一步, 每一步都要进行 F 检验,以确保每次引入新的变量之前回归方程中只包含显著的变量。这 个过程反复进行.直到既无显著的自变量选入回归方程,也无不显著自变量从回归方程中 剔除为止。这样就避免了前进法和后退法各自的缺陷,保证了最后所得的回归子集是最优 回归子集。 在逐步回归法中需要注意的一个问题是引入自变量和剔除自变量的显著性水平 α 值10 是不相同的,要求引入自变量的显著性水平α 进小于剔除自变量的显著性水平α 出,否则可 能产生“死循环” 。也就是当α 进≥α 出时,如果某个自变量的显著性 P 值在α 进与α 出之间, 那么这个自变量将被引入、剔除,再引入、再剔除,循环往复,以至无穷。 这种有进有出的结果说明自变量之间具有相关性。如果自变量之间是完全不相关的, 那么引入的自变量就不会再被剔除,而剔除的自变量也就不会再被引入,这时逐步回归方 法与前进法是相同的。在实际问题中,自变量之间通常具有相关性,当相关性程度严重时 称为多重共线性。多重共线性会对回归产生严重影响。1第五章案例分析本章综合利用前述几章的方法,对一个标准的软件度量数据集进行模型简化分析。第一节 数据资料说明及预处理案例分析中使用的数据样本是来自于国际软件基准协会 (ISBSG) 的 “数据库-版本 6” 。 它被认为是最全面、可靠、系统、典型的数据样本之一。这个数据样本由对 789 个项目收 集而成的 55 个度量组成。但是这些度量的大多数都含有缺失数据。对此数据,考虑以 “summary work effort”作为因变量(也称为目标度量)对一系列既有连续型又有离散 型的预测度量 (即自变量) 建立回归模型。 表 1 里面的六个预测度量 (记为 x1 , x2 , x5 , x6 , x7 , 和 x8 )被用来在同样的数据集合的基础上建立软件成本预算模型。为了证明我们的方法的 作用,我们添加了两个很少用到的预测度量( x3 和 x4 ) 。表 1 给出了这些度量的详细信息。 2 表 1: 软件工作量度量模型的目标度量和预测度量 Name Metricyof DescriptionRemarkSummaryTotal effort (in Dependent variable hours) spent on the Work effort project Function points The adjusted Function point count number The Maximum number of project team members Total elapsed time (in months) for the project11x1x2Maximum team sizex3Project elapsed time x4User base Number of physical locations locations being serviced by the installed system Development Specify platform primary development platform Programming Specify language type the Three categories: 1 fro “microcomputers,” 2 for “mid-range computers,” and 3 for “mainframe computers” which Four categories: 1 for “2GL,” 2x5x6programming for “3GL,” 3 for “4GL,” and 4 language is used for “application generators” for the project Three categories: 1 for “new development,” 2 for “enhancement,” and 3 for “redevelopment”x7Development Specify whether type the development is a new development, or redevelopment Resource levelx8Specify how people Four categories: 1 for spend their “development team effort,” 2 resources for “development team support,” 3 for “computer operations involvement,” and 4 for “end user or clients”3表 2 前 10 和后 10 组原始数据 (软件工作量度量模型的目标和预测度量值) 序号 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. y 0 77
673 303 304
46 x2 7 4 21 3 8 0 5 x3 4 6 17 9.0 12 10.0 18 10 7 612x4 1 1 1 1 1 1 1 1 1 1x5 1 3 3 1 3 3 2 3 3x6 3 4 2 2 3 2 2 2 3 3x7 1 1 2 2 1 2 1 2 1 2x8 4 4 2 1 2 1 4 1 4 1 : : : : . . . . .: : : : 06 440
: : : : 426 627 77 56 1 767 230 291: : : :: : : : 3 5 6 24 6 9 17 2: : : :: : : : 1: : : : 3 3 2 3 2 21 3 341 22 17 3: : : : 2 2 2 2 1 2 1 2 2 1: : : : 1 1 1 2 1 1 1 4 1 1我们考虑如何应用以上所提到的知识。我们曾考虑只用完整组做回归分析,注意到这 2000 多组数据缺失比较严重, 只有 300 多组完整数据, 只用完整的会造成收集数据的浪费。 但有的项目(组)的有关值实在缺失太严重,因此我们第一步删除缺失数据太多的组,保 留缺失数据较少的组等待第二步的填补。第二步为填补缺失数据,因为如果先处理离散型 变量,如 x5 变成 x51,x52,x53,则填补出的 x51,x52,x53 如果和不为 1,不合理。第三步引入虚 拟变量,最后进行回归分析得出结果。第二节 用改进的 k-NN 方法填补缺失数据在填补缺失数据前,先做个宏删除缺失数据太多的组 (见附录 A)得新的数据表。然 后,再用改进的 k-NN 法填补其中缺失的数据 连续型变量的缺失值用 k-NN 法填补。因为虽然有 2000 多组数据,但完全观测到的数 据组只有 300 多组,所以这里 k 取 50(占完全组的百分之十几) 离散型的用如下方法:计算P( x ? cit l ) ???1 Eii t k t ?1 ?1 Eii t,t ? 1,2, ?, k .(3)(3)取其中概率最大的类为填补值(填补缺失数据程序见附录 B) 。 至此,我们得到了一个完整的表格数据。为下面的虚拟变量和变量选择提供了基础。第三节 虚拟变量法处理离散型变量对离散变量 x5,x6,x7,x8 用虚拟变量代替如下13 x51 ? {1, x5 ?1 0, x5 ?1,x52 ? {x62 ? {1, x5 ? 2 0, x5 ? 21, x6 ? 2 0, x6 ? 2;x61 ? {1, x6 ?1 0, x6 ?1,,x63 ? {1, x6 ? 3 0, x6 ? 3;x71 ? {x81 ? {1, x7 ?1 0, x7 ?11, x8 ?1 0, x8 ?1, ,x72 ? {x82 ? {1, x7 ? 2 0, x7 ? 21, x8 ? 2 0, x8 ? 2;,x83 ? {1, x8 ? 3 0, x8 ? 3这样得到最后的完整数据集(虚拟变量化程序见附录 C) 。第四节 模型简化用逐步回归法对最后的完整数据做逐步回归。用 SPSS 中带的功能导入数据——分析 ——回归——线性,因变量为 y,自变量为 x1,x2,x3,x4,x51,x52,x61,x62,x63,x71,x72,x81,x82,x83。 用系统默认的显著性水平α 进=0.05,α 出 =0.10 逐步回归的结果: 回归 [数据集3] 系数a 非标准化系数 模型 1 (常量) x3 2 (常量) x3 x1 B -5.262 -.498 3.796 标准 误差 755.107 71.845 742.610 73.118 .387 .261 .196 .314 标准系数 试用版 t -3.932 15.941 -4.794 13.027 9.801 Sig. .000 .000 .000 .000 .00014 3(常量) x3 x1 x52-.946 3.664 6.246 885.746 3.578 38.572 .827 3.674 272.324 -80.270 855.768 3.572 751.385 72.861 .386 2.836 73.464 .385 7.160 .703 .382 0.869 4.426 72.742 .381 4 .185 .094 .241 .190 .096 -.178 -.166 .243 .185 .089 -.082 .255 .189 .095-5.635 12.805 9.484 4.941 -.094 12.057 9.283 4.643 -4.204 3.717 12.088 9.625 5.030 -7.548 -7.098 3.149 11.764 9.364 4.914.000 .000 .000 .000 .925 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .002 .000 .000 .0004(常量) x3 x1 x52 x815(常量) x3 x1 x52 x81 x826(常量) x3 x1 x5215 x81 x82 x2 7 (常量) x3 x1 x52 x81 x82 x2 x83 a. 因变量: y- -1.132 .578 3.581 464.608 -6.994 -2.094 34.294 .631 .381 0.454 .226 -.179 -.161 .073-7.605 -6.917 3.824 3.797.000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000.238 .185 .100 -.198 -.176 .071 -.07011.945 9.412 5.221 -8.245 -7.456 3.710 -3.595可见最后的结果就是: Y=.582x1+122.132x2+894.558x3+---1 由此,连续型变量中 x1,x2,x3 入选,x4 被剔除。离散型变量中,x5,x8 入选,x6,x7 被剔 除。而其中 x5=1 和 x5=3 可以合并。而 x8 没有类可合并。 但是这里出现了一个问题。离散型变量如 x5 的选取 x51,x52 只是一种情况。为了考虑所 有的离散型变量的分化合并的情况。我们分为 2 种方案 方案 1: 把所有变量即 x1,x2,x3,x4,x51,x52,x53,x61,x62,x63,x64,x71,x72,x73,x81,x82,x83,x84 都入选一起 做逐步回归。这样能考虑周全并且只需一步,但是会产生冗余和交互效应。3 结果如下: 系数a 非标准化系数 模型 B 标准 误差16标准系数 试用版 t Sig. 1(常量) x3-5.262 -.498 3.796 -.434 3.756
-.477 3.622 58.739 -.181 3.526 10.748 133.026 -.610 3.583 49.241 127.226 755.107 71.845 742.610 73.118 .387 740.514 72.390 .381 .870 72.117 .380 2.983 775.507 72.106 .380 9.349 34.155 .546 .380 6.198 34.219 7 .185 .207 .099 .071 .061 .232 .182 .164 .094 .074 .238 .187 .165 .096 .243 .194 .165 .261 .196 .314-3.932 15.941 -4.794 13.027 9.801 -6.169 12.259 9.848 8.615 -7.013 12.029 9.525 8.689 5.068 -7.826 11.735 9.280 8.676 4.974 3.895 -5.695 11.932 9.419 7.789 5.195 3.718 2.274.000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .0232(常量) x3 x13(常量) x3 x1 x844(常量) x3 x1 x84 x525(常量) x3 x1 x84 x52 x26(常量) x3 x1 x84 x52 x2 x81a. 因变量: y 即 x1,x2,x3,x52,x81,x84 入选17 (x51,x53),x52 x81,(x82,x83),x84 方案 2: 考虑所有的组合,这样没有冗余,但步骤比较多,且解释的可能有困难 我们要考虑 x5,x8 的所有的组合(x6,x7 已删去) 有 3*4=12 种情况 所用组合 x51x52 x81x82x83 x51x52 x81x82x84 x51x52 x81x83x84 x51x52 x82x83x84 x51x53 x81x82x83 x51x53 x81x82x84 x51x53 x81x83x84 x51x53 x82x83x84 x52x53 x81x82x83 x52x53 x81x82x84 x52x53 x81x83x84 x52x53 x82x83x84 spss 回归结果 x52 x81x82x83 x52 x81x84 x52 x81x84 x52 x84 x51x53 x81x82x83 x51x53 x81x84 x51x53 x81x84 x51x53 x84 x52 x81x82x83 x52 x81x84 x52 x81x84 x52 x84 (x51,x53),x52 (x51,x53),x52 (x51,x53),x52 (x51,x53),x52 (x51,x53),x52 (x81,x82,x83),x84 x81,x82,x83,x84 x81,(x82,x83),x84 x81,(x82,x83),x84 (x81,x82,x83),x84 (x51,x53),x52 (x51,x53),x52 (x51,x53),x52 (x51,x53),x52 (x51,x53),x52 x81,(x82,x83),x84 (x81,x82,x83),x84 x81,x82,x83,x84 x81,(x82,x83),x84 x81,(x82,x83),x84 x5 的合并结果 (x51,x53),x52 (x51,x53),x52 x8 的合并结果 x81,x82,x83,x84 x81,(x82,x83),x84由此可见,出现最多的分化合并和方案 1 是一样的。经过检验,已不能合并,所以结 果就是 y=-.583x1+127.226x2+865.610x3+++第五节 多重填补方法前面的方法中采用的方法可称为单一填补。考虑到单一填补受随机性的影响较大。下 面考虑基于一种蒙特卡洛模拟的多重填补方法。18 如果 mil 是来自于连续型度量的一个缺失值,比如 1 ? l ? p ,在 k 个最接近项目的已知 值的基础上, 通过使用非参数核的方法产生了一个连续的分布, 可假设缺失值 mil 来自如下 的概率密度函数对应的分布:?1 Eii x ? cit l 1 k t f il ( x) ? ? ker( ), k ?1 h t ?1 ? t ?1 Eiit h(2) (4)其中, ker(?) 是核函数, h 是带宽,此处取 h ? 10?0.2 ? 0.63096 。?1 ? ker( x) ? ? 2 ? ?0x ? [?1,1] x ? [?1,1]如果 mil 是来自于离散型度量的一个缺失值,比如 p ? 1 ? l ? q ,在 k 个最接近项目的 已知值的基础上,假定缺失值 mil 来自如下的离散分布:P( x ? cit l ) ???1 Eii t k t ?1 ?1 Eii t,t ? 1,2, ?, k .(3)(3)4通过从分布中独立地抽样,蒙特卡洛模拟可以被用来产生 N 个完全数据样本。用这种方法重复 100 次,得出 100 组完全数据集。再进行逐步回归。这样往复 100 次 得出 100 个逐步回归的结果,出现次数如下: X1 100 X2 100 X3 72 X4 23 X5 21 X6 2 X7 0 X8 100最常见的回归结果是 x1,x2,x3,x8,这种组合出现了 45 次,为出现最多的组合。 即化简为: y = β0+β1x1+β2x2+β3x3 +β8x8 。第六节 总结第一种 k-NN 法是用 k 个最接近的完整的观测值的加权平均值补充的唯一的一组完整 数据,再虚拟变量并回归分析。第二种模特卡落模拟法是利用 k 个最接近的完整的观测值 模拟缺失数据的分布,模拟出 n 组完整数据,进行 n 次回归分析。 我们结合 2 次的结果: 方法 1: y=-.583x1+127.226x2+865.610x3+++ 方法 2:y =β 0+β 1x1+β 2x2+β 3x3 +β 8x8 看似差别不小。实际只是 x5 是否入选有所不同。方法 1 中 x5 入选并 x5=1 和 3 合并为 一类。方法 2 中 x5 没有入选。我们猜测是因为由于 x5 对 y 的影响不符合线性分布,可见 x5 的 1,,2,3 只是代表 3 种不同的开发平台的种类。 进行变量选择后这种非线形的情况得到 一定程度的缓解。不过 2 种结果比较接近,都是可以接受的。19 结论本论文通过对构建软件度量模型的研究和证表明:在建立一个预测模型时,基于直觉 或者经验假定所作的预测度量变量选择,可能含有冗余的/或者不必要的预测度量,并可 导致在数据选择上的资源浪费。 另外,缺失数据也经常出现在用来构造软件度量模型的数据样本中。为了克服这个问 题,本论文采用了 k-NN 单一填补方法和基于计算机模拟方法的多重填补, 并就如何优化 /简化初始模型做了介绍。使用来自“数据库-版本 6”中的数据, 我们做了一个应用实例 研究,证明该方法的有效性。对于离散型变量用 k-NN 填补可能出现小数的情况,我们用 改进的 k-NN 和蒙特卡洛模拟的方法来填补。 在得到完整的数据后,我们先对离散变量虚拟变量化,然后再用逐步回归法进行模型 简化。这种方法虽然可以对变量类别进行一定程度的合并,但没有对所有的分化合并的情 况进行全面考虑。如果数据仍有交互效应,非线性分布的情况,本文所论证的方法的准确 性可能会受到较大的影响。另外,在 k-NN 方法中 k 的选取、核密度估计中带宽 h 的选取 都需要进一步考虑。致谢这里我首先要感谢我的导师。 谢老师平日里工作繁多, 但在我做毕业设计的每个阶段, 从查阅资料和设计草案的确定到理论讲解再到论文修改等整个过程中都给予了我细心的 指导。谢老师耐心地纠正我设计中的错误。他的治学严谨和科学研究的精神是我永远学习 的榜样,并将积极影响我今后的学习和工作。参考文献1 2 3 4 何晓群和刘文卿,《应用回归分析》, 北京:中国人民大学出版社, 2007 年 7 月第二版 陈嘉贤, 《一种推导广义软件度量模型的方法》, 广州:暨南大学出版社 2009.8 张文彤和董伟,《SPSS 统计分析高级教程》, 高等教育出版社, 2004 年 9 月第一版 T. F. XIE,etc., “一种基于非完整数据样本来简化软件度量模型的统计方法”, 国际 软件工程与知识工程杂志 2007 年 第 17 卷第 6 期附录内容名称附录 A------ 宏:删除缺失个数大于 3 个的组 附录 B------ 缺失数据填补的程序 附录 C------虚拟变量的语句附录 A删除缺失个数大于 3 个的组 Sub Macro1() Dim i, s, m As Integer '20 m = 2 ' Macro1 Macro Do Until m &= 4000 ' s = 0 ' For i = 1 To 9 ' If Cells(m, i) = && Then s = s + 1 End If Next i If s &= 4 Then Rows(m).Delete End If If s = 9 Then Exit Sub End If If s & 4 Then m = m + 1 End If Loop 'Application.CommandBars(&Stop Recording&).Visible = False 'Application.Goto Reference:=&Macro1& End Sub附录 B缺失数据填补的程序 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ import java.sql.*; import java.util.R public class Main {21 static int k = 10; public static void main(String[] args) { //Connection connection = boolean[] int row =0; try { Class.forName(&sun.jdbc.odbc.JdbcOdbcDriver&); Connection con = DriverManager.getConnection( &jdbc:odbc:GX&,&&,&& ); con.setReadOnly(false); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( &SELECT * FROM [Sheet1$]& ); ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount()-1; double[] max = new double[numberOfColumns]; double[] min = new double[numberOfColumns]; ///////////////////////////////Step1//////////////////////////// //计算行数 while(rs.next()) row++; flag = new boolean[row]; row =0; rs = st.executeQuery(&SELECT * FROM [Sheet1$]&); //显示数据,计算最大最小值,确定该行是否有数据不全 while (rs.next()) { for (int i = 0; i & numberOfC i++) { String columnValue = rs.getString(i+1); 据本题,可以不是 String 类型 //System.out.print(columnValue); if(columnValue==null) flag[row] = else { double temp=Double.parseDouble(columnValue); if(min[i]&temp) min[i] = if(max[i]&temp) max[i] = }22// 根 } row++; } /*for(row = 0;row& flag.row++) System.out.println(flag[row]);*/ ///////////////////////////////Step2//////////////////////////// //magnitude normalization row = 0; rs = st.executeQuery(&SELECT * FROM [Sheet1$]&); double[][] nomalize = new double[flag.length][numberOfColumns]; double[][] statistics=new double[flag.length][numberOfColumns]; for(int a=0;a&flag.a++) for(int b=0;b&numberOfCb++) { nomalize[a][b] = -1.0;statistics[a][b] = -1.0;} while(rs.next()) { for(int j=0;j&numberOfCj++) { String columnValue = rs.getString(j+1); if(columnValue!=null) { double temp=Double.parseDouble(columnValue); nomalize[row][j] = (temp-min[j])/(max[j]-min[j]); statistics[row][j] = } //System.out.print(nomalize[row][j]+&\t&); } //System.out.println(); row++; } /////////////////////////////Step3////////////////////////////// //计算 Euclidean distance 欧式距离 row = 0; for(int i = 0;i&flag.i++) { if(flag[i] == true) { double[] euclidean = new double[k]; int[] memory = new int[k]; for(int j = 0;j&flag.j++) { if(flag[j] == false) { double sum=0,item = 0;23 int mini = 0;//no of the current minimum of ED for(int counter=0;counter&numberOfCcounter++) { if(nomalize[i][counter]!=-1) { item Math.pow(nomalize[i][counter]-nomalize[j][counter],2); sum+= } } for(int x = 0;x&k;x++) { if(euclidean[x]&euclidean[mini]) mini = } if(Math.sqrt(sum)&euclidean[mini]) { euclidean[mini] = Math.sqrt(sum); memory[mini] = } } } //输出距离 System.out.println(&第&+(i+2)+&行&); /*for(int x=0;x&k;x++) { System.out.print(&与第&+memory[x]+&行&); System.out.print(euclidean[x]+&\t&); } System.out.println();*/ //计算填补的数据 /* for(int amend = 0;amend&5;amend++) { double sum1=0,item1=0; double sum2=0,item2=0; double result = 0; if(statistics[i][amend]==-1) { for(int x=0;x&k;x++) { int which = memory[x]; item1 = statistics[which][amend]/euclidean[x];24= item2 = 1.0/euclidean[x]; sum1+=item1; sum2+=item2; } result = sum1/sum2; System.out.println(& 第 &+(amend+1)+& 列的空缺数据应 为: &+ result ); if(amend &=8&&amend&=5) if(((int)result+0.5)&result) result =(int)(result+1); st.executeUpdate(& update [Sheet1$] set x&+(amend)+& = &+result+& where ID= &+(i+1)); } }*/ //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// for(int amend = 5;amend&numberOfCamend++) { double sum2=0,item2=0;double result=0; double[] possibility = new double[k]; if(statistics[i][amend]==-1) { for(int x=0;x&k;x++) { int which = memory[x]; item2 = 1.0/euclidean[x]; sum2+=item2; } for(int x=0;x&k;x++) possibility[x] = (1/euclidean[x])/sum2; for(int x=1;x&k;x++) possibility[x] = possibility[x]+possibility[x-1]; Random ran = new Random(); double p = ran.nextDouble(); for(int x=0;x&k;x++) { if(p&possibility[x]) result = statistics[x][amend]; } st.executeUpdate(& update [Sheet1$] set x&+(amend)+& = &+result+& where ID= &+(i+1)); }25 } //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// System.out.println(); } } st.close(); con.close(); } catch(Exception ex) { System.err.print(&Exception: &); System.err.println(ex.getMessage());} }}附录 C虚拟变量的语句 =IF(f2=1,1,0) =IF(f2=2,1,0) =IF(f2=3,1,0) =IF(g2=1,1,0) =IF(g2=2,1,0) =IF(g2=3,1,0) =IF(g2=4,1,0) =IF(h2=1,1,0) =IF(h2=2,1,0) =IF(h2=3,1,0) =IF(i2=1,1,0) =IF(i2=2,1,0) =IF(i2=3,1,0) =IF(i2=4,1,0)26
赞助商链接
racktom.com
copyright &copyright 。共享资料网内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 自变量的取值范围 的文章

 

随机推荐