From bd9cb31f6476c774014765adf0b306d37275615a Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Wed, 1 Mar 2017 21:55:04 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=86=B3=E7=AD=96?= =?UTF-8?q?=E6=A0=91=E6=B5=81=E7=A8=8B=E4=BB=8B=E7=BB=8D=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/3.决策树.md | 2 ++ docs/3.决策树流程介绍图.jpg | Bin 0 -> 57137 bytes 2 files changed, 2 insertions(+) create mode 100644 docs/3.决策树流程介绍图.jpg diff --git a/docs/3.决策树.md b/docs/3.决策树.md index 4a2db238..65494b33 100644 --- a/docs/3.决策树.md +++ b/docs/3.决策树.md @@ -23,3 +23,5 @@ * \\(H = -\sum_{i=0}^np(x_i)\log_2p(x_i)\\) 表示香农熵,用于计算信息熵 * 基尼不纯度(Gini impurity) [本书不做过多的介绍] * 简单来说:就是从一个数据集中随机选取子项,度量其被错误分类到其他分组里的概率。 +* 流程介绍图 +* ![决策树流程介绍图](./3.决策树流程介绍图.jpg) \ No newline at end of file diff --git a/docs/3.决策树流程介绍图.jpg b/docs/3.决策树流程介绍图.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5908deda54d6228e6f1582bff74118365fc8ee4 GIT binary patch literal 57137 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 Date: Fri, 3 Mar 2017 15:17:56 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=A0=91=E5=9B=9E?= =?UTF-8?q?=E5=BD=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- docs/9.树回归.md | 13 +++ src/python/09.RegTrees/regTrees.py | 140 +++++++++++++++++++++++++++++ 3 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 docs/9.树回归.md create mode 100644 src/python/09.RegTrees/regTrees.py diff --git a/README.md b/README.md index fc123341..0d56cfa5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MachineLearning -**Mahchine Leaning in Action (python)** +**Mahchine Leaning in Action (python) | ApacheCN(apache中文网)** ## 第一部分 分类 @@ -19,6 +19,7 @@ * 8) 预测数值型数据:回归 * 9) 数回归 + * [树回归](./docs/9.树回归.md) ## 第三部分 无监督学习 @@ -41,3 +42,4 @@ * 附录D 资源 * 索引 * 版权声明 +* [ApacheCN(apache中文网) 更新](wwww.apache.wiki) \ No newline at end of file diff --git a/docs/9.树回归.md b/docs/9.树回归.md new file mode 100644 index 00000000..bd68557c --- /dev/null +++ b/docs/9.树回归.md @@ -0,0 +1,13 @@ + +# 9) 树回归 + +* 树回归是什么? + * 分类回归树(Classification and Regression Tree,CART)是一种典型的决策树算法,CART算法不仅可以应用于分类问题,而且可以用于回归问题。 + * CART算法构建的回归树并介绍其中的树剪枝技术(该技术主要的目的是防止数的过拟合) +* 树回归的构建 + * 优点:可以对复杂和非线性的数据建模。 + * 缺点:结果不易理解。 + * 适用数据类型:数值型和标称型数据。 + + + \ No newline at end of file diff --git a/src/python/09.RegTrees/regTrees.py b/src/python/09.RegTrees/regTrees.py new file mode 100644 index 00000000..c1436e0e --- /dev/null +++ b/src/python/09.RegTrees/regTrees.py @@ -0,0 +1,140 @@ +#!/usr/bin/python +# coding:utf8 + +''' +Created on Feb 4, 2011 +Update on 2017-03-02 +Tree-Based Regression Methods Source Code for Machine Learning in Action Ch. 9 +@author: Peter Harrington/jiangzhonglian +''' +from numpy import * + +def loadDataSet(fileName): #general function to parse tab -delimited floats + dataMat = [] #assume last column is target value + fr = open(fileName) + for line in fr.readlines(): + curLine = line.strip().split('\t') + fltLine = map(float,curLine) #map all elements to float() + dataMat.append(fltLine) + return dataMat + +def binSplitDataSet(dataSet, feature, value): + mat0 = dataSet[nonzero(dataSet[:,feature] > value)[0],:][0] + mat1 = dataSet[nonzero(dataSet[:,feature] <= value)[0],:][0] + return mat0,mat1 + +def regLeaf(dataSet):#returns the value used for each leaf + return mean(dataSet[:,-1]) + +def regErr(dataSet): + return var(dataSet[:,-1]) * shape(dataSet)[0] + +def linearSolve(dataSet): #helper function used in two places + m,n = shape(dataSet) + X = mat(ones((m,n))); Y = mat(ones((m,1)))#create a copy of data with 1 in 0th postion + X[:,1:n] = dataSet[:,0:n-1]; Y = dataSet[:,-1]#and strip out Y + xTx = X.T*X + if linalg.det(xTx) == 0.0: + raise NameError('This matrix is singular, cannot do inverse,\n\ + try increasing the second value of ops') + ws = xTx.I * (X.T * Y) + return ws,X,Y + +def modelLeaf(dataSet):#create linear model and return coeficients + ws,X,Y = linearSolve(dataSet) + return ws + +def modelErr(dataSet): + ws,X,Y = linearSolve(dataSet) + yHat = X * ws + return sum(power(Y - yHat,2)) + +def chooseBestSplit(dataSet, leafType=regLeaf, errType=regErr, ops=(1,4)): + tolS = ops[0]; tolN = ops[1] + #if all the target variables are the same value: quit and return value + if len(set(dataSet[:,-1].T.tolist()[0])) == 1: #exit cond 1 + return None, leafType(dataSet) + m,n = shape(dataSet) + #the choice of the best feature is driven by Reduction in RSS error from mean + S = errType(dataSet) + bestS = inf; bestIndex = 0; bestValue = 0 + for featIndex in range(n-1): + for splitVal in set(dataSet[:,featIndex]): + mat0, mat1 = binSplitDataSet(dataSet, featIndex, splitVal) + if (shape(mat0)[0] < tolN) or (shape(mat1)[0] < tolN): continue + newS = errType(mat0) + errType(mat1) + if newS < bestS: + bestIndex = featIndex + bestValue = splitVal + bestS = newS + #if the decrease (S-bestS) is less than a threshold don't do the split + if (S - bestS) < tolS: + return None, leafType(dataSet) #exit cond 2 + mat0, mat1 = binSplitDataSet(dataSet, bestIndex, bestValue) + if (shape(mat0)[0] < tolN) or (shape(mat1)[0] < tolN): #exit cond 3 + return None, leafType(dataSet) + return bestIndex,bestValue#returns the best feature to split on + #and the value used for that split + +def createTree(dataSet, leafType=regLeaf, errType=regErr, ops=(1,4)):#assume dataSet is NumPy Mat so we can array filtering + feat, val = chooseBestSplit(dataSet, leafType, errType, ops)#choose the best split + if feat == None: return val #if the splitting hit a stop condition return val + retTree = {} + retTree['spInd'] = feat + retTree['spVal'] = val + lSet, rSet = binSplitDataSet(dataSet, feat, val) + retTree['left'] = createTree(lSet, leafType, errType, ops) + retTree['right'] = createTree(rSet, leafType, errType, ops) + return retTree + +def isTree(obj): + return (type(obj).__name__=='dict') + +def getMean(tree): + if isTree(tree['right']): tree['right'] = getMean(tree['right']) + if isTree(tree['left']): tree['left'] = getMean(tree['left']) + return (tree['left']+tree['right'])/2.0 + +def prune(tree, testData): + if shape(testData)[0] == 0: return getMean(tree) #if we have no test data collapse the tree + if (isTree(tree['right']) or isTree(tree['left'])):#if the branches are not trees try to prune them + lSet, rSet = binSplitDataSet(testData, tree['spInd'], tree['spVal']) + if isTree(tree['left']): tree['left'] = prune(tree['left'], lSet) + if isTree(tree['right']): tree['right'] = prune(tree['right'], rSet) + #if they are now both leafs, see if we can merge them + if not isTree(tree['left']) and not isTree(tree['right']): + lSet, rSet = binSplitDataSet(testData, tree['spInd'], tree['spVal']) + errorNoMerge = sum(power(lSet[:,-1] - tree['left'],2)) +\ + sum(power(rSet[:,-1] - tree['right'],2)) + treeMean = (tree['left']+tree['right'])/2.0 + errorMerge = sum(power(testData[:,-1] - treeMean,2)) + if errorMerge < errorNoMerge: + print "merging" + return treeMean + else: return tree + else: return tree + +def regTreeEval(model, inDat): + return float(model) + +def modelTreeEval(model, inDat): + n = shape(inDat)[1] + X = mat(ones((1,n+1))) + X[:,1:n+1]=inDat + return float(X*model) + +def treeForeCast(tree, inData, modelEval=regTreeEval): + if not isTree(tree): return modelEval(tree, inData) + if inData[tree['spInd']] > tree['spVal']: + if isTree(tree['left']): return treeForeCast(tree['left'], inData, modelEval) + else: return modelEval(tree['left'], inData) + else: + if isTree(tree['right']): return treeForeCast(tree['right'], inData, modelEval) + else: return modelEval(tree['right'], inData) + +def createForeCast(tree, testData, modelEval=regTreeEval): + m=len(testData) + yHat = mat(zeros((m,1))) + for i in range(m): + yHat[i,0] = treeForeCast(tree, mat(testData[i]), modelEval) + return yHat \ No newline at end of file From 38c6cbc292cce9fea778a151de026856969151f5 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Fri, 3 Mar 2017 15:20:28 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E6=9B=B4=E6=96=B0Readme=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0ApachCN=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0d56cfa5..0ae96161 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MachineLearning -**Mahchine Leaning in Action (python) | ApacheCN(apache中文网)** +**Mahchine Leaning in Action (python) | [ApacheCN(apache中文网)](http://wwww.apache.wiki)** ## 第一部分 分类 @@ -42,4 +42,4 @@ * 附录D 资源 * 索引 * 版权声明 -* [ApacheCN(apache中文网) 更新](wwww.apache.wiki) \ No newline at end of file +* [ApacheCN(apache中文网) 维护更新](http://wwww.apache.wiki) \ No newline at end of file From 53e54a6ac9b653443c436fd8058073af8ff5ca94 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Fri, 3 Mar 2017 15:21:05 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E6=9B=B4=E6=96=B0Readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0ae96161..281a773d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MachineLearning -**Mahchine Leaning in Action (python) | [ApacheCN(apache中文网)](http://wwww.apache.wiki)** +**Mahchine Leaning in Action (python) | [ApacheCN(apache中文网)](http://www.apache.wiki)** ## 第一部分 分类 @@ -42,4 +42,4 @@ * 附录D 资源 * 索引 * 版权声明 -* [ApacheCN(apache中文网) 维护更新](http://wwww.apache.wiki) \ No newline at end of file +* [ApacheCN(apache中文网) 维护更新](http://www.apache.wiki) \ No newline at end of file From 37bc27e0e40de3d610c51577353f5e7624e67d5c Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Fri, 3 Mar 2017 15:23:17 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E6=9B=B4=E6=96=B0ML=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 281a773d..d95720a4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MachineLearning -**Mahchine Leaning in Action (python) | [ApacheCN(apache中文网)](http://www.apache.wiki)** +**Mahchine Leaning in Action (python) | [ApacheCN(apache中文网)](http://www.apache.wiki/display/ML)** ## 第一部分 分类 @@ -42,4 +42,4 @@ * 附录D 资源 * 索引 * 版权声明 -* [ApacheCN(apache中文网) 维护更新](http://www.apache.wiki) \ No newline at end of file +* [ApacheCN(apache中文网) 维护更新](http://www.apache.wiki/display/ML) \ No newline at end of file From 10e1c2b5772b233f474c619bf490886c83a45003 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Mon, 6 Mar 2017 21:13:32 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E6=A0=91=E7=9A=84Coding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- docs/9.树回归.md | 6 +- src/python/01.NumPy.py | 9 +- src/python/03.DecisionTree/DTSklearn.py | 1 + .../03.DecisionTree/DecisionTreePlot.py | 6 +- src/python/09.RegTrees/TreeNode.py | 16 ++ src/python/09.RegTrees/regTrees.py | 184 ++++++++++++---- testData/RT_data1.txt | 200 ++++++++++++++++++ testData/RT_data2.txt | 200 ++++++++++++++++++ 9 files changed, 569 insertions(+), 55 deletions(-) create mode 100644 src/python/09.RegTrees/TreeNode.py create mode 100755 testData/RT_data1.txt create mode 100755 testData/RT_data2.txt diff --git a/README.md b/README.md index 31165d7f..92bdc294 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ ## 第四部分 其他工具 * 13) 使用PCA来简化数据 - *[利用PCA来简化数据](./docs/13.利用PCA来简化数据.md) + * [利用PCA来简化数据](./docs/13.利用PCA来简化数据.md) * 14) 使用SVD简化数据 * 15) 大数据与MapReduce diff --git a/docs/9.树回归.md b/docs/9.树回归.md index bd68557c..f695bff5 100644 --- a/docs/9.树回归.md +++ b/docs/9.树回归.md @@ -8,6 +8,6 @@ * 优点:可以对复杂和非线性的数据建模。 * 缺点:结果不易理解。 * 适用数据类型:数值型和标称型数据。 - - - \ No newline at end of file +* 那么问题来了,如何计算连续型数值的混乱度呢? + * `误差`:也就是计算平均差的总值(总方差=方差*样本数) + * 二元切分方式 diff --git a/src/python/01.NumPy.py b/src/python/01.NumPy.py index 256b0b93..496dd0fe 100644 --- a/src/python/01.NumPy.py +++ b/src/python/01.NumPy.py @@ -20,10 +20,15 @@ randArray = random.rand(4, 4) # 转化关系, 数组转化为矩阵 randMat = mat(randArray) -# .I表示对矩阵求逆 +# .I表示对矩阵求逆(可以利用矩阵的初等变换 +# # 意义:逆矩阵是一个判断相似性的工具。逆矩阵A与列向量p相乘后,将得到列向量q,q的第i个分量表示p与A的第i个列向量的相似度。 +# # 参考案例链接: +# # https://www.zhihu.com/question/33258489 +# # http://blog.csdn.net/vernice/article/details/48506027 +# .T表示对矩阵转置(行列颠倒) invRandMat = randMat.I # 输出结果 -print randArray, '\n', randMat, '\n', invRandMat +print randArray, '\n---\n', randMat, '\n+++\n', invRandMat # 矩阵和逆矩阵 进行求积 (单位矩阵,对角线都为1嘛,理论上4*4的矩阵其他的都为0) myEye = randMat*invRandMat # 误差 diff --git a/src/python/03.DecisionTree/DTSklearn.py b/src/python/03.DecisionTree/DTSklearn.py index 5155b214..a4890961 100644 --- a/src/python/03.DecisionTree/DTSklearn.py +++ b/src/python/03.DecisionTree/DTSklearn.py @@ -98,6 +98,7 @@ def show_pdf(clf): # from IPython.display import Image # Image(graph.create_png()) + if __name__ == '__main__': x, y = createDataSet() diff --git a/src/python/03.DecisionTree/DecisionTreePlot.py b/src/python/03.DecisionTree/DecisionTreePlot.py index cf11e382..737e4d31 100644 --- a/src/python/03.DecisionTree/DecisionTreePlot.py +++ b/src/python/03.DecisionTree/DecisionTreePlot.py @@ -77,9 +77,9 @@ def plotTree(myTree, parentPt, nodeTxt): plotTree.yOff = plotTree.yOff - 1.0/plotTree.totalD for key in secondDict.keys(): # 判断该节点是否是Node节点 - if type(secondDict[key]).__name__=='dict': + if type(secondDict[key]).__name__ == 'dict': # 如果是就递归调用[recursion] - plotTree(secondDict[key],cntrPt,str(key)) + plotTree(secondDict[key], cntrPt, str(key)) else: # 如果不是,就在原来节点一半的地方找到节点的坐标 plotTree.xOff = plotTree.xOff + 1.0/plotTree.totalW @@ -121,7 +121,7 @@ def createPlot(inTree): # 测试数据集 def retrieveTree(i): - listOfTrees =[ + listOfTrees = [ {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}, {'no surfacing': {0: 'no', 1: {'flippers': {0: {'head': {0: 'no', 1: 'yes'}}, 1: 'no'}}}} ] diff --git a/src/python/09.RegTrees/TreeNode.py b/src/python/09.RegTrees/TreeNode.py new file mode 100644 index 00000000..c6e76583 --- /dev/null +++ b/src/python/09.RegTrees/TreeNode.py @@ -0,0 +1,16 @@ +#!/usr/bin/python +# coding:utf8 + +''' +Created on 2017-03-06 +Update on 2017-03-06 +@author: jiangzhonglian +''' + + +class treeNode(): + def __init__(self, feat, val, right, left): + self.featureToSplitOn = feat + self.valueOfSplit = val + self.rightBranch = right + self.leftBranch = left diff --git a/src/python/09.RegTrees/regTrees.py b/src/python/09.RegTrees/regTrees.py index c1436e0e..bfe43a74 100644 --- a/src/python/09.RegTrees/regTrees.py +++ b/src/python/09.RegTrees/regTrees.py @@ -9,25 +9,136 @@ Tree-Based Regression Methods Source Code for Machine Learning in Action Ch. 9 ''' from numpy import * -def loadDataSet(fileName): #general function to parse tab -delimited floats - dataMat = [] #assume last column is target value + +# 默认解析的数据是用tab分隔,并且是数值类型 +# general function to parse tab -delimited floats +def loadDataSet(fileName): + """loadDataSet(解析每一行,并转化为float类型) + + Args: + fileName 文件名 + Returns: + dataMat 每一行的数据集array类型 + Raises: + """ + # 假定最后一列是结果值 + # assume last column is target value + dataMat = [] fr = open(fileName) for line in fr.readlines(): curLine = line.strip().split('\t') - fltLine = map(float,curLine) #map all elements to float() + # 将所有的元素转化为float类型 + # map all elements to float() + fltLine = map(float, curLine) dataMat.append(fltLine) return dataMat + def binSplitDataSet(dataSet, feature, value): - mat0 = dataSet[nonzero(dataSet[:,feature] > value)[0],:][0] - mat1 = dataSet[nonzero(dataSet[:,feature] <= value)[0],:][0] - return mat0,mat1 + """binSplitDataSet(将数据集,按照feature列的value进行 二元切分) -def regLeaf(dataSet):#returns the value used for each leaf - return mean(dataSet[:,-1]) + Args: + fileName 文件名 + Returns: + dataMat 每一行的数据集array类型 + Raises: + """ + # # 测试案例 + # print 'dataSet[:, feature]=', dataSet[:, feature] + # print 'nonzero(dataSet[:, feature] > value)[0]=', nonzero(dataSet[:, feature] > value)[0] + # print 'nonzero(dataSet[:, feature] <= value)[0]=', nonzero(dataSet[:, feature] <= value)[0] + # dataSet[:, feature] 取去每一行中,第1列的值(从0开始算) + # nonzero(dataSet[:, feature] > value) 返回结果为true行的index下标 + mat0 = dataSet[nonzero(dataSet[:, feature] > value)[0], :] + mat1 = dataSet[nonzero(dataSet[:, feature] <= value)[0], :] + return mat0, mat1 + + +# 返回每一个叶子结点的均值 +# returns the value used for each leaf +def regLeaf(dataSet): + return mean(dataSet[:, -1]) + + +# 计算总方差=方差*样本数 def regErr(dataSet): - return var(dataSet[:,-1]) * shape(dataSet)[0] + # shape(dataSet)[0] 表示行数 + return var(dataSet[:, -1]) * shape(dataSet)[0] + + +# 1.用最佳方式切分数据集 +# 2.生成相应的叶节点 +def chooseBestSplit(dataSet, leafType=regLeaf, errType=regErr, ops=(1, 4)): + """chooseBestSplit(用最佳方式切分数据集 和 生成相应的叶节点) + + Args: + dataSet 数据集 + leafType 计算叶子节点的函数 + errType 求总方差 + ops [容许误差下降值,切分的最少样本数] + Returns: + bestIndex feature的index坐标 + bestValue 切分的最优值 + Raises: + """ + tolS = ops[0] + tolN = ops[1] + # 如果结果集(最后一列为1个变量),就返回推出 + # .T 对数据集进行转置 + # .tolist()[0] 转化为数组并取第0列 + if len(set(dataSet[:, -1].T.tolist()[0])) == 1: + # exit cond 1 + return None, leafType(dataSet) + # 计算行列值 + m, n = shape(dataSet) + print m, n + # 无分类误差的总方差和 + # the choice of the best feature is driven by Reduction in RSS error from mean + S = errType(dataSet) + # inf 正无穷大 + bestS, bestIndex, bestValue = inf, 0, 0 + # 循环处理每一列对应的feature值 + for featIndex in range(n-1): + for splitVal in set(dataSet[:, featIndex].T.tolist()[0]): + # 对该列进行分组,然后组内的成员的val值进行 二元切分 + mat0, mat1 = binSplitDataSet(dataSet, featIndex, splitVal) + # 判断二元切分的方式的元素数量是否符合预期 + if (shape(mat0)[0] < tolN) or (shape(mat1)[0] < tolN): + continue + newS = errType(mat0) + errType(mat1) + # 如果二元切分,算出来的误差在可接受范围内,那么就记录切分点,并记录最小误差 + if newS < bestS: + bestIndex = featIndex + bestValue = splitVal + bestS = newS + # 判断二元切分的方式的元素误差是否符合预期 + # if the decrease (S-bestS) is less than a threshold don't do the split + if (S - bestS) < tolS: + return None, leafType(dataSet) + mat0, mat1 = binSplitDataSet(dataSet, bestIndex, bestValue) + # 对整体的成员进行判断,是否符合预期 + if (shape(mat0)[0] < tolN) or (shape(mat1)[0] < tolN): + return None, leafType(dataSet) + return bestIndex, bestValue + + +# assume dataSet is NumPy Mat so we can array filtering +def createTree(dataSet, leafType=regLeaf, errType=regErr, ops=(1, 4)): + # 选择最好的切分方式: feature索引值,最优切分值 + # choose the best split + feat, val = chooseBestSplit(dataSet, leafType, errType, ops) + # if the splitting hit a stop condition return val + if feat is None: + return val + retTree = {} + retTree['spInd'] = feat + retTree['spVal'] = val + lSet, rSet = binSplitDataSet(dataSet, feat, val) + retTree['right'] = createTree(lSet, leafType, errType, ops) + retTree['left'] = createTree(rSet, leafType, errType, ops) + return retTree + def linearSolve(dataSet): #helper function used in two places m,n = shape(dataSet) @@ -49,43 +160,7 @@ def modelErr(dataSet): yHat = X * ws return sum(power(Y - yHat,2)) -def chooseBestSplit(dataSet, leafType=regLeaf, errType=regErr, ops=(1,4)): - tolS = ops[0]; tolN = ops[1] - #if all the target variables are the same value: quit and return value - if len(set(dataSet[:,-1].T.tolist()[0])) == 1: #exit cond 1 - return None, leafType(dataSet) - m,n = shape(dataSet) - #the choice of the best feature is driven by Reduction in RSS error from mean - S = errType(dataSet) - bestS = inf; bestIndex = 0; bestValue = 0 - for featIndex in range(n-1): - for splitVal in set(dataSet[:,featIndex]): - mat0, mat1 = binSplitDataSet(dataSet, featIndex, splitVal) - if (shape(mat0)[0] < tolN) or (shape(mat1)[0] < tolN): continue - newS = errType(mat0) + errType(mat1) - if newS < bestS: - bestIndex = featIndex - bestValue = splitVal - bestS = newS - #if the decrease (S-bestS) is less than a threshold don't do the split - if (S - bestS) < tolS: - return None, leafType(dataSet) #exit cond 2 - mat0, mat1 = binSplitDataSet(dataSet, bestIndex, bestValue) - if (shape(mat0)[0] < tolN) or (shape(mat1)[0] < tolN): #exit cond 3 - return None, leafType(dataSet) - return bestIndex,bestValue#returns the best feature to split on - #and the value used for that split -def createTree(dataSet, leafType=regLeaf, errType=regErr, ops=(1,4)):#assume dataSet is NumPy Mat so we can array filtering - feat, val = chooseBestSplit(dataSet, leafType, errType, ops)#choose the best split - if feat == None: return val #if the splitting hit a stop condition return val - retTree = {} - retTree['spInd'] = feat - retTree['spVal'] = val - lSet, rSet = binSplitDataSet(dataSet, feat, val) - retTree['left'] = createTree(lSet, leafType, errType, ops) - retTree['right'] = createTree(rSet, leafType, errType, ops) - return retTree def isTree(obj): return (type(obj).__name__=='dict') @@ -137,4 +212,21 @@ def createForeCast(tree, testData, modelEval=regTreeEval): yHat = mat(zeros((m,1))) for i in range(m): yHat[i,0] = treeForeCast(tree, mat(testData[i]), modelEval) - return yHat \ No newline at end of file + return yHat + +if __name__ == "__main__": + + + # # 测试数据集 + # testMat = mat(eye(4)) + # print testMat + # print type(testMat) + # mat0, mat1 = binSplitDataSet(testMat, 1, 0.5) + # print mat0, '\n-----------\n', mat1 + + # 获取数据集 + # myDat = loadDataSet('testData/RT_data1.txt') + myDat = loadDataSet('testData/RT_data2.txt') + myMat = mat(myDat) + myTree = createTree(myMat) + print myTree diff --git a/testData/RT_data1.txt b/testData/RT_data1.txt new file mode 100755 index 00000000..fa98fa58 --- /dev/null +++ b/testData/RT_data1.txt @@ -0,0 +1,200 @@ +0.036098 0.155096 +0.993349 1.077553 +0.530897 0.893462 +0.712386 0.564858 +0.343554 -0.371700 +0.098016 -0.332760 +0.691115 0.834391 +0.091358 0.099935 +0.727098 1.000567 +0.951949 0.945255 +0.768596 0.760219 +0.541314 0.893748 +0.146366 0.034283 +0.673195 0.915077 +0.183510 0.184843 +0.339563 0.206783 +0.517921 1.493586 +0.703755 1.101678 +0.008307 0.069976 +0.243909 -0.029467 +0.306964 -0.177321 +0.036492 0.408155 +0.295511 0.002882 +0.837522 1.229373 +0.202054 -0.087744 +0.919384 1.029889 +0.377201 -0.243550 +0.814825 1.095206 +0.611270 0.982036 +0.072243 -0.420983 +0.410230 0.331722 +0.869077 1.114825 +0.620599 1.334421 +0.101149 0.068834 +0.820802 1.325907 +0.520044 0.961983 +0.488130 -0.097791 +0.819823 0.835264 +0.975022 0.673579 +0.953112 1.064690 +0.475976 -0.163707 +0.273147 -0.455219 +0.804586 0.924033 +0.074795 -0.349692 +0.625336 0.623696 +0.656218 0.958506 +0.834078 1.010580 +0.781930 1.074488 +0.009849 0.056594 +0.302217 -0.148650 +0.678287 0.907727 +0.180506 0.103676 +0.193641 -0.327589 +0.343479 0.175264 +0.145809 0.136979 +0.996757 1.035533 +0.590210 1.336661 +0.238070 -0.358459 +0.561362 1.070529 +0.377597 0.088505 +0.099142 0.025280 +0.539558 1.053846 +0.790240 0.533214 +0.242204 0.209359 +0.152324 0.132858 +0.252649 -0.055613 +0.895930 1.077275 +0.133300 -0.223143 +0.559763 1.253151 +0.643665 1.024241 +0.877241 0.797005 +0.613765 1.621091 +0.645762 1.026886 +0.651376 1.315384 +0.697718 1.212434 +0.742527 1.087056 +0.901056 1.055900 +0.362314 -0.556464 +0.948268 0.631862 +0.000234 0.060903 +0.750078 0.906291 +0.325412 -0.219245 +0.726828 1.017112 +0.348013 0.048939 +0.458121 -0.061456 +0.280738 -0.228880 +0.567704 0.969058 +0.750918 0.748104 +0.575805 0.899090 +0.507940 1.107265 +0.071769 -0.110946 +0.553520 1.391273 +0.401152 -0.121640 +0.406649 -0.366317 +0.652121 1.004346 +0.347837 -0.153405 +0.081931 -0.269756 +0.821648 1.280895 +0.048014 0.064496 +0.130962 0.184241 +0.773422 1.125943 +0.789625 0.552614 +0.096994 0.227167 +0.625791 1.244731 +0.589575 1.185812 +0.323181 0.180811 +0.822443 1.086648 +0.360323 -0.204830 +0.950153 1.022906 +0.527505 0.879560 +0.860049 0.717490 +0.007044 0.094150 +0.438367 0.034014 +0.574573 1.066130 +0.536689 0.867284 +0.782167 0.886049 +0.989888 0.744207 +0.761474 1.058262 +0.985425 1.227946 +0.132543 -0.329372 +0.346986 -0.150389 +0.768784 0.899705 +0.848921 1.170959 +0.449280 0.069098 +0.066172 0.052439 +0.813719 0.706601 +0.661923 0.767040 +0.529491 1.022206 +0.846455 0.720030 +0.448656 0.026974 +0.795072 0.965721 +0.118156 -0.077409 +0.084248 -0.019547 +0.845815 0.952617 +0.576946 1.234129 +0.772083 1.299018 +0.696648 0.845423 +0.595012 1.213435 +0.648675 1.287407 +0.897094 1.240209 +0.552990 1.036158 +0.332982 0.210084 +0.065615 -0.306970 +0.278661 0.253628 +0.773168 1.140917 +0.203693 -0.064036 +0.355688 -0.119399 +0.988852 1.069062 +0.518735 1.037179 +0.514563 1.156648 +0.976414 0.862911 +0.919074 1.123413 +0.697777 0.827805 +0.928097 0.883225 +0.900272 0.996871 +0.344102 -0.061539 +0.148049 0.204298 +0.130052 -0.026167 +0.302001 0.317135 +0.337100 0.026332 +0.314924 -0.001952 +0.269681 -0.165971 +0.196005 -0.048847 +0.129061 0.305107 +0.936783 1.026258 +0.305540 -0.115991 +0.683921 1.414382 +0.622398 0.766330 +0.902532 0.861601 +0.712503 0.933490 +0.590062 0.705531 +0.723120 1.307248 +0.188218 0.113685 +0.643601 0.782552 +0.520207 1.209557 +0.233115 -0.348147 +0.465625 -0.152940 +0.884512 1.117833 +0.663200 0.701634 +0.268857 0.073447 +0.729234 0.931956 +0.429664 -0.188659 +0.737189 1.200781 +0.378595 -0.296094 +0.930173 1.035645 +0.774301 0.836763 +0.273940 -0.085713 +0.824442 1.082153 +0.626011 0.840544 +0.679390 1.307217 +0.578252 0.921885 +0.785541 1.165296 +0.597409 0.974770 +0.014083 -0.132525 +0.663870 1.187129 +0.552381 1.369630 +0.683886 0.999985 +0.210334 -0.006899 +0.604529 1.212685 +0.250744 0.046297 diff --git a/testData/RT_data2.txt b/testData/RT_data2.txt new file mode 100755 index 00000000..bee167b9 --- /dev/null +++ b/testData/RT_data2.txt @@ -0,0 +1,200 @@ +1.000000 0.409175 1.883180 +1.000000 0.182603 0.063908 +1.000000 0.663687 3.042257 +1.000000 0.517395 2.305004 +1.000000 0.013643 -0.067698 +1.000000 0.469643 1.662809 +1.000000 0.725426 3.275749 +1.000000 0.394350 1.118077 +1.000000 0.507760 2.095059 +1.000000 0.237395 1.181912 +1.000000 0.057534 0.221663 +1.000000 0.369820 0.938453 +1.000000 0.976819 4.149409 +1.000000 0.616051 3.105444 +1.000000 0.413700 1.896278 +1.000000 0.105279 -0.121345 +1.000000 0.670273 3.161652 +1.000000 0.952758 4.135358 +1.000000 0.272316 0.859063 +1.000000 0.303697 1.170272 +1.000000 0.486698 1.687960 +1.000000 0.511810 1.979745 +1.000000 0.195865 0.068690 +1.000000 0.986769 4.052137 +1.000000 0.785623 3.156316 +1.000000 0.797583 2.950630 +1.000000 0.081306 0.068935 +1.000000 0.659753 2.854020 +1.000000 0.375270 0.999743 +1.000000 0.819136 4.048082 +1.000000 0.142432 0.230923 +1.000000 0.215112 0.816693 +1.000000 0.041270 0.130713 +1.000000 0.044136 -0.537706 +1.000000 0.131337 -0.339109 +1.000000 0.463444 2.124538 +1.000000 0.671905 2.708292 +1.000000 0.946559 4.017390 +1.000000 0.904176 4.004021 +1.000000 0.306674 1.022555 +1.000000 0.819006 3.657442 +1.000000 0.845472 4.073619 +1.000000 0.156258 0.011994 +1.000000 0.857185 3.640429 +1.000000 0.400158 1.808497 +1.000000 0.375395 1.431404 +1.000000 0.885807 3.935544 +1.000000 0.239960 1.162152 +1.000000 0.148640 -0.227330 +1.000000 0.143143 -0.068728 +1.000000 0.321582 0.825051 +1.000000 0.509393 2.008645 +1.000000 0.355891 0.664566 +1.000000 0.938633 4.180202 +1.000000 0.348057 0.864845 +1.000000 0.438898 1.851174 +1.000000 0.781419 2.761993 +1.000000 0.911333 4.075914 +1.000000 0.032469 0.110229 +1.000000 0.499985 2.181987 +1.000000 0.771663 3.152528 +1.000000 0.670361 3.046564 +1.000000 0.176202 0.128954 +1.000000 0.392170 1.062726 +1.000000 0.911188 3.651742 +1.000000 0.872288 4.401950 +1.000000 0.733107 3.022888 +1.000000 0.610239 2.874917 +1.000000 0.732739 2.946801 +1.000000 0.714825 2.893644 +1.000000 0.076386 0.072131 +1.000000 0.559009 1.748275 +1.000000 0.427258 1.912047 +1.000000 0.841875 3.710686 +1.000000 0.558918 1.719148 +1.000000 0.533241 2.174090 +1.000000 0.956665 3.656357 +1.000000 0.620393 3.522504 +1.000000 0.566120 2.234126 +1.000000 0.523258 1.859772 +1.000000 0.476884 2.097017 +1.000000 0.176408 0.001794 +1.000000 0.303094 1.231928 +1.000000 0.609731 2.953862 +1.000000 0.017774 -0.116803 +1.000000 0.622616 2.638864 +1.000000 0.886539 3.943428 +1.000000 0.148654 -0.328513 +1.000000 0.104350 -0.099866 +1.000000 0.116868 -0.030836 +1.000000 0.516514 2.359786 +1.000000 0.664896 3.212581 +1.000000 0.004327 0.188975 +1.000000 0.425559 1.904109 +1.000000 0.743671 3.007114 +1.000000 0.935185 3.845834 +1.000000 0.697300 3.079411 +1.000000 0.444551 1.939739 +1.000000 0.683753 2.880078 +1.000000 0.755993 3.063577 +1.000000 0.902690 4.116296 +1.000000 0.094491 -0.240963 +1.000000 0.873831 4.066299 +1.000000 0.991810 4.011834 +1.000000 0.185611 0.077710 +1.000000 0.694551 3.103069 +1.000000 0.657275 2.811897 +1.000000 0.118746 -0.104630 +1.000000 0.084302 0.025216 +1.000000 0.945341 4.330063 +1.000000 0.785827 3.087091 +1.000000 0.530933 2.269988 +1.000000 0.879594 4.010701 +1.000000 0.652770 3.119542 +1.000000 0.879338 3.723411 +1.000000 0.764739 2.792078 +1.000000 0.504884 2.192787 +1.000000 0.554203 2.081305 +1.000000 0.493209 1.714463 +1.000000 0.363783 0.885854 +1.000000 0.316465 1.028187 +1.000000 0.580283 1.951497 +1.000000 0.542898 1.709427 +1.000000 0.112661 0.144068 +1.000000 0.816742 3.880240 +1.000000 0.234175 0.921876 +1.000000 0.402804 1.979316 +1.000000 0.709423 3.085768 +1.000000 0.867298 3.476122 +1.000000 0.993392 3.993679 +1.000000 0.711580 3.077880 +1.000000 0.133643 -0.105365 +1.000000 0.052031 -0.164703 +1.000000 0.366806 1.096814 +1.000000 0.697521 3.092879 +1.000000 0.787262 2.987926 +1.000000 0.476710 2.061264 +1.000000 0.721417 2.746854 +1.000000 0.230376 0.716710 +1.000000 0.104397 0.103831 +1.000000 0.197834 0.023776 +1.000000 0.129291 -0.033299 +1.000000 0.528528 1.942286 +1.000000 0.009493 -0.006338 +1.000000 0.998533 3.808753 +1.000000 0.363522 0.652799 +1.000000 0.901386 4.053747 +1.000000 0.832693 4.569290 +1.000000 0.119002 -0.032773 +1.000000 0.487638 2.066236 +1.000000 0.153667 0.222785 +1.000000 0.238619 1.089268 +1.000000 0.208197 1.487788 +1.000000 0.750921 2.852033 +1.000000 0.183403 0.024486 +1.000000 0.995608 3.737750 +1.000000 0.151311 0.045017 +1.000000 0.126804 0.001238 +1.000000 0.983153 3.892763 +1.000000 0.772495 2.819376 +1.000000 0.784133 2.830665 +1.000000 0.056934 0.234633 +1.000000 0.425584 1.810782 +1.000000 0.998709 4.237235 +1.000000 0.707815 3.034768 +1.000000 0.413816 1.742106 +1.000000 0.217152 1.169250 +1.000000 0.360503 0.831165 +1.000000 0.977989 3.729376 +1.000000 0.507953 1.823205 +1.000000 0.920771 4.021970 +1.000000 0.210542 1.262939 +1.000000 0.928611 4.159518 +1.000000 0.580373 2.039114 +1.000000 0.841390 4.101837 +1.000000 0.681530 2.778672 +1.000000 0.292795 1.228284 +1.000000 0.456918 1.736620 +1.000000 0.134128 -0.195046 +1.000000 0.016241 -0.063215 +1.000000 0.691214 3.305268 +1.000000 0.582002 2.063627 +1.000000 0.303102 0.898840 +1.000000 0.622598 2.701692 +1.000000 0.525024 1.992909 +1.000000 0.996775 3.811393 +1.000000 0.881025 4.353857 +1.000000 0.723457 2.635641 +1.000000 0.676346 2.856311 +1.000000 0.254625 1.352682 +1.000000 0.488632 2.336459 +1.000000 0.519875 2.111651 +1.000000 0.160176 0.121726 +1.000000 0.609483 3.264605 +1.000000 0.531881 2.103446 +1.000000 0.321632 0.896855 +1.000000 0.845148 4.220850 +1.000000 0.012003 -0.217283 +1.000000 0.018883 -0.300577 +1.000000 0.071476 0.006014 From 2f56c4a59bdfd38f0669c714ba9acef47a961983 Mon Sep 17 00:00:00 2001 From: geekidentity Date: Tue, 7 Mar 2017 23:07:24 +0800 Subject: [PATCH 7/9] =?UTF-8?q?change=205.Logistic=E5=9B=9E=E5=BD=92.md=20?= =?UTF-8?q?=20encoding=20to=20utf-8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/5.Logistic回归.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/5.Logistic回归.md b/docs/5.Logistic回归.md index e049ec53..a6c6a445 100644 --- a/docs/5.Logistic回归.md +++ b/docs/5.Logistic回归.md @@ -1,11 +1,11 @@ -# 1) ߼ع +# 1) 逻辑回归基础 - * ߼ع(Logistic Regression) - * 1.1 - * 1.2 ˵ʾ - * 1.3 ж߽ - * 1.4 ۺ - * 1.5 򻯵ijɱݶ½ - * 1.6 ߼Ż - * 1.7 ࣺһ \ No newline at end of file + * 逻辑回归(Logistic Regression) + * 1.1 分类问题 + * 1.2 假说表示 + * 1.3 判定边界 + * 1.4 代价函数 + * 1.5 简化的成本函数和梯度下降 + * 1.6 高级优化 + * 1.7 多类分类:一个对所有 \ No newline at end of file From c53cf4ff4e93ed6402211fb366f8c940180f305f Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Wed, 8 Mar 2017 01:09:06 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=AE=8C=EF=BC=9A?= =?UTF-8?q?=E5=9B=9E=E5=BD=92=E6=A0=91=20VS=20=E6=A8=A1=E5=9E=8B=E6=A0=91?= =?UTF-8?q?=20VS=20=E7=BA=BF=E6=80=A7=E5=9B=9E=E5=BD=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/python/09.RegTrees/regTrees.py | 224 ++++++++++++++++++++-------- src/python/regression.py | 16 +- testData/RT_bikeSpeedVsIq_test.txt | 200 +++++++++++++++++++++++++ testData/RT_bikeSpeedVsIq_train.txt | 200 +++++++++++++++++++++++++ testData/RT_data3.txt | 200 +++++++++++++++++++++++++ testData/RT_data3test.txt | 200 +++++++++++++++++++++++++ testData/RT_data4.txt | 200 +++++++++++++++++++++++++ testData/Regression_data.txt | 200 +++++++++++++++++++++++++ 8 files changed, 1371 insertions(+), 69 deletions(-) create mode 100755 testData/RT_bikeSpeedVsIq_test.txt create mode 100755 testData/RT_bikeSpeedVsIq_train.txt create mode 100755 testData/RT_data3.txt create mode 100755 testData/RT_data3test.txt create mode 100755 testData/RT_data4.txt create mode 100755 testData/Regression_data.txt diff --git a/src/python/09.RegTrees/regTrees.py b/src/python/09.RegTrees/regTrees.py index bfe43a74..11a8be85 100644 --- a/src/python/09.RegTrees/regTrees.py +++ b/src/python/09.RegTrees/regTrees.py @@ -38,9 +38,12 @@ def binSplitDataSet(dataSet, feature, value): """binSplitDataSet(将数据集,按照feature列的value进行 二元切分) Args: - fileName 文件名 + dataMat 数据集 + feature 特征列 + value 特征列要比较的值 Returns: - dataMat 每一行的数据集array类型 + mat0 小于的数据集在左边 + mat1 大于的数据集在右边 Raises: """ # # 测试案例 @@ -50,8 +53,8 @@ def binSplitDataSet(dataSet, feature, value): # dataSet[:, feature] 取去每一行中,第1列的值(从0开始算) # nonzero(dataSet[:, feature] > value) 返回结果为true行的index下标 - mat0 = dataSet[nonzero(dataSet[:, feature] > value)[0], :] - mat1 = dataSet[nonzero(dataSet[:, feature] <= value)[0], :] + mat0 = dataSet[nonzero(dataSet[:, feature] <= value)[0], :] + mat1 = dataSet[nonzero(dataSet[:, feature] > value)[0], :] return mat0, mat1 @@ -92,7 +95,6 @@ def chooseBestSplit(dataSet, leafType=regLeaf, errType=regErr, ops=(1, 4)): return None, leafType(dataSet) # 计算行列值 m, n = shape(dataSet) - print m, n # 无分类误差的总方差和 # the choice of the best feature is driven by Reduction in RSS error from mean S = errType(dataSet) @@ -134,89 +136,136 @@ def createTree(dataSet, leafType=regLeaf, errType=regErr, ops=(1, 4)): retTree = {} retTree['spInd'] = feat retTree['spVal'] = val + # 大于在右边,小于在左边 lSet, rSet = binSplitDataSet(dataSet, feat, val) - retTree['right'] = createTree(lSet, leafType, errType, ops) - retTree['left'] = createTree(rSet, leafType, errType, ops) + # 递归的进行调用 + retTree['left'] = createTree(lSet, leafType, errType, ops) + retTree['right'] = createTree(rSet, leafType, errType, ops) return retTree -def linearSolve(dataSet): #helper function used in two places - m,n = shape(dataSet) - X = mat(ones((m,n))); Y = mat(ones((m,1)))#create a copy of data with 1 in 0th postion - X[:,1:n] = dataSet[:,0:n-1]; Y = dataSet[:,-1]#and strip out Y - xTx = X.T*X - if linalg.det(xTx) == 0.0: - raise NameError('This matrix is singular, cannot do inverse,\n\ - try increasing the second value of ops') - ws = xTx.I * (X.T * Y) - return ws,X,Y - -def modelLeaf(dataSet):#create linear model and return coeficients - ws,X,Y = linearSolve(dataSet) - return ws - -def modelErr(dataSet): - ws,X,Y = linearSolve(dataSet) - yHat = X * ws - return sum(power(Y - yHat,2)) - - - +# 判断节点是否是一个字典 def isTree(obj): - return (type(obj).__name__=='dict') + return (type(obj).__name__ == 'dict') + +# 计算左右枝丫的均值 def getMean(tree): - if isTree(tree['right']): tree['right'] = getMean(tree['right']) - if isTree(tree['left']): tree['left'] = getMean(tree['left']) + if isTree(tree['right']): + tree['right'] = getMean(tree['right']) + if isTree(tree['left']): + tree['left'] = getMean(tree['left']) return (tree['left']+tree['right'])/2.0 - + + +# 检查是否适合合并分枝 def prune(tree, testData): - if shape(testData)[0] == 0: return getMean(tree) #if we have no test data collapse the tree - if (isTree(tree['right']) or isTree(tree['left'])):#if the branches are not trees try to prune them + # 判断是否测试数据集没有数据 + if shape(testData)[0] == 0: + return getMean(tree) + # 对测试进行分支,看属于哪只分支,然后返回tree结果的均值 + if (isTree(tree['right']) or isTree(tree['left'])): lSet, rSet = binSplitDataSet(testData, tree['spInd'], tree['spVal']) - if isTree(tree['left']): tree['left'] = prune(tree['left'], lSet) - if isTree(tree['right']): tree['right'] = prune(tree['right'], rSet) - #if they are now both leafs, see if we can merge them + if isTree(tree['left']): + tree['left'] = prune(tree['left'], lSet) + if isTree(tree['right']): + tree['right'] = prune(tree['right'], rSet) + + # 如果左右两边无子分支,那么计算一下总方差 和 该结果集的本身不分枝的总方差比较 + # 1.如果测试数据集足够大,将tree进行分支到最后 + # 2.如果测试数据集不够大,那么就无法进行合并 + # 注意返回的结果: 是合并后对原来为字典tree进行赋值,相当于进行了合并 if not isTree(tree['left']) and not isTree(tree['right']): lSet, rSet = binSplitDataSet(testData, tree['spInd'], tree['spVal']) - errorNoMerge = sum(power(lSet[:,-1] - tree['left'],2)) +\ - sum(power(rSet[:,-1] - tree['right'],2)) - treeMean = (tree['left']+tree['right'])/2.0 - errorMerge = sum(power(testData[:,-1] - treeMean,2)) - if errorMerge < errorNoMerge: + # power(x, y)表示x的y次方 + errorNoMerge = sum(power(lSet[:, -1] - tree['left'], 2)) + sum(power(rSet[:, -1] - tree['right'], 2)) + treeMean = (tree['left'] + tree['right'])/2.0 + errorMerge = sum(power(testData[:, -1] - treeMean, 2)) + # 如果 合并的总方差 < 不合并的总方差,那么就进行合并 + if errorMerge < errorNoMerge: print "merging" return treeMean - else: return tree - else: return tree - + else: + return tree + else: + return tree + + +# 得到模型的ws系数:f(x) = x0 + x1*featrue1+ x3*featrue2 ... +# create linear model and return coeficients +def modelLeaf(dataSet): + ws, X, Y = linearSolve(dataSet) + return ws + + +# 计算线性模型的误差值 +def modelErr(dataSet): + ws, X, Y = linearSolve(dataSet) + yHat = X * ws + # print corrcoef(yHat, Y, rowvar=0) + return sum(power(Y - yHat, 2)) + + + # helper function used in two places +def linearSolve(dataSet): + m, n = shape(dataSet) + # 产生一个关于1的矩阵 + X = mat(ones((m, n))) + Y = mat(ones((m, 1))) + # X的0列为1,常数项,用于计算平衡误差 + X[:, 1: n] = dataSet[:, 0: n-1] + Y = dataSet[:, -1] + + # 转置矩阵*矩阵 + xTx = X.T * X + # 如果矩阵的逆不存在,会造成程序异常 + if linalg.det(xTx) == 0.0: + raise NameError('This matrix is singular, cannot do inverse,\ntry increasing the second value of ops') + # 最小二乘法求最优解 + ws = xTx.I * (X.T * Y) + return ws, X, Y + + +# 回归树测试案例 def regTreeEval(model, inDat): return float(model) + +# 模型树测试案例 def modelTreeEval(model, inDat): n = shape(inDat)[1] - X = mat(ones((1,n+1))) - X[:,1:n+1]=inDat - return float(X*model) + X = mat(ones((1, n+1))) + X[:, 1: n+1] = inDat + # print X, model + return float(X * model) + +# 计算预测的结果 def treeForeCast(tree, inData, modelEval=regTreeEval): - if not isTree(tree): return modelEval(tree, inData) - if inData[tree['spInd']] > tree['spVal']: - if isTree(tree['left']): return treeForeCast(tree['left'], inData, modelEval) - else: return modelEval(tree['left'], inData) + if not isTree(tree): + return modelEval(tree, inData) + if inData[tree['spInd']] <= tree['spVal']: + if isTree(tree['left']): + return treeForeCast(tree['left'], inData, modelEval) + else: + return modelEval(tree['left'], inData) else: - if isTree(tree['right']): return treeForeCast(tree['right'], inData, modelEval) - else: return modelEval(tree['right'], inData) - + if isTree(tree['right']): + return treeForeCast(tree['right'], inData, modelEval) + else: + return modelEval(tree['right'], inData) + + +# 预测结果 def createForeCast(tree, testData, modelEval=regTreeEval): - m=len(testData) - yHat = mat(zeros((m,1))) + m = len(testData) + yHat = mat(zeros((m, 1))) for i in range(m): - yHat[i,0] = treeForeCast(tree, mat(testData[i]), modelEval) + yHat[i, 0] = treeForeCast(tree, mat(testData[i]), modelEval) return yHat + if __name__ == "__main__": - - # # 测试数据集 # testMat = mat(eye(4)) # print testMat @@ -224,9 +273,52 @@ if __name__ == "__main__": # mat0, mat1 = binSplitDataSet(testMat, 1, 0.5) # print mat0, '\n-----------\n', mat1 - # 获取数据集 + # 回归树 # myDat = loadDataSet('testData/RT_data1.txt') - myDat = loadDataSet('testData/RT_data2.txt') - myMat = mat(myDat) - myTree = createTree(myMat) - print myTree + # myDat = loadDataSet('testData/RT_data2.txt') + # myMat = mat(myDat) + # myTree = createTree(myMat) + + # 1. 预剪枝就是,提起设置最大误差数和最少元素数 + # myDat = loadDataSet('testData/RT_data3.txt') + # myMat = mat(myDat) + # myTree = createTree(myMat, ops=(0, 1)) + # print myTree + + # 2.后剪枝 + # myDatTest = loadDataSet('testData/RT_data3test.txt') + # myMat2Test = mat(myDatTest) + # myFinalTree = prune(myTree, myMat2Test) + # print '\n\n\n-------------------' + # print myFinalTree + + # -------- + # 模型树求解 + # myDat = loadDataSet('testData/RT_data4.txt') + # myMat = mat(myDat) + # myTree = createTree(myMat, modelLeaf, modelErr) + # print myTree + + # 回归树 VS 模型树 VS 线性回归 + trainMat = mat(loadDataSet('testData/RT_bikeSpeedVsIq_train.txt')) + testMat = mat(loadDataSet('testData/RT_bikeSpeedVsIq_test.txt')) + # 回归树 + myTree1 = createTree(trainMat, ops=(1, 20)) + print myTree1 + yHat1 = createForeCast(myTree1, testMat[:, 0]) + print "回归树:", corrcoef(yHat1, testMat[:, 1],rowvar=0)[0, 1] + + # 模型树 + myTree2 = createTree(trainMat, modelLeaf, modelErr, ops=(1, 20)) + yHat2 = createForeCast(myTree2, testMat[:, 0], modelTreeEval) + print myTree2 + print "模型树:", corrcoef(yHat2, testMat[:, 1],rowvar=0)[0, 1] + + # 线性回归 + ws, X, Y = linearSolve(trainMat) + print ws + m = len(testMat[:, 0]) + yHat3 = mat(zeros((m, 1))) + for i in range(shape(testMat)[0]): + yHat3[i] = testMat[i, 0]*ws[1, 0] + ws[0, 0] + print "线性回归:", corrcoef(yHat3, testMat[:, 1],rowvar=0)[0, 1] diff --git a/src/python/regression.py b/src/python/regression.py index de328368..ab997872 100644 --- a/src/python/regression.py +++ b/src/python/regression.py @@ -11,6 +11,7 @@ import os from numpy import * import matplotlib.pylab as plt + def loadDataSet(fileName): #general function to parse tab -delimited floats numFeat = len(open(fileName).readline().split('\t')) - 1 #get number of fields dataMat = []; labelMat = [] @@ -24,6 +25,7 @@ def loadDataSet(fileName): #general function to parse tab -delimited floats labelMat.append(float(curLine[-1])) return dataMat,labelMat + def standRegres(xArr,yArr): # >>> A.T # transpose, 转置 xMat = mat(xArr); yMat = mat(yArr).T @@ -37,6 +39,7 @@ def standRegres(xArr,yArr): ws = xTx.I * (xMat.T*yMat) # 最小二乘法求最优解 return ws + def plotBestFit(xArr, yArr, ws): xMat = mat(xArr) @@ -60,6 +63,7 @@ def plotBestFit(xArr, yArr, ws): plt.xlabel('X'); plt.ylabel('Y') plt.show() + def main1(): # w0*x0+w1*x1+w2*x2=f(x) project_dir = os.path.dirname(os.path.dirname(os.getcwd())) @@ -91,6 +95,7 @@ def lwlr(testPoint, xArr, yArr,k=1.0): ws = xTx.I * (xMat.T * (weights * yMat)) return testPoint * ws + def lwlrTest(testArr,xArr,yArr,k=1.0): #loops over all the data points and applies lwlr to each one m = shape(testArr)[0] # m*1的矩阵 @@ -101,6 +106,7 @@ def lwlrTest(testArr,xArr,yArr,k=1.0): #loops over all the data points and appl yHat[i] = lwlr(testArr[i],xArr,yArr,k) return yHat + def lwlrTestPlot(xArr, yArr, yHat): xMat = mat(xArr) @@ -123,11 +129,13 @@ def lwlrTestPlot(xArr, yArr, yHat): plt.xlabel('X'); plt.ylabel('Y') plt.show() + def main2(): # w0*x0+w1*x1+w2*x2=f(x) - project_dir = os.path.dirname(os.path.dirname(os.getcwd())) + # project_dir = os.path.dirname(os.path.dirname(os.getcwd())) # 1.收集并准备数据 - xArr, yArr = loadDataSet("%s/resources/ex0.txt" % project_dir) + # xArr, yArr = loadDataSet("%s/resources/ex0.txt" % project_dir) + xArr, yArr = loadDataSet("testData/Regression_data.txt") # print xArr, '---\n', yArr # 2.训练模型, f(x)=a1*x1+b2*x2+..+nn*xn中 (a1,b2, .., nn).T的矩阵值 yHat = lwlrTest(xArr, xArr, yArr, 0.003) @@ -136,12 +144,14 @@ def main2(): # 数据可视化 lwlrTestPlot(xArr, yArr, yHat) -if __name__=="__main__": + +if __name__ == "__main__": # 线性回归 # main1() # 局部加权线性回归 main2() + def rssError(yArr,yHatArr): #yArr and yHatArr both need to be arrays return ((yArr-yHatArr)**2).sum() diff --git a/testData/RT_bikeSpeedVsIq_test.txt b/testData/RT_bikeSpeedVsIq_test.txt new file mode 100755 index 00000000..9fbf3e1f --- /dev/null +++ b/testData/RT_bikeSpeedVsIq_test.txt @@ -0,0 +1,200 @@ +12.000000 121.010516 +19.000000 157.337044 +12.000000 116.031825 +15.000000 132.124872 +2.000000 52.719612 +6.000000 39.058368 +3.000000 50.757763 +20.000000 166.740333 +11.000000 115.808227 +21.000000 165.582995 +3.000000 41.956087 +3.000000 34.432370 +13.000000 116.954676 +1.000000 32.112553 +7.000000 50.380243 +7.000000 94.107791 +23.000000 188.943179 +18.000000 152.637773 +9.000000 104.122082 +18.000000 127.805226 +0.000000 83.083232 +15.000000 148.180104 +3.000000 38.480247 +8.000000 77.597839 +7.000000 75.625803 +11.000000 124.620208 +13.000000 125.186698 +5.000000 51.165922 +3.000000 31.179113 +15.000000 132.505727 +19.000000 137.978043 +9.000000 106.481123 +20.000000 172.149955 +11.000000 104.116556 +4.000000 22.457996 +20.000000 175.735047 +18.000000 165.350412 +22.000000 177.461724 +16.000000 138.672986 +17.000000 156.791788 +19.000000 150.327544 +19.000000 156.992196 +23.000000 163.624262 +8.000000 92.537227 +3.000000 32.341399 +16.000000 144.445614 +11.000000 119.985586 +16.000000 145.149335 +12.000000 113.284662 +5.000000 47.742716 +11.000000 115.852585 +3.000000 31.579325 +1.000000 43.758671 +1.000000 61.049125 +13.000000 132.751826 +23.000000 163.233087 +12.000000 115.134296 +8.000000 91.370839 +8.000000 86.137955 +14.000000 120.857934 +3.000000 33.777477 +10.000000 110.831763 +10.000000 104.174775 +20.000000 155.920696 +4.000000 30.619132 +0.000000 71.880474 +7.000000 86.399516 +7.000000 72.632906 +5.000000 58.632985 +18.000000 143.584511 +23.000000 187.059504 +6.000000 65.067119 +6.000000 69.110280 +19.000000 142.388056 +15.000000 137.174489 +21.000000 159.719092 +9.000000 102.179638 +20.000000 176.416294 +21.000000 146.516385 +18.000000 147.808343 +23.000000 154.790810 +16.000000 137.385285 +18.000000 166.885975 +15.000000 136.989000 +20.000000 144.668679 +14.000000 137.060671 +19.000000 140.468283 +11.000000 98.344084 +16.000000 132.497910 +1.000000 59.143101 +20.000000 152.299381 +13.000000 134.487271 +0.000000 77.805718 +3.000000 28.543764 +10.000000 97.751817 +4.000000 41.223659 +11.000000 110.017015 +12.000000 119.391386 +20.000000 158.872126 +2.000000 38.776222 +19.000000 150.496148 +15.000000 131.505967 +22.000000 179.856157 +13.000000 143.090102 +14.000000 142.611861 +13.000000 120.757410 +4.000000 27.929324 +16.000000 151.530849 +15.000000 148.149702 +5.000000 44.188084 +16.000000 141.135406 +12.000000 119.817665 +8.000000 80.991524 +3.000000 29.308640 +6.000000 48.203468 +8.000000 92.179834 +22.000000 162.720371 +10.000000 91.971158 +2.000000 33.481943 +8.000000 88.528612 +1.000000 54.042173 +8.000000 92.002928 +5.000000 45.614646 +3.000000 34.319635 +14.000000 129.140558 +17.000000 146.807901 +17.000000 157.694058 +4.000000 37.080929 +20.000000 169.942381 +10.000000 114.675638 +5.000000 34.913029 +14.000000 137.889747 +0.000000 79.043129 +16.000000 139.084390 +6.000000 53.340135 +13.000000 142.772612 +0.000000 73.103173 +3.000000 37.717487 +15.000000 134.116395 +18.000000 138.748257 +23.000000 180.779121 +10.000000 93.721894 +23.000000 166.958335 +6.000000 74.473589 +6.000000 73.006291 +3.000000 34.178656 +1.000000 33.395482 +22.000000 149.933384 +18.000000 154.858982 +6.000000 66.121084 +1.000000 60.816800 +5.000000 55.681020 +6.000000 61.251558 +15.000000 125.452206 +16.000000 134.310255 +19.000000 167.999681 +5.000000 40.074830 +22.000000 162.658997 +12.000000 109.473909 +4.000000 44.743405 +11.000000 122.419496 +14.000000 139.852014 +21.000000 160.045407 +15.000000 131.999358 +15.000000 135.577799 +20.000000 173.494629 +8.000000 82.497177 +12.000000 123.122032 +10.000000 97.592026 +16.000000 141.345706 +8.000000 79.588881 +3.000000 54.308878 +4.000000 36.112937 +19.000000 165.005336 +23.000000 172.198031 +15.000000 127.699625 +1.000000 47.305217 +13.000000 115.489379 +8.000000 103.956569 +4.000000 53.669477 +0.000000 76.220652 +12.000000 114.153306 +6.000000 74.608728 +3.000000 41.339299 +5.000000 21.944048 +22.000000 181.455655 +20.000000 171.691444 +10.000000 104.299002 +21.000000 168.307123 +20.000000 169.556523 +23.000000 175.960552 +1.000000 42.554778 +14.000000 137.286185 +16.000000 136.126561 +12.000000 119.269042 +6.000000 63.426977 +4.000000 27.728212 +4.000000 32.687588 +23.000000 151.153204 +15.000000 129.767331 diff --git a/testData/RT_bikeSpeedVsIq_train.txt b/testData/RT_bikeSpeedVsIq_train.txt new file mode 100755 index 00000000..638d5c70 --- /dev/null +++ b/testData/RT_bikeSpeedVsIq_train.txt @@ -0,0 +1,200 @@ +3.000000 46.852122 +23.000000 178.676107 +0.000000 86.154024 +6.000000 68.707614 +15.000000 139.737693 +17.000000 141.988903 +12.000000 94.477135 +8.000000 86.083788 +9.000000 97.265824 +7.000000 80.400027 +8.000000 83.414554 +1.000000 52.525471 +16.000000 127.060008 +9.000000 101.639269 +14.000000 146.412680 +15.000000 144.157101 +17.000000 152.699910 +19.000000 136.669023 +21.000000 166.971736 +21.000000 165.467251 +3.000000 38.455193 +6.000000 75.557721 +4.000000 22.171763 +5.000000 50.321915 +0.000000 74.412428 +5.000000 42.052392 +1.000000 42.489057 +14.000000 139.185416 +21.000000 140.713725 +5.000000 63.222944 +5.000000 56.294626 +9.000000 91.674826 +22.000000 173.497655 +17.000000 152.692482 +9.000000 113.920633 +1.000000 51.552411 +9.000000 100.075315 +16.000000 137.803868 +18.000000 135.925777 +3.000000 45.550762 +16.000000 149.933224 +2.000000 27.914173 +6.000000 62.103546 +20.000000 173.942381 +12.000000 119.200505 +6.000000 70.730214 +16.000000 156.260832 +15.000000 132.467643 +19.000000 161.164086 +17.000000 138.031844 +23.000000 169.747881 +11.000000 116.761920 +4.000000 34.305905 +6.000000 68.841160 +10.000000 119.535227 +20.000000 158.104763 +18.000000 138.390511 +5.000000 59.375794 +7.000000 80.802300 +11.000000 108.611485 +10.000000 91.169028 +15.000000 154.104819 +5.000000 51.100287 +3.000000 32.334330 +15.000000 150.551655 +10.000000 111.023073 +0.000000 87.489950 +2.000000 46.726299 +7.000000 92.540440 +15.000000 135.715438 +19.000000 152.960552 +19.000000 162.789223 +21.000000 167.176240 +22.000000 164.323358 +12.000000 104.823071 +1.000000 35.554328 +11.000000 114.784640 +1.000000 36.819570 +12.000000 130.266826 +12.000000 126.053312 +18.000000 153.378289 +7.000000 70.089159 +15.000000 139.528624 +19.000000 157.137999 +23.000000 183.595248 +7.000000 73.431043 +11.000000 128.176167 +22.000000 183.181247 +13.000000 112.685801 +18.000000 161.634783 +6.000000 63.169478 +7.000000 63.393975 +19.000000 165.779578 +14.000000 143.973398 +22.000000 185.131852 +3.000000 45.275591 +6.000000 62.018003 +0.000000 83.193398 +7.000000 76.847802 +19.000000 147.087386 +7.000000 62.812086 +1.000000 49.910068 +11.000000 102.169335 +11.000000 105.108121 +6.000000 63.429817 +12.000000 121.301542 +17.000000 163.253962 +13.000000 119.588698 +0.000000 87.333807 +20.000000 144.484066 +21.000000 168.792482 +23.000000 159.751246 +20.000000 162.843592 +14.000000 145.664069 +19.000000 146.838515 +12.000000 132.049377 +18.000000 155.756119 +22.000000 155.686345 +7.000000 73.913958 +1.000000 66.761881 +7.000000 65.855450 +6.000000 56.271026 +19.000000 155.308523 +12.000000 124.372873 +17.000000 136.025960 +14.000000 132.996861 +21.000000 172.639791 +17.000000 135.672594 +8.000000 90.323742 +5.000000 62.462698 +16.000000 159.048794 +14.000000 139.991227 +3.000000 37.026678 +9.000000 100.839901 +9.000000 93.097395 +15.000000 123.645221 +15.000000 147.327185 +1.000000 40.055830 +0.000000 88.192829 +17.000000 139.174517 +22.000000 169.354493 +17.000000 136.354272 +9.000000 90.692829 +7.000000 63.987997 +14.000000 128.972231 +10.000000 108.433394 +2.000000 49.321034 +19.000000 171.615671 +9.000000 97.894855 +0.000000 68.962453 +9.000000 72.063371 +22.000000 157.000070 +12.000000 114.461754 +6.000000 58.239465 +9.000000 104.601048 +8.000000 90.772359 +22.000000 164.428791 +5.000000 34.804083 +5.000000 37.089459 +22.000000 177.987605 +10.000000 89.439608 +6.000000 70.711362 +23.000000 181.731482 +20.000000 151.538932 +7.000000 66.067228 +6.000000 61.565125 +20.000000 184.441687 +9.000000 91.569158 +9.000000 98.833425 +17.000000 144.352866 +9.000000 94.498314 +15.000000 121.922732 +18.000000 166.408274 +10.000000 89.571299 +8.000000 75.373772 +22.000000 161.001478 +8.000000 90.594227 +5.000000 57.180933 +20.000000 161.643007 +8.000000 87.197370 +8.000000 95.584308 +15.000000 126.207221 +7.000000 84.528209 +18.000000 161.056986 +10.000000 86.762615 +1.000000 33.325906 +9.000000 105.095502 +2.000000 22.440421 +9.000000 93.449284 +14.000000 106.249595 +21.000000 163.254385 +22.000000 161.746628 +20.000000 152.973085 +17.000000 122.918987 +7.000000 58.536412 +1.000000 45.013277 +13.000000 137.294148 +10.000000 88.123737 +2.000000 45.847376 +20.000000 163.385797 diff --git a/testData/RT_data3.txt b/testData/RT_data3.txt new file mode 100755 index 00000000..daf5acd5 --- /dev/null +++ b/testData/RT_data3.txt @@ -0,0 +1,200 @@ +0.228628 -2.266273 +0.965969 112.386764 +0.342761 -31.584855 +0.901444 87.300625 +0.585413 125.295113 +0.334900 18.976650 +0.769043 64.041941 +0.297107 -1.798377 +0.901421 100.133819 +0.176523 0.946348 +0.710234 108.553919 +0.981980 86.399637 +0.085873 -10.137104 +0.537834 90.995536 +0.806158 62.877698 +0.708890 135.416767 +0.787755 118.642009 +0.463241 17.171057 +0.300318 -18.051318 +0.815215 118.319942 +0.139880 7.336784 +0.068373 -15.160836 +0.457563 -34.044555 +0.665652 105.547997 +0.084661 -24.132226 +0.954711 100.935789 +0.953902 130.926480 +0.487381 27.729263 +0.759504 81.106762 +0.454312 -20.360067 +0.295993 -14.988279 +0.156067 7.557349 +0.428582 15.224266 +0.847219 76.240984 +0.499171 11.924204 +0.203993 -22.379119 +0.548539 83.114502 +0.790312 110.159730 +0.937766 119.949824 +0.218321 1.410768 +0.223200 15.501642 +0.896683 107.001620 +0.582311 82.589328 +0.698920 92.470636 +0.823848 59.342323 +0.385021 24.816941 +0.061219 6.695567 +0.841547 115.669032 +0.763328 115.199195 +0.934853 115.753994 +0.222271 -9.255852 +0.217214 -3.958752 +0.706961 106.180427 +0.888426 94.896354 +0.549814 137.267576 +0.107960 -1.293195 +0.085111 37.820659 +0.388789 21.578007 +0.467383 -9.712925 +0.623909 87.181863 +0.373501 -8.228297 +0.513332 101.075609 +0.350725 -40.086564 +0.716211 103.345308 +0.731636 73.912028 +0.273863 -9.457556 +0.211633 -8.332207 +0.944221 100.120253 +0.053764 -13.731698 +0.126833 22.891675 +0.952833 100.649591 +0.391609 3.001104 +0.560301 82.903945 +0.124723 -1.402796 +0.465680 -23.777531 +0.699873 115.586605 +0.164134 -27.405211 +0.455761 9.841938 +0.508542 96.403373 +0.138619 -29.087463 +0.335182 2.768225 +0.908629 118.513475 +0.546601 96.319043 +0.378965 13.583555 +0.968621 98.648346 +0.637999 91.656617 +0.350065 -1.319852 +0.632691 93.645293 +0.936524 65.548418 +0.310956 -49.939516 +0.437652 19.745224 +0.166765 -14.740059 +0.571214 114.872056 +0.952377 73.520802 +0.665329 121.980607 +0.258070 -20.425137 +0.912161 85.005351 +0.777582 100.838446 +0.642707 82.500766 +0.885676 108.045948 +0.080061 2.229873 +0.039914 11.220099 +0.958512 135.837013 +0.377383 5.241196 +0.661073 115.687524 +0.454375 3.043912 +0.412516 -26.419289 +0.854970 89.209930 +0.698472 120.521925 +0.465561 30.051931 +0.328890 39.783113 +0.309133 8.814725 +0.418943 44.161493 +0.553797 120.857321 +0.799873 91.368473 +0.811363 112.981216 +0.785574 107.024467 +0.949198 105.752508 +0.666452 120.014736 +0.652462 112.715799 +0.290749 -14.391613 +0.508548 93.292829 +0.680486 110.367074 +0.356790 -19.526539 +0.199903 -3.372472 +0.264926 5.280579 +0.166431 -6.512506 +0.370042 -32.124495 +0.628061 117.628346 +0.228473 19.425158 +0.044737 3.855393 +0.193282 18.208423 +0.519150 116.176162 +0.351478 -0.461116 +0.872199 111.552716 +0.115150 13.795828 +0.324274 -13.189243 +0.446196 -5.108172 +0.613004 168.180746 +0.533511 129.766743 +0.740859 93.773929 +0.667851 92.449664 +0.900699 109.188248 +0.599142 130.378529 +0.232802 1.222318 +0.838587 134.089674 +0.284794 35.623746 +0.130626 -39.524461 +0.642373 140.613941 +0.786865 100.598825 +0.403228 -1.729244 +0.883615 95.348184 +0.910975 106.814667 +0.819722 70.054508 +0.798198 76.853728 +0.606417 93.521396 +0.108801 -16.106164 +0.318309 -27.605424 +0.856421 107.166848 +0.842940 95.893131 +0.618868 76.917665 +0.531944 124.795495 +0.028546 -8.377094 +0.915263 96.717610 +0.925782 92.074619 +0.624827 105.970743 +0.331364 -1.290825 +0.341700 -23.547711 +0.342155 -16.930416 +0.729397 110.902830 +0.640515 82.713621 +0.228751 -30.812912 +0.948822 69.318649 +0.706390 105.062147 +0.079632 29.420068 +0.451087 -28.724685 +0.833026 76.723835 +0.589806 98.674874 +0.426711 -21.594268 +0.872883 95.887712 +0.866451 94.402102 +0.960398 123.559747 +0.483803 5.224234 +0.811602 99.841379 +0.757527 63.549854 +0.569327 108.435392 +0.841625 60.552308 +0.264639 2.557923 +0.202161 -1.983889 +0.055862 -3.131497 +0.543843 98.362010 +0.689099 112.378209 +0.956951 82.016541 +0.382037 -29.007783 +0.131833 22.478291 +0.156273 0.225886 +0.000256 9.668106 +0.892999 82.436686 +0.206207 -12.619036 +0.487537 5.149336 diff --git a/testData/RT_data3test.txt b/testData/RT_data3test.txt new file mode 100755 index 00000000..80880d1f --- /dev/null +++ b/testData/RT_data3test.txt @@ -0,0 +1,200 @@ +0.421862 10.830241 +0.105349 -2.241611 +0.155196 21.872976 +0.161152 2.015418 +0.382632 -38.778979 +0.017710 20.109113 +0.129656 15.266887 +0.613926 111.900063 +0.409277 1.874731 +0.807556 111.223754 +0.593722 133.835486 +0.953239 110.465070 +0.257402 15.332899 +0.645385 93.983054 +0.563460 93.645277 +0.408338 -30.719878 +0.874394 91.873505 +0.263805 -0.192752 +0.411198 10.751118 +0.449884 9.211901 +0.646315 113.533660 +0.673718 125.135638 +0.805148 113.300462 +0.759327 72.668572 +0.519172 82.131698 +0.741031 106.777146 +0.030937 9.859127 +0.268848 -34.137955 +0.474901 -11.201301 +0.588266 120.501998 +0.893936 142.826476 +0.870990 105.751746 +0.430763 39.146258 +0.057665 15.371897 +0.100076 9.131761 +0.980716 116.145896 +0.235289 -13.691224 +0.228098 16.089151 +0.622248 99.345551 +0.401467 -1.694383 +0.960334 110.795415 +0.031214 -5.330042 +0.504228 96.003525 +0.779660 75.921582 +0.504496 101.341462 +0.850974 96.293064 +0.701119 102.333839 +0.191551 5.072326 +0.667116 92.310019 +0.555584 80.367129 +0.680006 132.965442 +0.393899 38.605283 +0.048940 -9.861871 +0.963282 115.407485 +0.655496 104.269918 +0.576463 141.127267 +0.675708 96.227996 +0.853457 114.252288 +0.003933 -12.182861 +0.549512 97.927224 +0.218967 -4.712462 +0.659972 120.950439 +0.008256 8.026816 +0.099500 -14.318434 +0.352215 -3.747546 +0.874926 89.247356 +0.635084 99.496059 +0.039641 14.147109 +0.665111 103.298719 +0.156583 -2.540703 +0.648843 119.333019 +0.893237 95.209585 +0.128807 5.558479 +0.137438 5.567685 +0.630538 98.462792 +0.296084 -41.799438 +0.632099 84.895098 +0.987681 106.726447 +0.744909 111.279705 +0.862030 104.581156 +0.080649 -7.679985 +0.831277 59.053356 +0.198716 26.878801 +0.860932 90.632930 +0.883250 92.759595 +0.818003 110.272219 +0.949216 115.200237 +0.460078 -35.957981 +0.561077 93.545761 +0.863767 114.125786 +0.476891 -29.774060 +0.537826 81.587922 +0.686224 110.911198 +0.982327 119.114523 +0.944453 92.033481 +0.078227 30.216873 +0.782937 92.588646 +0.465886 2.222139 +0.885024 90.247890 +0.186077 7.144415 +0.915828 84.010074 +0.796649 115.572156 +0.127821 28.933688 +0.433429 6.782575 +0.946796 108.574116 +0.386915 -17.404601 +0.561192 92.142700 +0.182490 10.764616 +0.878792 95.289476 +0.381342 -6.177464 +0.358474 -11.731754 +0.270647 13.793201 +0.488904 -17.641832 +0.106773 5.684757 +0.270112 4.335675 +0.754985 75.860433 +0.585174 111.640154 +0.458821 12.029692 +0.218017 -26.234872 +0.583887 99.413850 +0.923626 107.802298 +0.833620 104.179678 +0.870691 93.132591 +0.249896 -8.618404 +0.748230 109.160652 +0.019365 34.048884 +0.837588 101.239275 +0.529251 115.514729 +0.742898 67.038771 +0.522034 64.160799 +0.498982 3.983061 +0.479439 24.355908 +0.314834 -14.256200 +0.753251 85.017092 +0.479362 -17.480446 +0.950593 99.072784 +0.718623 58.080256 +0.218720 -19.605593 +0.664113 94.437159 +0.942900 131.725134 +0.314226 18.904871 +0.284509 11.779346 +0.004962 -14.624176 +0.224087 -50.547649 +0.974331 112.822725 +0.894610 112.863995 +0.167350 0.073380 +0.753644 105.024456 +0.632241 108.625812 +0.314189 -6.090797 +0.965527 87.418343 +0.820919 94.610538 +0.144107 -4.748387 +0.072556 -5.682008 +0.002447 29.685714 +0.851007 79.632376 +0.458024 -12.326026 +0.627503 139.458881 +0.422259 -29.827405 +0.714659 63.480271 +0.672320 93.608554 +0.498592 37.112975 +0.698906 96.282845 +0.861441 99.699230 +0.112425 -12.419909 +0.164784 5.244704 +0.481531 -18.070497 +0.375482 1.779411 +0.089325 -14.216755 +0.036609 -6.264372 +0.945004 54.723563 +0.136608 14.970936 +0.292285 -41.723711 +0.029195 -0.660279 +0.998307 100.124230 +0.303928 -5.492264 +0.957863 117.824392 +0.815089 113.377704 +0.466399 -10.249874 +0.876693 115.617275 +0.536121 102.997087 +0.373984 -37.359936 +0.565162 74.967476 +0.085412 -21.449563 +0.686411 64.859620 +0.908752 107.983366 +0.982829 98.005424 +0.052766 -42.139502 +0.777552 91.899340 +0.374316 -3.522501 +0.060231 10.008227 +0.526225 87.317722 +0.583872 67.104433 +0.238276 10.615159 +0.678747 60.624273 +0.067649 15.947398 +0.530182 105.030933 +0.869389 104.969996 +0.698410 75.460417 +0.549430 82.558068 diff --git a/testData/RT_data4.txt b/testData/RT_data4.txt new file mode 100755 index 00000000..b9a4a34d --- /dev/null +++ b/testData/RT_data4.txt @@ -0,0 +1,200 @@ +0.070670 3.470829 +0.534076 6.377132 +0.747221 8.949407 +0.668970 8.034081 +0.586082 6.997721 +0.764962 9.318110 +0.658125 7.880333 +0.346734 4.213359 +0.313967 3.762496 +0.601418 7.188805 +0.404396 4.893403 +0.154345 3.683175 +0.984061 11.712928 +0.597514 7.146694 +0.005144 3.333150 +0.142295 3.743681 +0.280007 3.737376 +0.542008 6.494275 +0.466781 5.532255 +0.706970 8.476718 +0.191038 3.673921 +0.756591 9.176722 +0.912879 10.850358 +0.524701 6.067444 +0.306090 3.681148 +0.429009 5.032168 +0.695091 8.209058 +0.984495 11.909595 +0.702748 8.298454 +0.551771 6.715210 +0.272894 3.983313 +0.014611 3.559081 +0.699852 8.417306 +0.309710 3.739053 +0.444877 5.219649 +0.717509 8.483072 +0.576550 6.894860 +0.284200 3.792626 +0.675922 8.067282 +0.304401 3.671373 +0.233675 3.795962 +0.453779 5.477533 +0.900938 10.701447 +0.502418 6.046703 +0.781843 9.254690 +0.226271 3.546938 +0.619535 7.703312 +0.519998 6.202835 +0.399447 4.934647 +0.785298 9.497564 +0.010767 3.565835 +0.696399 8.307487 +0.524366 6.266060 +0.396583 4.611390 +0.059988 3.484805 +0.946702 11.263118 +0.417559 4.895128 +0.609194 7.239316 +0.730687 8.858371 +0.586694 7.061601 +0.829567 9.937968 +0.964229 11.521595 +0.276813 3.756406 +0.987041 11.947913 +0.876107 10.440538 +0.747582 8.942278 +0.117348 3.567821 +0.188617 3.976420 +0.416655 4.928907 +0.192995 3.978365 +0.244888 3.777018 +0.806349 9.685831 +0.417555 4.990148 +0.233805 3.740022 +0.357325 4.325355 +0.190201 3.638493 +0.705127 8.432886 +0.336599 3.868493 +0.473786 5.871813 +0.384794 4.830712 +0.502217 6.117244 +0.788220 9.454959 +0.478773 5.681631 +0.064296 3.642040 +0.332143 3.886628 +0.618869 7.312725 +0.854981 10.306697 +0.570000 6.764615 +0.512739 6.166836 +0.112285 3.545863 +0.723700 8.526944 +0.192256 3.661033 +0.181268 3.678579 +0.196731 3.916622 +0.510342 6.026652 +0.263713 3.723018 +0.141105 3.529595 +0.150262 3.552314 +0.824724 9.973690 +0.588088 6.893128 +0.411291 4.856380 +0.763717 9.199101 +0.212118 3.740024 +0.264587 3.742917 +0.973524 11.683243 +0.250670 3.679117 +0.823460 9.743861 +0.253752 3.781488 +0.838332 10.172180 +0.501156 6.113263 +0.097275 3.472367 +0.667199 7.948868 +0.487320 6.022060 +0.654640 7.809457 +0.906907 10.775188 +0.821941 9.936140 +0.859396 10.428255 +0.078696 3.490510 +0.938092 11.252471 +0.998868 11.863062 +0.025501 3.515624 +0.451806 5.441171 +0.883872 10.498912 +0.583567 6.912334 +0.823688 10.003723 +0.891032 10.818109 +0.879259 10.639263 +0.163007 3.662715 +0.344263 4.169705 +0.796083 9.422591 +0.903683 10.978834 +0.050129 3.575105 +0.605553 7.306014 +0.628951 7.556742 +0.877052 10.444055 +0.829402 9.856432 +0.121422 3.638276 +0.721517 8.663569 +0.066532 3.673471 +0.996587 11.782002 +0.653384 7.804568 +0.739494 8.817809 +0.640341 7.636812 +0.337828 3.971613 +0.220512 3.713645 +0.368815 4.381696 +0.782509 9.349428 +0.645825 7.790882 +0.277391 3.834258 +0.092569 3.643274 +0.284320 3.609353 +0.344465 4.023259 +0.182523 3.749195 +0.385001 4.426970 +0.747609 8.966676 +0.188907 3.711018 +0.806244 9.610438 +0.014211 3.517818 +0.574813 7.040672 +0.714500 8.525624 +0.538982 6.393940 +0.384638 4.649362 +0.915586 10.936577 +0.883513 10.441493 +0.804148 9.742851 +0.466011 5.833439 +0.800574 9.638874 +0.654980 8.028558 +0.348564 4.064616 +0.978595 11.720218 +0.915906 10.833902 +0.285477 3.818961 +0.988631 11.684010 +0.531069 6.305005 +0.181658 3.806995 +0.039657 3.356861 +0.893344 10.776799 +0.355214 4.263666 +0.783508 9.475445 +0.039768 3.429691 +0.546308 6.472749 +0.786882 9.398951 +0.168282 3.564189 +0.374900 4.399040 +0.737767 8.888536 +0.059849 3.431537 +0.861891 10.246888 +0.597578 7.112627 +0.126050 3.611641 +0.074795 3.609222 +0.634401 7.627416 +0.831633 9.926548 +0.019095 3.470285 +0.396533 4.773104 +0.794973 9.492009 +0.889088 10.420003 +0.003174 3.587139 +0.176767 3.554071 +0.943730 11.227731 +0.758564 8.885337 diff --git a/testData/Regression_data.txt b/testData/Regression_data.txt new file mode 100755 index 00000000..ad0df51b --- /dev/null +++ b/testData/Regression_data.txt @@ -0,0 +1,200 @@ +1.000000 0.067732 3.176513 +1.000000 0.427810 3.816464 +1.000000 0.995731 4.550095 +1.000000 0.738336 4.256571 +1.000000 0.981083 4.560815 +1.000000 0.526171 3.929515 +1.000000 0.378887 3.526170 +1.000000 0.033859 3.156393 +1.000000 0.132791 3.110301 +1.000000 0.138306 3.149813 +1.000000 0.247809 3.476346 +1.000000 0.648270 4.119688 +1.000000 0.731209 4.282233 +1.000000 0.236833 3.486582 +1.000000 0.969788 4.655492 +1.000000 0.607492 3.965162 +1.000000 0.358622 3.514900 +1.000000 0.147846 3.125947 +1.000000 0.637820 4.094115 +1.000000 0.230372 3.476039 +1.000000 0.070237 3.210610 +1.000000 0.067154 3.190612 +1.000000 0.925577 4.631504 +1.000000 0.717733 4.295890 +1.000000 0.015371 3.085028 +1.000000 0.335070 3.448080 +1.000000 0.040486 3.167440 +1.000000 0.212575 3.364266 +1.000000 0.617218 3.993482 +1.000000 0.541196 3.891471 +1.000000 0.045353 3.143259 +1.000000 0.126762 3.114204 +1.000000 0.556486 3.851484 +1.000000 0.901144 4.621899 +1.000000 0.958476 4.580768 +1.000000 0.274561 3.620992 +1.000000 0.394396 3.580501 +1.000000 0.872480 4.618706 +1.000000 0.409932 3.676867 +1.000000 0.908969 4.641845 +1.000000 0.166819 3.175939 +1.000000 0.665016 4.264980 +1.000000 0.263727 3.558448 +1.000000 0.231214 3.436632 +1.000000 0.552928 3.831052 +1.000000 0.047744 3.182853 +1.000000 0.365746 3.498906 +1.000000 0.495002 3.946833 +1.000000 0.493466 3.900583 +1.000000 0.792101 4.238522 +1.000000 0.769660 4.233080 +1.000000 0.251821 3.521557 +1.000000 0.181951 3.203344 +1.000000 0.808177 4.278105 +1.000000 0.334116 3.555705 +1.000000 0.338630 3.502661 +1.000000 0.452584 3.859776 +1.000000 0.694770 4.275956 +1.000000 0.590902 3.916191 +1.000000 0.307928 3.587961 +1.000000 0.148364 3.183004 +1.000000 0.702180 4.225236 +1.000000 0.721544 4.231083 +1.000000 0.666886 4.240544 +1.000000 0.124931 3.222372 +1.000000 0.618286 4.021445 +1.000000 0.381086 3.567479 +1.000000 0.385643 3.562580 +1.000000 0.777175 4.262059 +1.000000 0.116089 3.208813 +1.000000 0.115487 3.169825 +1.000000 0.663510 4.193949 +1.000000 0.254884 3.491678 +1.000000 0.993888 4.533306 +1.000000 0.295434 3.550108 +1.000000 0.952523 4.636427 +1.000000 0.307047 3.557078 +1.000000 0.277261 3.552874 +1.000000 0.279101 3.494159 +1.000000 0.175724 3.206828 +1.000000 0.156383 3.195266 +1.000000 0.733165 4.221292 +1.000000 0.848142 4.413372 +1.000000 0.771184 4.184347 +1.000000 0.429492 3.742878 +1.000000 0.162176 3.201878 +1.000000 0.917064 4.648964 +1.000000 0.315044 3.510117 +1.000000 0.201473 3.274434 +1.000000 0.297038 3.579622 +1.000000 0.336647 3.489244 +1.000000 0.666109 4.237386 +1.000000 0.583888 3.913749 +1.000000 0.085031 3.228990 +1.000000 0.687006 4.286286 +1.000000 0.949655 4.628614 +1.000000 0.189912 3.239536 +1.000000 0.844027 4.457997 +1.000000 0.333288 3.513384 +1.000000 0.427035 3.729674 +1.000000 0.466369 3.834274 +1.000000 0.550659 3.811155 +1.000000 0.278213 3.598316 +1.000000 0.918769 4.692514 +1.000000 0.886555 4.604859 +1.000000 0.569488 3.864912 +1.000000 0.066379 3.184236 +1.000000 0.335751 3.500796 +1.000000 0.426863 3.743365 +1.000000 0.395746 3.622905 +1.000000 0.694221 4.310796 +1.000000 0.272760 3.583357 +1.000000 0.503495 3.901852 +1.000000 0.067119 3.233521 +1.000000 0.038326 3.105266 +1.000000 0.599122 3.865544 +1.000000 0.947054 4.628625 +1.000000 0.671279 4.231213 +1.000000 0.434811 3.791149 +1.000000 0.509381 3.968271 +1.000000 0.749442 4.253910 +1.000000 0.058014 3.194710 +1.000000 0.482978 3.996503 +1.000000 0.466776 3.904358 +1.000000 0.357767 3.503976 +1.000000 0.949123 4.557545 +1.000000 0.417320 3.699876 +1.000000 0.920461 4.613614 +1.000000 0.156433 3.140401 +1.000000 0.656662 4.206717 +1.000000 0.616418 3.969524 +1.000000 0.853428 4.476096 +1.000000 0.133295 3.136528 +1.000000 0.693007 4.279071 +1.000000 0.178449 3.200603 +1.000000 0.199526 3.299012 +1.000000 0.073224 3.209873 +1.000000 0.286515 3.632942 +1.000000 0.182026 3.248361 +1.000000 0.621523 3.995783 +1.000000 0.344584 3.563262 +1.000000 0.398556 3.649712 +1.000000 0.480369 3.951845 +1.000000 0.153350 3.145031 +1.000000 0.171846 3.181577 +1.000000 0.867082 4.637087 +1.000000 0.223855 3.404964 +1.000000 0.528301 3.873188 +1.000000 0.890192 4.633648 +1.000000 0.106352 3.154768 +1.000000 0.917886 4.623637 +1.000000 0.014855 3.078132 +1.000000 0.567682 3.913596 +1.000000 0.068854 3.221817 +1.000000 0.603535 3.938071 +1.000000 0.532050 3.880822 +1.000000 0.651362 4.176436 +1.000000 0.901225 4.648161 +1.000000 0.204337 3.332312 +1.000000 0.696081 4.240614 +1.000000 0.963924 4.532224 +1.000000 0.981390 4.557105 +1.000000 0.987911 4.610072 +1.000000 0.990947 4.636569 +1.000000 0.736021 4.229813 +1.000000 0.253574 3.500860 +1.000000 0.674722 4.245514 +1.000000 0.939368 4.605182 +1.000000 0.235419 3.454340 +1.000000 0.110521 3.180775 +1.000000 0.218023 3.380820 +1.000000 0.869778 4.565020 +1.000000 0.196830 3.279973 +1.000000 0.958178 4.554241 +1.000000 0.972673 4.633520 +1.000000 0.745797 4.281037 +1.000000 0.445674 3.844426 +1.000000 0.470557 3.891601 +1.000000 0.549236 3.849728 +1.000000 0.335691 3.492215 +1.000000 0.884739 4.592374 +1.000000 0.918916 4.632025 +1.000000 0.441815 3.756750 +1.000000 0.116598 3.133555 +1.000000 0.359274 3.567919 +1.000000 0.814811 4.363382 +1.000000 0.387125 3.560165 +1.000000 0.982243 4.564305 +1.000000 0.780880 4.215055 +1.000000 0.652565 4.174999 +1.000000 0.870030 4.586640 +1.000000 0.604755 3.960008 +1.000000 0.255212 3.529963 +1.000000 0.730546 4.213412 +1.000000 0.493829 3.908685 +1.000000 0.257017 3.585821 +1.000000 0.833735 4.374394 +1.000000 0.070095 3.213817 +1.000000 0.527070 3.952681 +1.000000 0.116163 3.129283 From 707feca941a249d134c262f39cd4e3af07bb71b2 Mon Sep 17 00:00:00 2001 From: geekidentity Date: Wed, 8 Mar 2017 08:30:24 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E6=9C=BA=E5=99=A8=E5=AD=A6=E4=B9=A0?= =?UTF-8?q?=E7=9A=84=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/1.机器学习基础.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/1.机器学习基础.md b/docs/1.机器学习基础.md index d4e74a54..ee1c06e6 100644 --- a/docs/1.机器学习基础.md +++ b/docs/1.机器学习基础.md @@ -5,6 +5,8 @@ * 把无序的数据转换成有用的信息。 * 机器学习的意义 * 我们利用计算机来彰显数据背后的真实含义。 +* 机器学习的任务 + * 机器学习的主要任务就是分类。 * 监督学习 * 样本集:训练数据 + 测试数据 * 特征(feature-是否有缺失情况) + 目标变量(分类-离散值/回归-连续值<0~100、 -999~999>)