决策树代码java实现 决策树算法java实现

求决策树源代码。最好使用matlab实现。

function [Tree RulesMatrix]=DecisionTree(DataSet,AttributName)

创新互联建站长期为上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为陇南企业提供专业的成都网站制作、网站设计、外贸网站建设陇南网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。

%输入为训练集,为离散后的数字,如记录1:1 1 3 2 1;

%前面为属性列,最后一列为类标

if nargin1

error('请输入数据集');

else

if isstr(DataSet)

[DataSet AttributValue]=readdata2(DataSet);

else

AttributValue=[];

end

end

if nargin2

AttributName=[];

end

Attributs=[1:size(DataSet,2)-1];

Tree=CreatTree(DataSet,Attributs);

disp([char(13) 'The Decision Tree:']);

showTree(Tree,0,0,1,AttributValue,AttributName);

Rules=getRule(Tree);

RulesMatrix=zeros(size(Rules,1),size(DataSet,2));

for i=1:size(Rules,1)

rule=cell2struct(Rules(i,1),{'str'});

rule=str2num([rule.str([1:(find(rule.str=='C')-1)]) rule.str((find(rule.str=='C')+1):length(rule.str))]);

for j=1:(length(rule)-1)/2

RulesMatrix(i,rule((j-1)*2+1))=rule(j*2);

end

RulesMatrix(i,size(DataSet,2))=rule(length(rule));

end

end

function Tree=CreatTree(DataSet,Attributs) %决策树程序 输入为:数据集,属性名列表

%disp(Attributs);

[S ValRecords]=ComputEntropy(DataSet,0);

if(S==0) %当样例全为一类时退出,返回叶子节点类标

for i=1:length(ValRecords)

if(length(ValRecords(i).matrix)==size(DataSet,1))

break;

end

end

Tree.Attribut=i;

Tree.Child=[];

return;

end

if(length(Attributs)==0) %当条件属性个数为0时返回占多数的类标

mostlabelnum=0;

mostlabel=0;

for i=1:length(ValRecords)

if(length(ValRecords(i).matrix)mostlabelnum)

mostlabelnum=length(ValRecords(i).matrix);

mostlabel=i;

end

end

Tree.Attribut=mostlabel;

Tree.Child=[];

return;

end

for i=1:length(Attributs)

[Sa(i) ValRecord]=ComputEntropy(DataSet,i);

Gains(i)=S-Sa(i);

AtrributMatric(i).val=ValRecord;

end

[maxval maxindex]=max(Gains);

Tree.Attribut=Attributs(maxindex);

Attributs2=[Attributs(1:maxindex-1) Attributs(maxindex+1:length(Attributs))];

for j=1:length(AtrributMatric(maxindex).val)

DataSet2=[DataSet(AtrributMatric(maxindex).val(j).matrix',1:maxindex-1) DataSet(AtrributMatric(maxindex).val(j).matrix',maxindex+1:size(DataSet,2))];

if(size(DataSet2,1)==0)

mostlabelnum=0;

mostlabel=0;

for i=1:length(ValRecords)

if(length(ValRecords(i).matrix)mostlabelnum)

mostlabelnum=length(ValRecords(i).matrix);

mostlabel=i;

end

end

Tree.Child(j).root.Attribut=mostlabel;

Tree.Child(j).root.Child=[];

else

Tree.Child(j).root=CreatTree(DataSet2,Attributs2);

end

end

end

function [Entropy RecordVal]=ComputEntropy(DataSet,attribut) %计算信息熵

if(attribut==0)

clnum=0;

for i=1:size(DataSet,1)

if(DataSet(i,size(DataSet,2))clnum) %防止下标越界

classnum(DataSet(i,size(DataSet,2)))=0;

clnum=DataSet(i,size(DataSet,2));

RecordVal(DataSet(i,size(DataSet,2))).matrix=[];

end

classnum(DataSet(i,size(DataSet,2)))=classnum(DataSet(i,size(DataSet,2)))+1;

RecordVal(DataSet(i,size(DataSet,2))).matrix=[RecordVal(DataSet(i,size(DataSet,2))).matrix i];

end

Entropy=0;

for j=1:length(classnum)

P=classnum(j)/size(DataSet,1);

if(P~=0)

Entropy=Entropy+(-P)*log2(P);

end

end

else

valnum=0;

for i=1:size(DataSet,1)

