HotSpot关联规则算法(2)-- 挖掘连续型和离散型数据

本篇代码可在 http://download.csdn.net/detail/fansy1990/8502323下载。

前篇《HotSpot关联规则算法(1)-- 挖掘离散型数据》分析了离散型数据的HotSpot关联规则,本篇分析离散型和连续型数据的HotSpot关联规则挖掘。

1. 首先看下数据格式(txt文档):

@attribute outlook {sunny, overcast, rainy}
@attribute temperature numeric
@attribute humidity numeric
@attribute windy {TRUE, FALSE}
@attribute play {yes, no}
sunny,85,85,FALSE,no
sunny,80,90,TRUE,no
overcast,83,86,FALSE,yes
rainy,70,96,FALSE,yes
rainy,68,80,FALSE,yes
rainy,65,70,TRUE,no
overcast,64,65,TRUE,yes
sunny,72,95,FALSE,no
sunny,69,70,FALSE,yes
rainy,75,80,FALSE,yes
sunny,75,70,TRUE,yes
overcast,72,90,TRUE,yes
overcast,81,75,FALSE,yes
rainy,71,91,TRUE,no

此数据參考weka自带数据weather.arff,并且数据格式,比方写上@attribute 等都是參考weka的数据格式来的。以下代码中使用的数据格式如上所述,其格式描写叙述例如以下:1)前m行以@attribute开头,代码m个属性。当中最后一个为目标属性;2)假设属性是数值型,则在attribute后面空格跟属性名,再空格跟numeric;假设是离散型。那么attribute后面空格跟属性名。再空格使用大括号把离散值括起来,离散值用逗号分隔;3)目标属性必须是离散型的(关于目标属性应该一定要属于离散型的这点要求,事实上仅仅是我代码里面这样说而已,一般的HotSpot算法并没有这个要求。

假设目标属性一定要求是连续型的,能够在lz代码基础上进行改动)。

2. 数据读取

《HotSpot关联规则算法(1)》中的数据读取是针对离散型的数据的,所以须要进行改动,这里改动后仅仅针对离散型数据进行编码。连续型数据保持就可以,同一时候还需设置一个布尔数组指明属性列属于离散型还是连续型。

其读代替码例如以下所看到的:

while ((tempString = reader.readLine()) != null) {
				// 第一行数据是标题
				if (tempString.indexOf(HSUtils.FILEFORMAT) == 0) {

					String attr = "";
					String[] attrStates = null;
					if (tempString.contains("{")) {
						attr = tempString.substring(
								HSUtils.FILEFORMAT.length(),
								tempString.indexOf("{")).trim();
						attrStates = tempString.substring(
								tempString.indexOf("{") + 1,
								tempString.indexOf("}")).split(",");
						for (int i = 0; i < attrStates.length; i++) {
							attrStates[i] = attrStates[i].trim();
						}
						numericList.add(false);
						this.attributeStates.put(attr, attrStates);// 在这里加入就可以
					} else {// numeric
						if (tempString.contains("numeric")) {
							attr = tempString.substring(
									HSUtils.FILEFORMAT.length(),
									tempString.indexOf("numeric")).trim();
							numericList.add(true);
						} else {
							// error 数据格式错误
							throw new Exception("数据格式错误,请检查!");
						}

					}
					attrList.add(attr);
					line++;

					continue;
				}
				if (flag) {
					this.attributes = new String[line];
					this.isNumeric = new Boolean[line];
					attrList.toArray(this.attributes);// 复制值到数组中
					numericList.toArray(this.isNumeric);
					flag = false;
				}
				String[] tempStrings = tempString.split(splitter);
				lists.add(strArr2IntArr(tempStrings));
			}

这里仅仅贴了while循环里面的代码,这里的代码即针对前面描写叙述的数据格式规则进行变量初始化(事实上,这里使用List存储转换后的数据。通常是能够使用数组来存储的。把List的数据转为数组就可以。这样在后面的操作中能够更快。假设要优化。能够从这方面入手)。

3.  HotSpot关联规则树的节点定义说明:

因为这里添加了连续型属性数据。所以针对单个节点需添加一个布尔型变量lessThan,用于指明是要大于或者小于该节点数据,同一时候stateIndex应该是一个数值了(当前节点的值),而不是离散型数据状态的下标了。

4. 算法伪代码(建树过程)

在算法伪代码中的计算潜在节点时。针对连续型变量使用不同的方法,在weka源代码中用法:evaluateNumeric来进行推断。在lz的代码中此部分是全然參考源代码中的代码的,只是有一点就是在调用evaluateNumeric这个算法后,会针对某一列进行排序,即一个二维数组按某列进行全局排序。这种方法在weka源代码中是使用Instances的quickSort方法进行排序的(使用了递归,没细致看)。这里lz则是直接把List转为二维数组然后进行排序的,其方法例如以下:

/**
	 * 依据attrIndex进行排序,attrIndex必须是numeric的 此方法可能须要优化
	 * List 使用数组是否更快? 能够考虑使用数组
	 * @param intData
	 * @param attrIndex
	 * @return
	 */
	private List<float[]> sortBasedOnAttr(List<float[]> intData, final int attrIndex) {

		float[][] tmpData = new float[intData.size()][];
		intData.toArray(tmpData);

		Arrays.sort(tmpData,new Comparator<float[]>(){
			@Override
			public int compare(float[] o1, float[] o2) {
				if(o1[attrIndex]==o2[attrIndex]){
					return 0;
				}
				return o1[attrIndex]>o2[attrIndex]?1:-1;
			}

		});
		List<float[]> returnList = new ArrayList<float[]>();
		for (int i = 0; i < tmpData.length; i++) {
			returnList.add(tmpData[i]);
		}
		return returnList;
	}

同一时候,在递归构建孩子节点时,生成节点规则时,针对数值型和离散型其生成方式也是不同的。例如以下:

double[] newSplitVals = splitVals.clone();
			byte[] newTests = tests.clone();
			newSplitVals[attrStateSup.getAttrIndex()] = attrStateSup
					.getStateIndex() + 1;
			newTests[attrStateSup.getAttrIndex()] = isNumeric[attrStateSup.getAttrIndex()]?
				attrStateSup.isLessThan()?(byte)1:(byte)3:(byte) 2;

			HotSpotHashKey key = new HotSpotHashKey(newSplitVals, newTests);

在递归构建孩子节点时,使用的子数据集的生成方式也须要进行调整,例如以下:

/**
	 * 获取和splitAttributeIndex相同下标的属性以及stateIndex的全部数据
	 *
	 * @param intData
	 * @param splitAttributeIndex
	 * @param splitValue
	 * @return
	 */
	private List<float[]> getSubData(List<float[]> intData,
			int splitAttributeIndex, float splitValue,boolean lessThan) {
		List<float[]> subData = new ArrayList<float[]>();
		for (float[] d : intData) {
			if(isNumeric[splitAttributeIndex]){
				if(lessThan){
					if (d[splitAttributeIndex] <= splitValue) {
		                subData.add(d);
		            }
				}else{
					if (d[splitAttributeIndex] > splitValue) {
		                subData.add(d);
		            }
				}
			}else{
				if (d[splitAttributeIndex] == splitValue) {
					subData.add(d);
				}
			}
		}
		return subData;
	}

节点的toString 方法,用于打印HotSpot关联规则树

/**
	 * 格式化输出
	 */
	public String toString(){
		String tmp = HSUtils.isNumeric(splitAttrIndex)?this.lessThan?

" <= ":" > ":" = ";
		String attrState = HSUtils.isNumeric(splitAttrIndex)?

String.valueOf(this.attrStateIndex):
			HSUtils.getAttrState(splitAttrIndex, (int)attrStateIndex);
 		return HSUtils.getAttr(this.splitAttrIndex)+tmp
				+attrState
				+"  ("+HSUtils.formatPercent(this.support)+" ["+this.stateCount+"/"+this.allCount+"])";
	}

在打印关联规则树时。相同须要推断当前的属性是离散型还是连续型的。

代码输出为:

文件读取完毕。且属性和属性的各种状态初始化完毕!
属性outlook的状态:	[sunny-->0,overcast-->1,rainy-->2,]
属性temperature的状态:	[numeric]
属性humidity的状态:	[numeric]
属性windy的状态:	[TRUE-->0,FALSE-->1,]
属性play的状态:	[yes-->0,no-->1,]

规则树例如以下:

play = no  (35.71% [5/14])
|	temperature > 83.0  (100.00% [1/1])
|	humidity > 90.0  (66.67% [2/3])
|	|	temperature > 70.0  (100.00% [2/2])
|	|	humidity <= 95.0  (100.00% [2/2])

分享。成长,快乐

脚踏实地,专注

转载请注明blog地址:http://blog.csdn.net/fansy1990

时间: 2024-12-28 22:09:25

HotSpot关联规则算法(2)-- 挖掘连续型和离散型数据的相关文章

HotSpot关联规则算法(1)-- 挖掘离散型数据

