在统计学中,线性回归是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。
线性回归模型经常用最小二乘逼近来拟合,但他们也可能用别的方法来拟合,比如用最小化“拟合缺陷”在一些其他规范里(比如最小绝对误差回归),或者在桥回归中最小化最小二乘损失函数的惩罚.相反,最小二乘逼近可以用来拟合那些非线性的模型.因此,尽管“最小二乘法”和“线性模型”是紧密相连的,但他们是不能划等号的。
线性方程式可以是一元的也可以是多元的,如y=a+bx,
Y= a + b1X1 + b2X2 + … + bkXk等,但都是使用最小二乘法来获取最佳方程作为模型使用的。
原理(一元为例):研究两个变量(x,y)之间的相互关系时,通常可以得到一系列成对的数据(x1,y1.x2,y2... xm,ym);将这些数据描绘在x -y直角坐标系中,若发现这些点在一条直线附近,可以令这条直线方程如(式1-1)。
Yj= a0 + a1 Xi (式1-1)
其中:a0、a1 是任意实数
为建立这直线方程就要确定a0和a1,应用《最小二乘法原理》,将实测值Yi与利用(式1-1)计算值(Yj=a0+a1X)的离差(Yi-Yj)的平方和〔∑(Yi - Yj)2〕最小为“优化判据”。
令:φ = ∑(Yi - Yj)2 (式1-2)
把(式1-1)代入(式1-2)中得:
φ = ∑(Yi - a0 - a1Xi)2 (式1-3)
当∑(Yi-Yj)平方最小时,可用函数 φ 对a0、a1求偏导数,令这两个偏导数等于零。
(式1-4)
(式1-5)
亦即:
m a0 + (∑Xi ) a1 = ∑Yi (式1-6)
(∑Xi ) a0 + (∑Xi2 ) a1 = ∑(Xi,Yi) (式1-7)
得到的两个关于a0、 a1为未知数的两个方程组,解这两个方程组得出:
a0 = (∑Yi) / m - a1(∑Xi) / m (式1-8)
a1 = [m∑Xi Yi - (∑Xi ∑Yi)] / [m∑Xi2 - (∑Xi)2 )] (式1-9)
这时把a0、a1代入(式1-1)中, 此时的(式1-1)就是我们回归的元线性方程即:数学模型。
attributeSelectionMethod(属性选择方法,使用那些属性来构造模型):有三个方法可供选择
M5 method(默认),
no attribute selection(使用所有非目标属性),
greedy method(贪婪算法精确度低,节约时间),
如果设置为no attribute selection无论共线属性eliminateColinearAttributes设置 为什么都会选择目标属性之外的所有属性进行模型的创建。
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。它省去了为查找最优解而去穷尽所有可能而耗费的大量时间,贪心算法通常以自顶向下的方式进行,以迭代的方式做出相继的贪心选择,每作一次贪心选择就将所求问题简化为一个规模更小的子问题。贪心算法解题思路:
1.建立数学模型来描述问题。
2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.把子问题的解局部最优解合成原来解问题的一个解。
Debug(调试):false(默认),true如果设置为true,分类器可以输出到控制台的额外的 信息(程序中几乎没用)。额外信息如下:
@relation fh-weka.filters.supervised.attribute.NominalToBinary-weka.f ilters.unsupervised.attribute.ReplaceMissingValues
@attribute month numeric
@attribute fhvalue numeric
@data
doRegression( true false )
Initial Akaike value: 40.0
doRegression( false false )
(akaike: 68.129092653061
eliminateColinearAttributes:true(默认),false是否消除共线的属性。如果是多元线性回归是,其中的 两个属性存在共线关系,那么该方法会采取向前排除法取消位置在前面的那个共线属性,再进 行模型的创建。(还用向后排除法,网上多建议使用向前排除法,weka也是这样做的)。
Minimal:true or false(默认)如果设置为true数据集头,手段和stdevs,被丢弃,以节省内存, 但是该(模型就不可以被打印出来)。
Ridge:该参数的取值对生成模型的好坏起主要作用。
Mean absolute error (平均绝对误差):越小越好
程序中调用weka的API方法顺序及作用:
1.生成一个可以自动分析sql的实例;
InstanceQuery query = new InstanceQuery();
2.设置要分析的sql1用于生成模型
query.setQuery(sql);
3.获取数据
Instances insTrain=query.retrieveInstances();
4.设置要预测的属性
insTrain.setClassIndex(insTrain.numAttributes()-1);//属性的下标,默认都是最后一个属性
5.创建分类器
LinearRegression lr = new LinearRegression();
6.分类器初始化参数
//设置入参
SelectedTag selectedTag=new SelectedTag(LinearRegression.SELECTION_M5,LinearRegression.TAGS_SELECTION);
//SelectedTag第一个参数是可以改变的,但是必须在第二数组参数中存在
lr.setAttributeSelectionMethod(selectedTag);
lr.setDebug(false);//控制打印信息
lr.setEliminateColinearAttributes(true);//是否取消共线属性
lr.setMinimal(false);//false可以输出模型公式
lr.setRidge(1.0E-1);//对结果影响明显
7.进行线性回归分析
lr.buildClassifier(insTrain);
8.评估
Evaluation eval=new Evaluation(insTrain);
eval.evaluateModel(lr, insTrain);
9.获取评价标准
String mean=eval.meanAbsoluteError();//平均绝对误差 或 剩余(残差)平方和 :越小越好
10.获取模型公式
String model=lr.toString();
以上是使用历史数据获取模型用到的方法及使用情况。对要预测的数据进行预测还需下面的方法:
11.获取待预测的数据(sql2中的待预测数据用?表示)
query.setQuery(sql2);
Instances insTest=query.retrieveInstances();//获取待预测数据
insTrain.setClassIndex(insTrain.numAttributes()-1);//设置成相同的属性下标,默认都是最后一个属性
12.获取预测结果(两种方法)
方法一:直接返回到数组中
double yuce[]=eval.evaluateModel(lr, insTest);//将预测结果以数组的形式返回
方法二:调用分类器方法classifyInstance(Instance instance)循环输出每一个实例的预测值
double sum = insTest.numInstances();//获取预测实例的总数
for(int i=0;i //<---输出预测数据---> System.out.println(insTest.instance(i).value(0)+" : "+lr.classifyInstance(insTest.instance(i))); } 13.将相应的预测结果插入数据库中保存。(如对模型不满意,可以修改各项参数再次进行分析) 原理与上面的线性回归的原理相同,但是该方法只适用于自变量为一元的测试数据。 Debug(调试):false(默认),true如果设置为true,分类器可以输出到控制台的额外的 信息(程序中几乎没用)。由false改为true后打印模型公式时并没有额外信息输出。 Mean absolute error (平均绝对误差):越小越好 程序中调用weka的API方法顺序及作用: 1.生成一个可以自动分析sql的实例; InstanceQuery query = new InstanceQuery(); 2.设置要分析的sql1用于生成模型 query.setQuery(sql); 3.获取数据 Instances insTrain=query.retrieveInstances(); 4.设置要预测的属性 insTrain.setClassIndex(insTrain.numAttributes()-1);//属性的下标,默认都是最后一个属性 5.创建分类器 SimpleLinearRegression slr=new SimpleLinearRegression(); 6.分类器初始化参数 //设置入参 slr.setDebug(false);//控制打印信息(改为true时程序控制台中没有变化) 7.进行线性回归分析 slr.buildClassifier(insTrain); 8.评估 Evaluation eval=new Evaluation(insTrain); eval.evaluateModel(slr, insTrain); 9.获取评价标准 String mean=eval.meanAbsoluteError();//平均绝对误差 或 剩余(残差)平方和 :越小越好 10.获取模型公式 String model=slr.toString(); 以上是使用历史数据获取模型用到的方法及使用情况。对要预测的数据进行预测还需下面的方法: 11.获取待预测的数据(sql2中的待预测数据用?表示) query.setQuery(sql2); Instances insTest=query.retrieveInstances();//获取待预测数据 insTrain.setClassIndex(insTrain.numAttributes()-1);//设置成相同的属性下标,默认都是最后一个属性 12获取预测结果(两种方法) 方法一:直接返回到数组中 double yuce[]=eval.evaluateModel(slr, insTest);//将预测结果以数组的形式返回 方法二:调用分类器方法classifyInstance(Instance instance)循环输出每一个实例的预测值 double sum = insTest.numInstances();//获取预测实例的总数 for(int i=0;i //<---输出预测数据---> System.out.println(insTest.instance(i).value(0)+" : "+slr.classifyInstance(insTest.instance(i))); } 13.将相应的预测结果插入数据库中保存。 它采用了k-means聚类算法提供的基础功能,并获悉了logistic回归(离散类的问题)或线性回归(数字类的问题),最重要的是径向基函数网络适合每个簇中的数据。如果类是名义上的,它使用给定数量的每一个类.它的集群可以标准化所有的数字属性,零均值和单位方差。 贝叶斯分析方法的特点是使用概率去表示所有形式的不确定性。学习或其他形式的推理都是用概率规则来实现的。贝叶斯学习的结果表示为随机变量的概率分布,它可以解释为我们对不同可能性的信任程度。 贝叶斯网络创建模型是采用k-means聚类算法提供的基础功能,获取数据的分类,并获取分类的中心值(均值或中位数),然后计算每个实例属于不同分类的概率,以概率为自变量,以目标值为因变量,来构造模型公式。如:fhvalue = 633.4514 * pCluster_0_0 -633.4501 * pCluster_0_1 + 11255.7873,fhvalue 为目标值,pCluster_0_0表示实例属于类别Cluster_0_0的概率,pCluster_0_1表示实例属于类别Cluster_0_1的概率。 clusteringSeed - 传递到K-均值的随机种子。 debug - 如果设置为true,分类器可以输出到控制台的额外的信息(程序中没有看到有额外信息输出)。 ridge - 基数。 几种常见的度量,可以用于评估数值预测成功与否。表中各个公式中的p为预测值,a为真实值。 相关性系数 (Correlation Coecient)是真实值a与预测值p之间的统计相关性,它是一个[-1,1]之间的实数。1表示完全相关,0表示完全不相关,-1表示反向完全相关。对一个数值预测模型,相关性系数越接近1表明预测能力越好,而其他误差相关的度量都是越小越接近0越好。均方误差是最常用的基本方法,程序中得不到,但是可以得到均方根误差。 其他的度量也可以做参考。需要注意最终使用哪些度量取决于具体的应用环境。 程序中调用weka的API方法顺序及作用: 1.生成一个可以自动分析sql的实例; InstanceQuery query = new InstanceQuery(); 2.设置要分析的sql1用于生成模型 query.setQuery(sql); 3.获取数据 Instances insTrain=query.retrieveInstances(); 4.设置要预测的属性 insTrain.setClassIndex(insTrain.numAttributes()-1);//属性的下标,默认都是最后一个属性 5.创建分类器 RBFNetwork rbn=new RBFNetwork(); 6.分类器初始化参数 //设置入参 rbn.setClusteringSeed(2);//k-means的随机种子数 rbn.setDebug(false);//控制打印信息(无额外信息输出) rbn.setMaxIts(10);//k-means获取中心值的迭代次数,只适用于离散类别的问题 rbn.setMinStdDev(0.1);//k-means最低标准偏差 rbn.setNumClusters(3);//k-means类别数 rbn.setRidge(1.0E-8); 7.进行线性回归分析 rbn.buildClassifier(insTrain); 8.评估 Evaluation eval=new Evaluation(insTrain); eval.evaluateModel(rbn, insTrain); 9.获取评价标准 System.out.println("平均绝对误差:"+eval.meanAbsoluteError());//越小越好 System.out.println("均方根误差:"+eval.rootMeanSquaredError());//越小越好 System.out.println("相关性系数:"+eval.correlationCoefficient());//越接近1越好 System.out.println("根均方误差:"+eval.rootMeanSquaredError());//越小越好 System.err.println("是否准确的参考值:"+eval.meanAbsoluteError());//越小越好 10.获取模型公式 String model=rbn.toString(); 以上是使用历史数据获取模型用到的方法及使用情况。对要预测的数据进行预测还需下面的方法: 11.获取待预测的数据(sql2中的待预测数据用?表示) query.setQuery(sql2); Instances insTest=query.retrieveInstances();//获取待预测数据 insTrain.setClassIndex(insTrain.numAttributes()-1);//设置成相同的属性下标,默认都是最后一个属性 12获取预测结果(两种方法) 方法一:直接返回到数组中 double yuce[]=eval.evaluateModel(rbn, insTest);//将预测结果以数组的形式返回 方法二:调用分类器方法classifyInstance(Instance instance)循环输出每一个实例的预测值 double sum = insTest.numInstances();//获取预测实例的总数 for(int i=0;i //<---输出预测数据---> System.out.println(insTest.instance(i).value(0)+" : "+rbn.classifyInstance(insTest.instance(i))); } 13.将相应的预测结果插入数据库中保存。(如对模型不满意,可以修改各项参数再次进行分析) 利用输出后的误差来估计输出层的直接前导层的误差,再用这个误差估计更前一层的误差,如此一层一层的反传下去,就获得了所有其他各层的误差估计。 Weka中使用的就是三层BP网络,如下图所示: 具体的算法描述可以看ppt BP神经网络算法原理.ppt 下面我们来看各个参数的具体意义: 几种常见的度量,可以用于评估数值预测成功与否。表中各个公式中的p为预测值,a为真实值。 相关性系数 (Correlation Coecient)是真实值a与预测值p之间的统计相关性,它是一个[-1,1]之间的实数。1表示完全相关,0表示完全不相关,-1表示反向完全相关。对一个数值预测模型,相关性系数越接近1表明预测能力越好,而其他误差相关的度量都是越小越接近0越好。均方误差是最常用的基本方法,程序中得不到,但是可以得到均方根误差。 程序中调用weka的API方法顺序及作用: 1.生成一个可以自动分析sql的实例; InstanceQuery query = new InstanceQuery(); 2.设置要分析的sql1用于生成模型 query.setQuery(sql); 3.获取数据 Instances insTrain=query.retrieveInstances(); 4.设置要预测的属性 insTrain.setClassIndex(insTrain.numAttributes()-1);//属性的下标,默认都是最后一个属性 5.创建分类器 MultilayerPerceptron mp=new MultilayerPerceptron(); 6.分类器初始化参数 //设置入参 mp.setGUI(false);//是否进行图形交互 mp.setAutoBuild(true);//设置网络中的连接和隐层 mp.setDebug(false);//控制打印信息 mp.setDecay(false);//如果为true会降低学习速率 mp.setHiddenLayers("a");//对预测结果几乎没用影响 mp.setLearningRate(0.3);//Weights被更新的数量,对预测结果影响很大 mp.setMomentum(0.8);//当更新weights时设置的动量 mp.setNormalizeAttributes(true);//可以优化网络性能 mp.setNormalizeNumericClass(true);//如果预测的是数值型可以提高网络的性能 mp.setReset(false);//必须要在AutoBuild为true的条件下进行设置否则默认即可 mp.setSeed(0);//随机种子数,对预测结果影响大 mp.setTrainingTime(300);//迭代的次数,有一定影响,但是不大 mp.setValidationSetSize(20);//验证百分比,影响大 mp.setValidationThreshold(50);//几乎没用影响 mp.setNominalToBinaryFilter(true);//可以提高性能 7.进行线性回归分析 rbn.buildClassifier(insTrain); 8.评估 Evaluation eval=new Evaluation(insTrain); eval.evaluateModel(mp, insTrain); 9.获取评价标准 System.out.println("平均绝对误差:"+eval.meanAbsoluteError());//越小越好 System.out.println("均方根误差:"+eval.rootMeanSquaredError());//越小越好 System.out.println("相关性系数:"+eval.correlationCoefficient());//越接近1越好 System.out.println("根均方误差:"+eval.rootMeanSquaredError());//越小越好 System.err.println("是否准确的参考值:"+eval.meanAbsoluteError());//越小越好 10.获取模型公式 String model=mp.toString();//看不出模型的意思 以上是使用历史数据获取模型用到的方法及使用情况。对要预测的数据进行预测还需下面的方法: 11.获取待预测的数据(sql2中的待预测数据用?表示) query.setQuery(sql2); Instances insTest=query.retrieveInstances();//获取待预测数据 insTrain.setClassIndex(insTrain.numAttributes()-1);//设置成相同的属性下标,默认都是最后一个属性 12获取预测结果(两种方法) 方法一:直接返回到数组中 double yuce[]=eval.evaluateModel(mp, insTest);//将预测结果以数组的形式返回 方法二:调用分类器方法classifyInstance(Instance instance)循环输出每一个实例的预测值 double sum = insTest.numInstances();//获取预测实例的总数 for(int i=0;i //<---输出预测数据---> System.out.println(insTest.instance(i).value(0)+" : "+rbn.classifyInstance(insTest.instance(i))); } 13.将相应的预测结果插入数据库中保存。(如对模型不满意,可以修改各项参数再次进行分析) 原文地址:http://nanjiguilai.blog.163.com/blog/static/114800242201322033836158/
2.简单线性回归(SimpleLinearRegression)
2.1原理
2.2参数
2.3模型好坏的评价标准
2.4API的调用
3.RBFNetwork(径向基函数网络或贝叶斯网络)
3.1原理
3.2参数
maxIts - 最大的迭代次数的logistic回归进行。只适用于离散类别的问题。
minStdDev - 最低标准偏差。
numClusters - K-均值方法的分类个数
3.3模型好坏的评价标准
3.4API的调用
4.MultilayerPerceptron(神经网络)
4.1原理
MultilayerPerceptron(神经网络)或多层感知器,使用的计算方法是BP网络的误差反向后传BP(Back Propagation)学习算法。
4.2weka参数
1.GUI(一般不需要,设为false即可)
弹出一个GUI界面。其允许我们在神经网络训练的过程中暂停和做一些修改(altering)
按左键添加一个节点(node)(节点将被自动选择以保证没有其他的节点被选择)
选中一个节点:左键单击
连接一个节点:首先选中一个起始节点,然后点击一个结束节点或者空白区域(这将创建一个新节点并与起始节点连接)。在连接后节点的状态将保持不变。
删除连接:选择一个连接的节点并且右键单击另一个节点
删除节点:右键单击一个节点
取消选择:左键单击节点或者在空白区域右键单击
标签(label)提供的原始输入(raw input)在左边
红色的节点是隐层(hidden layers)
橙色的节点是输出节点(output nodes)
在右边的标签展示的是输出节点表示的类别。要注意的是对于一个数值属性的类别来说,输出节点将自动的做成一个unthresholded的线性单元。
更改神经网络只能在网络没有启动(running)的时候做,这条规则也适用于学习速率(learning rate)和其他在控制面板上的区域。您可以在任何时候结束网络,网络在一开始是自动暂停的。一旦网络训练完毕它会再次停止并且等待结果是否被接受还是继续训练,注意的是如果没有设置GUI,这个网络将不需要任何的交互(interaction)。
2.autoBuild(自动构建)
添加网络中的连接和隐层设置为true和false的不同之处:
3.debug
设置为True分类器将输出额外的信息到控制台(console)(未见额外信息输出)。
4.decay
这将导致学习的速率的降低。其将初始的学习速率除以迭代次数(epoch number)去决定当前的学习速率。这对于停止神经网络背离目标输出有帮助,也提高了general performance。要注意的是衰退的学习速率不会显示在GUI中。如果学习速率在GUI中被改变,这将被视为初始的学习速率。
5.hiddenLayers(隐藏层)对预测结果几乎没用影响
定义神经网络的隐层。这是一个正整数的列表。1 for each hidden layer.用逗号分隔。如果没有隐层就在这里输入0。这只被用于自动构建是设置了的。也有通用符 'a' = (attribs + classes) / 2, 'i' = attribs, 'o' = classes , 't' = attribs + classes。
6.learningRate学习速率(对预测结果有很大的影响)
Weights被更新的数量
7.momentum(对预测结果有很大的影响)
当更新weights时设置的动量
8.normalizeAttributes(建议默认为true)
将正则化(normalize)属性。这个能提高网络的performance。其并不依赖于class是不是数值属性的。其也会正则化名词性(nominal)的属性(当他们被nominal to binary filter run过后),这样名词性属性是在-1和1之间。
9.normalizeNumericClass
将会正则化class如果其实数值属性的。这也可以提高网络的performance,其将class正则化到-1和1之间。注意的是这仅仅是内部的,输出会被转换回原始的范围。
10.reset(必须要在AutoBuild为true的条件下进行设置否则默认即可,否则预测结果会全部相同)
这将允许网络用一个更低的学习速率复位。如果网络偏离了答案其将会自动的用更低的学习速率复位并且重新训练。只有当GUI没有被set的时候这个选项才是available的。
注意的是如果这个网络偏离了将会允许重新启动,并且返回一个错误信息。
11.seed(对预测结果影响大)
Seed用于初始化随机数的生成。随机数被用于设定节点之间连接的初始权重,并且用于刷新训练集。
12.trainingTime(类似迭代次数)
训练的迭代次数。如果设置的是非0那么这个网络能够终止的比较早。结果有一定影响,但是不大。
13.validationSetSize(验证百分比)
Validation set的百分比,训练将持续直到其观测到在validation set上的误差已经不再变化,或者训练的时间已经到了。对结果影响大。
如果validation set设置的是0那么网络将一直训练直到达到迭代的次数。
14.validationThreshold
用于终止验证测试。这个值用于决定在训练终止前在一行内的验证错误可以变的更差。对结果几乎没用影响。
4.3模型好坏的评价标准
4.4API的调用