if(DataSet(i,attribut)valnum) %防止参数下标越界

clnum(DataSet(i,attribut))=0;

valnum=DataSet(i,attribut);

Valueexamnum(DataSet(i,attribut))=0;

RecordVal(DataSet(i,attribut)).matrix=[]; %将编号保留下来,以方便后面按值分割数据集

end

if(DataSet(i,size(DataSet,2))clnum(DataSet(i,attribut))) %防止下标越界

Value(DataSet(i,attribut)).classnum(DataSet(i,size(DataSet,2)))=0;

clnum(DataSet(i,attribut))=DataSet(i,size(DataSet,2));

end

Value(DataSet(i,attribut)).classnum(DataSet(i,size(DataSet,2)))= Value(DataSet(i,attribut)).classnum(DataSet(i,size(DataSet,2)))+1;

Valueexamnum(DataSet(i,attribut))= Valueexamnum(DataSet(i,attribut))+1;

RecordVal(DataSet(i,attribut)).matrix=[RecordVal(DataSet(i,attribut)).matrix i];

end

Entropy=0;

for j=1:valnum

Entropys=0;

for k=1:length(Value(j).classnum)

P=Value(j).classnum(k)/Valueexamnum(j);

if(P~=0)

Entropys=Entropys+(-P)*log2(P);

end

end

Entropy=Entropy+(Valueexamnum(j)/size(DataSet,1))*Entropys;

end

end

end

function showTree(Tree,level,value,branch,AttributValue,AttributName)

blank=[];

for i=1:level-1

if(branch(i)==1)

blank=[blank ' |'];

else

blank=[blank ' '];

end

end

blank=[blank ' '];

if(level==0)

blank=[' (The Root):'];

else

if isempty(AttributValue)

blank=[blank '|_____' int2str(value) '______'];

else

blank=[blank '|_____' value '______'];

end

end

if(length(Tree.Child)~=0) %非叶子节点

if isempty(AttributName)

disp([blank 'Attribut ' int2str(Tree.Attribut)]);

else

disp([blank 'Attribut ' AttributName{Tree.Attribut}]);

end

if isempty(AttributValue)

for j=1:length(Tree.Child)-1

showTree(Tree.Child(j).root,level+1,j,[branch 1],AttributValue,AttributName);

end

showTree(Tree.Child(length(Tree.Child)).root,level+1,length(Tree.Child),[branch(1:length(branch)-1) 0 1],AttributValue,AttributName);

else

for j=1:length(Tree.Child)-1

showTree(Tree.Child(j).root,level+1,AttributValue{Tree.Attribut}{j},[branch 1],AttributValue,AttributName);

end

showTree(Tree.Child(length(Tree.Child)).root,level+1,AttributValue{Tree.Attribut}{length(Tree.Child)},[branch(1:length(branch)-1) 0 1],AttributValue,AttributName);

end

else

if isempty(AttributValue)

disp([blank 'leaf ' int2str(Tree.Attribut)]);

else

disp([blank 'leaf ' AttributValue{length(AttributValue)}{Tree.Attribut}]);

end

end

end

function Rules=getRule(Tree)

if(length(Tree.Child)~=0)

Rules={};

for i=1:length(Tree.Child)

content=getRule(Tree.Child(i).root);

%disp(content);

%disp([num2str(Tree.Attribut) ',' num2str(i) ',']);

for j=1:size(content,1)

rule=cell2struct(content(j,1),{'str'});

content(j,1)={[num2str(Tree.Attribut) ',' num2str(i) ',' rule.str]};

end

Rules=[Rules;content];

end

else

Rules={['C' num2str(Tree.Attribut)]};

end

end

java课程分享JavaScript代码测试必备的12款工具

1、Jasmine

Jasmine是一个行为驱动的测试开发框架,用于对JavaScript代码进行测试。它不依赖其它任何JavaScript框架,也不需要DOM。它的语法简洁、明确,写测试非常容易。

2、Mocha

Mocha是一个功能丰富的JavaScript测试框架,既运行于Node.js环境中,也可以运行于浏览器环境中。Mocha以串行方式运行测试,能做出灵活而准确的报告,也能将测试中未捕捉的异常映射到正确的测试用例。

3、Chai

Chai是个支持BDD/TDD的库,可用于node和浏览器,可配合任何JavaScript测试框架使用。

4、QUnit