提到关联规则算法,一般会想到Apriori或者FP,一般很少有想到HotSpot的,这个算法不知道是应用少还是我查资料的手段太low了,在网上只找到很少的内容,这篇http://wiki.pentaho.com/display/DATAMINING/HotSpot+Segmentation-Profiling ,大概分析了一点,其他好像就没怎么看到了.比较好用的算法类软件,如weka,其里面已经包含了这个算法,在Associate--> HotSpot里面即可看到,运行算法界面一般如下: 其中,

机器学习--标称型和数值型数据

在监督学习(supervised learning)的过程中,只需要给定输入样本集,机器就可以从中推演出指定目标变量的可能结果.监督学习相对比较简单,机器只需从输入数据中预测合适的模型,并从中计算出目标变量的结果. 监督学习一般使用两种类型的目标变量:标称型和数值型 标称型:标称型目标变量的结果只在有限目标集中取值,如真与假(标称型目标变量主要用于分类) 数值型:数值型目标变量则可以从无限的数值集合中取值,如0.100,42.001等 (数值型目标变量主要用于回归分析)-------------

经典算法学习——交换两个整型数据

交换两个数是在编程中经常会用到的,当然我们可以用很常见的方式来实现,也可以各种稀奇古怪的方法来做.这里我们用三种比较常规的方式来做,太过古怪的方法个人觉得没有太大必要.实例代码上传至:https://github.com/chenyufeng1991/SwapFunction (1)使用指针 实现如下: // // main.c // SwapFunc // // Created by chenyufeng on 16/2/3. // Copyright © 2016年 chenyufengwe

Fp关联规则算法计算置信度及MapReduce实现思路

说明:參考Mahout FP算法相关相关源代码. 算法project能够在FP关联规则计算置信度下载:(仅仅是单机版的实现,并没有MapReduce的代码) 使用FP关联规则算法计算置信度基于以下的思路: 1. 首先使用原始的FP树关联规则挖掘出全部的频繁项集及其支持度:这里须要注意,这里是输出全部的频繁项集,并没有把频繁项集合并,所以须要改动FP树的相关代码,在某些步骤把全部的频繁项集输出:(ps:參考Mahout的FP树单机版的实现,进行了改动,暂不确定是否已经输出了全部频繁项集) 为举例简

MATLAB仿真中连续和离散的控制器有何区别?

matlab系统同时提供连续和离散的控制器和对象的目的是:在降低用户使用复杂程度的同时提高仿真精度.仿真速度和应用的广泛性. 仿真步长和求解精度的概念对于理解这个问题至关重要. 首先是步长,步长和求解精度存在一对矛盾,步长的选择是仿真消耗的时间和求解精度要求的折中.计算机只能一步一步计算你的电路或者其他方程,例如你输入一个连续的信号,计算机在一个时刻仅仅会采集这个信号上的一个点,然后把这个点带入你的控制器数学方程中,求出电路方程的一个解,根据这个解得到系统的输出.因此,仿真波形其实是一个个的点聚

垃圾收集器与内存分配策略(三)之HotSpot的算法实现

垃圾收集器与内存分配策略(三)--HotSpot的算法实现 Java JVM 垃圾回收 在HotSpot虚拟机上实现这些算法时,必须对算法的执行效率有着严格的考量,才能保证虚拟机高效地运行. 1. 枚举根节点 采用可达性分析从GC Roots节点中找引用链为例 存在的缺点: 1.在前面找出还存活对象时,采用可达性分析从GC Roots节点中找引用链时,可作为GC Roots的节点主要在全局性的引用(方法区的常量或类静态属性引用)与执行上下文(虚拟机栈栈帧中的本地变量表或本地方法栈中的Native

算法题——最大连续子序列乘积

1 template <typename Comparable> 2 Comparable maxprod( const vector<Comparable>&v) 3 { 4 int i; 5 Comparable maxProduct = 1; 6 Comparable minProduct = 1; 7 Comparable maxCurrent = 1; 8 Comparable minCurrent = 1; 9 //Comparable t; 10 11 for

时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)——三次指数平滑算法可以很好的保存时间序列数据的趋势和季节性信息

from:http://www.cnblogs.com/kemaswill/archive/2013/04/01/2993583.html 在时间序列中,我们需要基于该时间序列当前已有的数据来预测其在之后的走势,三次指数平滑(Triple/Three Order Exponential Smoothing,Holt-Winters)算法可以很好的进行时间序列的预测. 时间序列数据一般有以下几种特点:1.趋势(Trend)  2. 季节性(Seasonality). 趋势描述的是时间序列的整体走势

关于设计模式的创建型、结构型和行为型

设计模式主要分三个类型:创建型.结构型和行为型. 其中创建型有:一.Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点二.Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类.三.Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类.四.Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的