QUnit是个功能强大又易于使用的JavaScript单元测试框架。jQuery、jQueryUI和jQueyMobile项目都使用这个框架,它能测试普通的JavaScript代码。

5、Sinon

Sinon.JS为JavaScript提供了独立的spies、stubs和mocks[译者注:Spy、Stub和Mock都是测试专用名词,Stub常被翻译为桩,spies是Spy的复数形式,是一种可以监视方法、调用和参数的技术]。它不依赖任何东西,可以配合任何单元测试框架工作。

6、Karma

Karma是针对连通浏览器的一个框架无关测试运行器。每一个测试结果对应每个浏览器,它的测试和显示都是通过命令行暴露给开发者的,这样他们就可以看到浏览器测试的通过或失败。

7、Selenium

Selenium有一个简单的目标:就是自动化浏览器。它主要用于自动化测试web应用程序,但是只是很简单地考虑到了基于网络的管理任务。

8、WebdriverIO

WebdriverIO允许用户仅添加几行代码就可以控制浏览器或移动应用程序,使测试代码更简单、简洁、易读。集成的TestRunner同样允许你以同步的方式调用异步命令,这样你不需要关心如何处理Promise以避免竞态条件。此外,它取消了所有的繁琐的设置工作,并且会为您管理的Selenium会话。

9、Nightwatch

Nightwatch.js是一个易于使用的Node.js,它是为基于浏览器的app和网站设计的终端到终端(E2E)的测试方法。它使用强大的W3CWebDriverAPI,用于在DOM元素上执行命令和断言。

10、PhantomCSS

PhantomCSS获得CasperJS捕获的屏幕截图,并使用Resemble.js将其与基准图进行对比,以测试RGB像素差异。java课程发现PhantomCSS然后生成图像差异对比,用于帮助您找到原因。

11、PhantomFlow

PhantomFlow使用决策树提供UI测试方案。针对PhantomJS,CasperJS和PhantomCSS的NodeJS包装器——PhantomFlow能够流畅地在代码中描述用户流程,同时生成用于可视化的结构化树数据。

如何使用Java Weka开源项目,实现J48决策树、支持向量机算法,在10个UCI数据集上对这两个算法进行性能?

public static void Regular() throws Exception {

File inputfile = new File("F:\\weka\\eucalyptus_Train.arff");

ArffLoader loader = new ArffLoader();

loader.setFile(inputfile);

Instances insTrain = loader.getDataSet();

insTrain.setClassIndex(insTrain.numAttributes()-1);

inputfile = new File("F:\\weka\\eucalyptus_Test.arff");

loader.setFile(inputfile);

Instances insTest = loader.getDataSet();

insTest.setClassIndex(insTest.numAttributes()-1);

double sum = insTest.numInstances();

int right = 0;

Classifier clas = new J48();

//Classifier clas = new weka.classifiers.bayes.BayesNet();

clas.buildClassifier(insTrain);

for(int i = 0; i  sum; i++) {

if(clas.classifyInstance(insTest.instance(i)) == insTest.instance(i).classValue()) {

right++;

}

System.out.println(clas.classifyInstance(insTest.instance(i))+" : "+insTest.instance(i).classValue());

}

System.out.println("分类准确率:"+right/sum);

}

svm的话,要用一个wlsvm的包。 代码是一样的,就是Classifier class= new J48()这里要用svm的实例

如何用java做用户行为分析用什么算法

据我所知,java好像对大数据分析方面没有什么现成的方法或包可以调用。

现在做数据分析(机器学习)用的比较多的是Python和R还有Matlib;

//如果是简单的汇总分析,分类,回归的话,excel就足够了。java使用数据库也可以完成。

其中Python算比较简单的,有现成的科学计算工具和非常活跃的社区。

常用的算法:回归分析,支持向量机(SVM),决策树,K-近邻(KNN),K-均值(k-means)。。。还有比较火的深度学习(DL)。可以了解一下。

二分查找法的判定树有什么特点?能不能用一个公式直接求出树的深度?

算法思想:

将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。

折半查找是一种高效的查找方法。它可以明显减少比较次数,提高查找效率。但是,折半查找的先决条件是查找表中的数据元素必须有序。

算法步骤描述:

step1 首先确定整个查找区间的中间位置

mid = ( left + right )/ 2

step2 用待查关键字值与中间位置的关键字值进行比较;

若相等,则查找成功

若大于,则在后(右)半个区域继续进行折半查找

若小于,则在前(左)半个区域继续进行折半查找

Step3 对确定的缩小区域再按折半公式,重复上述步骤。最后,得到结果:要么查找成功, 要么查找失败。

折半查找的存储结构采用一维数组存放。

折半查找算法举例

对给定数列(有序),按折半查找算法,查找关键字值为30的数据元素。

折半查找的算法讨论:

优点: ASL≤log2n,即每经过一次比较,查找范围就缩小一半。经log2n 次计较就可以完成查找过程。

缺点:因要求有序,所以要求查找数列必须有序,而对所有数据元素按大小排序是非常费时的操作。另外,顺序存储结构的插入、删除操作不便利。

考虑:能否通过一次比较抛弃更多的部分(即经过一次比较,使查找范围缩得更小),以达到提高效率的目的。……?

可以考虑把两种方法(顺序查找和折半查找)结合起来,即取顺序查找简单和折半查找高效之所长,来达到提高效率的目的?实际上这就是分块查找的算法思想。

例如:[问题分析] 由于数据按升序排列,故用折半查找最快捷.

program binsearch;

const max=10;

var num:array[1..max] of integer;

i,n:integer;

procedure search(x,a,b:integer);

var mid:integer;

begin

if a=b then

if x=num[a] then writeln('Found:',a) else writeln('Number not found')

else begin

mid:=(a+b) div 2;

if xnum[mid] then search(x,mid,b);

if xnum[mid] then search(x,a,mid);

if x=num[mid] then writeln('Found:',mid);

end;

end;

begin

write('Please input 10 numbers in order:');

for i:=1 to max do read(num);

write('Please input the number to search:');

readln(n);

search(n,1,max);

end.

Java风格的代码举例:

//使用折半法进行查找

int getIndex(int[] nList, int nCount, int nCode) {

int nIndex = -1;

int jMin = 0;

int jMax = nCount - 1;

int jCur = (jMin+jMax)/2;

do

{

if(nList[jCur] nCode) {

jMax--;

} else if(nList[jCur] nCode) {

jMin++;

} else if(nList[jCur] == nCode) {

nIndex = jCur;

break;

}

jCur = (jMin + jMax)/2;

} while(jMin jMax);

return nIndex;

}

二分查找的性能说明

虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费 O(n lg n) 的时间。

二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。

对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。链表上无法实现二分查找

二分查找的C#实现代码:

using System;

using System.Collections.Generic;

using System.Text;

namespace BinschDemo

{

public class BinschDemo

{

public static int Binsch(int[] a, int key)

{

int low = 1;

int high = a.Length;

while (low = high)

{

int mid = (low + high) / 2;

if (key == a[mid])

{

return mid; //返回找到的索引值

}

else

{

if (key a[mid])

high = mid - 1;

else

low = mid + 1;

}

}

return -1; //查找失败

}

static void Main(string[] args)

{

Console.WriteLine("请输入10个递增数字: ");

int[] list = new int[10];

for (int i = 0; i 10; i++)

{

Console.Write("数字 : ", i);

list = Convert.ToInt32(Console.ReadLine());

}

Console.Write("请输入一个你要查找的数字:");

int find = Convert.ToInt32(Console.ReadLine());

int result = Binsch(list, find);

Console.WriteLine(result);

}

}

}

分块查找又索引查找,它主要用于“分块有序”表的查找。所谓“分块有序”是指将线性表L(一维数组)分成m个子表(要求每个子表的长度相等),且第i+1个子表中的每一个项目均大于第i个子表中的所有项目。“分块有序”表应该包括线性表L本身和分块的索引表A。因此,分块查找的关键在于建立索引表A。

(1)建立索引表A(二维数组)

索引表包括两部分:关键字项(子表中的最大值)和指针项(子表的第一项在线性表L中位置)

索引表按关键字有序的。

例如:线性表L(有序)为:1 2 3 4 5 6 7 8 9 10 11 12

分成m=3个子表:

索引表A:二维数组:第一列为每个子表的最大值 ,第二列为每个子表的起始地址

即: 4 0

8 4

12 8

(2)利用索引表A,确定待查项X所在的子表(块)。

(3)在所确定的子表中可以用“折半查找”法搜索待查项X;若找到则输出X;否则输出未找到信息。


当前标题:决策树代码java实现 决策树算法java实现
分享链接:http://azwzsj.com/article/hhdiss.html