机器学习

  1. 机器学习概念

在维基百科上对机器学习提出以下几种定义:

“ 机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能 ” 。

“ 机器学习是对能通过经验自动改进的计算机算法的研究 ” 。

“ 机器学习是用数据或以往的经验,以此优化计算机程序的性能标准。 ”

     一种经常引用的英文定义是: A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E 。

可以看出机器学习强调三个关键词:算法、经验、性能,其处理过程如下图所示。

上图表明机器学习是数据通过算法构建出模型并对模型进行评估,评估的性能如果达到要求就拿这个模型来测试其他的数据,如果达不到要求就要调整算法来重新建立模型,再次进行评估,如此循环往复,最终获得满意的经验来处理其他的数据。

 

机器学习的分类

    1. 监督学习
      监督是从给定的训练数据集中学习一个函数(模型),当新的数据到来时,可以根据这个函数(模型)预测结果。监督学习的训练集要求包括输入和输出,也可以说 是特征和目标。训练集中的目标是由人标注(标量)的。在监督式学习下,输入数据被称为“训练数据”,每组训练数据有一个明确的标识或结果,如对防垃圾邮件 系统中“垃圾邮件”、“非垃圾邮件”,对手写数字识别中的“ 1 ”、“ 2 ”、“ 3 ”等。在建立预测模型时,监督式学习建立一个学习过程,将预测结果与“训练数据”的实际结果进行比较,不断调整预测模型,直到模型的预测结果达到一个预期的准确率。

      常见的监督学习算法包括回归分析和统计分类
      二元分类是机器学习要解决的基本问题,将测试数据分成两个类,如垃圾邮件的判别、房贷是否允许等问题的判断。
      多元分类是二元分类的逻辑延伸。例如,在因特网的流分类的情况下,根据问题的分类,网页可以被归类为体育、新闻、技术等,依此类推。

      监督学习常常用于分类,因为目标往往是让计算机去学习我们已经创建好的分类系统。数字识别再一次成为分类学习的常见样本。一般来说,对于那些有用的分类系统和容易判断的分类系统,分类学习都适用。

      监督学习是训练神经网络和决策树的最常见技术。神经网络和决策树技术高度依赖于事先确定的分类系统给出的信息。对于神经网络来说,分类系统用于判断网络的错误,然后调整网络去适应它;对于决策树,分类系统用来判断哪些属性提供了最多的信息,如此一来可以用它解决分类系统的问题
    2. 无监督学习
      与监督学习相比,无监督学习的训练集没有人为标注的结果。在非监督式学习中,数据并不被特别标识,学习模型是为了推断出数据的一些内在结构。

      常见的应用场景包括关联规则的学习以及聚类等。常见算法包括 Apriori 算法和 k-Means 算法。这类学习类型的目标不是让效用函数最大化,而是找到训练数据中的近似点。聚类常常能发现那些与假设匹配的相当好的直观分类,例如基于人口统计的聚合个体可能会在一个群体中形成一个富有的聚合,以及其他的贫穷的聚合。

      非监督学习看起来非常困难:目标是我们不告诉计算机怎么做,而是让它(计算机)自己去学习怎样做一些事情。非监督学习一般有两种思路:第一种思路是在指导 Agent 时不为其指定明确的分类,而是在成功时采用某种形式的激励制度。需要注意的是,这类训练通常会置于决策问题的框架里,因为它的目标不是产生一个分类系统,而是做出最大回报的决定。这种思路很好地概括了现实世界, Agent 可以对那些正确的行为做出激励,并对其他的行为进行处罚。 
      因为无监督学习假定没有事先分类的样本,这在一些情况下会非常强大,例如,我们的分类方法可能并非最佳选择。在这方面一个突出的例子是 Backgammon (西洋双陆棋)游戏,有一系列计算机程序(例如 neuro-gammon 和 TD-gammon )通过非监督学习自己一遍又一遍地玩这个游戏,变得比最强的人类棋手还要出色。这些程序发现的一些原则甚至令双陆棋专家都感到惊讶,并且它们比那些使用预分类样本训练的双陆棋程序工作得更出色。
    3. 半监督学习
      半监督学习( Semi-supervised Learning )是介于监督学习与无监督学习之间一种机器学习方式,是模式识别和机器学习领域研究的重点问题。它主要考虑如何利用少量的标注样本和大量的未标注样本进行 训练和分类的问题。半监督学习对于减少标注代价,提高学习机器性能具有非常重大的实际意义。

      主要算法有五类:基于概率的算法;在现有监督算法基础上进行修 改的方法;直接依赖于聚类假设的方法等,在此学习方式下,输入数据部分被标识,部分没有被标识,这种学习模型可以用来进行预测,但是模型首先需要学习数据 的内在结构以便合理地组织数据来进行预测。应用场景包括分类和回归,算法包括一些对常用监督式学习算法的延伸,这些算法首先试图对未标识数据进行建模,在此基础上再对标识的数据进行预测,如图论推理算法( Graph Inference )或者拉普拉斯支持向量机( Laplacian SVM )等。

      半监督学习分类算法提出的时间比较短,还有许多方面没有更深入的研究。半监督学习从诞生以来,主要用于处理人工合成数据,无噪声干扰的样本数据是当前大部分半监督学习方法使用的数据,而在实际生活中用到的数据却大部分不是无干扰的,通常都比较难以得到纯样本数据。
    4. 强化学习
      强化学习通过观察来学习动作的完成,每个动作都会对环境有所影响,学习对象根据观察到的周围环境的反馈来做出判断。在这种学习模式下,输入数据作为对模型 的反馈,不像监督模型那样,输入数据仅仅是作为一个检查模型对错的方式,在强化学习下,输入数据直接反馈到模型,模型必须对此立刻做出调整。常见的应用场 景包括动态系统以及机器人控制等。常见算法包括 Q-Learning 以及时间差学习( Temporal difference learning )。

      在企业数据应用的场景下,人们最常用的可能就是监督式学习和非监督式学习的模型。
      在图像识别等领域,由于存在大量的非标识的数据和少量的可标识数据,目前半监督式学习是一个很热的话题。而强化学习更多地应用在机器人控制及其他需要进行系统控制的领域。
  1. 机器学习的常见算法
    常见的机器学习算法有:
    l   构造条件概率:回归分析和统计分类;
    l   人工神经网络;
    l   决策树;
    l   高斯过程回归;
    l   线性判别分析;
    l   最近邻居法;
    l   感知器;
    l   径向基函数核;
    l   支持向量机;
    l   通过再生模型构造概率密度函数;
    l   最大期望算法;
    l   graphical model :包括贝叶斯网和 Markov 随机场;
    l   Generative Topographic Mapping ;
    l   近似推断技术;
    l   马尔可夫链蒙特卡罗方法;
    l   变分法;
    l   最优化:大多数以上方法,直接或者间接使用最优化算法。

    根据算法的功能和形式的类似性,我们可以把算法分类,比如说基于树的算法,基于神经网络的算法等等。当然,机器学习的范围非常庞大,有些算法很难 明确归类到某一类。而对于有些分类来说,同一分类的算法可以针对不同类型的问题,下面用一些相对比较容易理解的方式来解析一些主要的机器学习算法:
    1. 回归算法
      回归算法是试图采用对误差的衡量来探索变量之间的关系的一类算法。回归算法是统计机器学习的利器。在机器学习领域,人们说起回归,有时候是指一类问题,有时候是指一类算法,这一点常常会使初学者有所困惑。常见的回归算法包括:最小二乘法( Ordinary Least Square ),逻辑回归( Logistic Regression ),逐步式回归( Stepwise Regression ),多元自适应回归样条( Multivariate Adaptive Regression Splines )以及本地散点平滑估计( Locally Estimated Scatterplot Smoothing )。
       
    2. 基于实例的算法
      基于实例的算法常常用来对决策问题建立模型,这样的模型常常先选取一批样本数据,然后根据某些近似性把新数据与样本数据进行比较。通过这种方式来寻找最佳的匹配。因此,基于实例的算法常常也被称为“赢家通吃”学习或者“基于记忆的学习”。常见的算法包括 k-Nearest Neighbor (KNN) ,、学习矢量量化( Learning Vector Quantization , LVQ )以及自组织映射算法( Self-Organizing Map , SOM )
    3. 正则化方法
      正则化方法是其他算法(通常是回归算法)的延伸,根据算法的复杂度对算法进行调整。正则化方法通常对简单模型予以奖励而对复杂算法予以惩罚。常见的算法包括: Ridge Regression 、 Least Absolute Shrinkage and Selection Operator ( LASSO )以及弹性网络( Elastic Net )。
       
    4. 决策树学习
      决策树算法根据数据的属性采用树状结构建立决策模型,决策树模型常常用来解决分类和回归问题。常见的算法包括:分类及回归树( Classification And Regression Tree , CART )、 ID3 (Iterative Dichotomiser 3) 、 C4.5 、 Chi-squared Automatic Interaction Detection (CHAID) 、 Decision Stump 、机森林( Random Forest )、多元自适应回归样条( MARS )以及梯度推进机( Gradient Boosting Machine , GBM )。
    5. 贝叶斯学习
      贝叶斯方法算法是基于贝叶斯定理的一类算法,主要用来解决分类和回归问题。常见算法包括:朴素贝叶斯算法、平均单依赖估计( Averaged One-Dependence Estimators , AODE )以及 Bayesian Belief Network ( BBN )。 
       
    6. 基于核的算法
      基于核的算法中最著名的莫过于支持向量机( SVM )了。基于核的算法把输入数据映射到一个高阶的向量空间, 在这些高阶向量空间里, 有些分类或者回归问题能够更容易解决。常见的基于核的算法包括:支持向量机( Support Vector Machine , SVM )、径向基函数( Radial Basis Function , RBF) 以及线性判别分析( Linear Discriminate Analysis , LDA) 等。
       
    7. 聚类算法
      聚类就像回归一样,有时候人们描述的是一类问题,有时候描述的是一类算法。聚类算法通常按照中心点或者分层的方式对输入数据进行归并。所有的聚类算法都试图找到数据的内在结构,以便按照最大的共同点将数据进行归类。常见的聚类算法包括 k-Means 算法以及期望最大化算法( Expectation Maximization , EM )。
    8. 关联规则学习
      关联规则学习通过寻找最能够解释数据变量之间关系的规则,来找出大量多元数据集中有用的关联规则。常见算法包括 Apriori 算法和 Eclat 算法等。
    9. 人工神经网络算法
      人工神经网络算法模拟生物神经网络,是一类模式匹配算法。通常用于解决分类和回归问题。人工神经网络是机器学习的一个庞大的分支,有几百种不同的算法(其中深度学习就是其中的一类算法,我们会单独讨论)。重要的人工神经网络算法包括:感知器神经网络( Perceptron Neural Network )、反向传递( Back Propagation )、 Hopfield 网络、自组织映射( Self-Organizing Map, SOM )、学习矢量量化( Learning Vector Quantization , LVQ )。
    10. 深度学习算法
      深度学习算法是对人工神经网络的发展,在近期赢得了很多关注,特别是百度也开始发力深度学习后,更是在国内引起了很多关注。在计算能力变得日益廉价的今 天,深度学习试图建立大得多也复杂得多的神经网络。很多深度学习的算法是半监督式学习算法,用来处理存在少量未标识数据的大数据集。常见的深度学习算法包 括:受限波尔兹曼机( Restricted Boltzmann Machine , RBN )、 Deep Belief Networks ( DBN )、卷积网络( Convolutional Network )、堆栈式自动编码器( Stacked Auto-encoders )。
    11. 降低维度算法
      像聚类算法一样,降低维度算法试图分析数据的内在结构,不过降低维度算法是以非监督学习的方式,试图利用较少的信息来归纳或者解释数据。这类算法可以用于高维数据的可视化或者用来简化数据以便监督式学习使用。常见的算法包括:主成份分析( Principle Component Analysis , PCA )、偏最小二乘回归( Partial Least Square Regression , PLS )、 Sammon 映射、多维尺度( Multi-Dimensional Scaling, MDS )、投影追踪( Projection Pursuit )等。
       
    12. 集成算法
      集成算法用一些相对较弱的学习模型独立地对同样的样本进行训练,然后把结果整合起来进行整体预测。集成算法的主要难点在于究竟集成哪些独立的较弱的学习模型以及如何把学习结果整合起来。这是一类非常强大的算法,同时也非常流行。常见的算法包括: Boosting 、 Bootstrapped Aggregation ( Bagging )、 AdaBoost 、堆叠泛化( Stacked Generalization , Blending )、梯度推进机( Gradient Boosting Machine, GBM )、随机森林( Random Forest )。


       
  2. Spark MLlib 介绍
    Spark 之所以在机器学习方面具有得天独厚的优势,有以下几点原因:
    ( 1 )机器学习算法一般都有很多个步骤迭代计算的过程,机器学习的计算需要在多次迭代后获得足够小的误差或者足够收敛才会停止,迭代时如果使用 Hadoop 的 MapReduce 计算框架,每次计算都要读 / 写磁盘以及任务的启动等工作,这回导致非常大的 I/O 和 CPU 消耗。而 Spark 基于内存的计算模型天生就擅长迭代计算,多个步骤计算直接在内存中完成,只有在必要时才会操作磁盘和网络,所以说 Spark 正是机器学习的理想的平台。
    ( 2 )从通信的角度讲,如果使用 Hadoop 的 MapReduce 计算框架, JobTracker 和 TaskTracker 之间由于是通过 heartbeat 的方式来进行的通信和传递数据,会导致非常慢的执行速度,而 Spark 具有出色而高效的 Akka 和 Netty 通信系统,通信效率极高。
    MLlib(Machine Learnig lib) 是 Spark 对常用的机器学习算法的实现库,同时包括相关的测试和数据生成器。 Spark 的设计初衷就是为了支持一些迭代的 Job, 这正好符合很多机器学习算法的特点。在 Spark 官方首页中展示了 Logistic Regression 算法在 Spark 和 Hadoop 中运行的性能比较,如图下图所示。

    可以看出在 Logistic Regression 的运算场景下, Spark 比 Hadoop 快了 100 倍以上!
    MLlib 目前支持 4 种常见的机器学习问题 : 分类、回归、聚类和协同过滤, MLlib 在 Spark 整个生态系统中的位置如图下图所示。

    MLlib 基于 RDD ,天生就可以与 Spark SQL 、 GraphX 、 Spark Streaming 无缝集成,以 RDD 为基石, 4 个子框架可联手构建大数据计算中心! 
    MLlib 是 MLBase 一部分,其中 MLBase 分为四部分: MLlib 、 MLI 、 ML Optimizer 和 MLRuntime 。 
    l   ML Optimizer 会选择它认为最适合的已经在内部实现好了的机器学习算法和相关参数,来处理用户输入的数据,并返回模型或别的帮助分析的结果; 
    l   MLI 是一个进行特征抽取和高级 ML 编程抽象的算法实现的 API 或平台; 
    l   MLlib 是 Spark 实现一些常见的机器学习算法和实用程序,包括分类、回归、聚类、协同过滤、降维以及底层优化,该算法可以进行可扩充;
    l   MLRuntime 基于 Spark 计算框架,将 Spark 的分布式计算应用到机器学习领域
  3. Spark MLlib 架构解析
    从架构图可以看出 MLlib 主要包含三个部分:
    l   底层基础 :包括 Spark 的运行库、矩阵库和向量库;
    l   算法库 :包含广义线性模型、推荐系统、聚类、决策树和评估的算法;
    l   实用程序 :包括测试数据的生成、外部数据的读入等功能。
    1. MLlib 的底层基础解析
      底层基础部分主要包括向量接口和矩阵接口,这两种接口都会使用 Scala 语言基于 Netlib 和 BLAS/LAPACK 开发的线性代数库 Breeze 。
      MLlib 支持本地的密集向量和稀疏向量,并且支持标量向量。
      MLlib 同时支持本地矩阵和分布式矩阵,支持的分布式矩阵分为 RowMatrix 、 IndexedRowMatrix 、 CoordinateMatrix 等。
      关于密集型和稀疏型的向量 Vector 的示例如下所示。
       
      疏矩阵在含有大量非零元素的向量 Vector 计算中会节省大量的空间并大幅度提高计算速度,如下图所示。

      标量 LabledPoint 在实际中也被大量使用,例如判断邮件是否为垃圾邮件时就可以使用类似于以下的代码:

      可以把表示为 1.0 的判断为正常邮件,而表示为 0.0 则作为垃圾邮件来看待。
      对于矩阵 Matrix 而言,本地模式的矩阵如下所示。

      分布式矩阵如下所示。
        
      RowMatrix 直接通过 RDD[Vector] 来定义并可以用来统计平均数、方差、协同方差等:
      而 IndexedRowMatrix 是带有索引的 Matrix ,但其可以通过 toRowMatrix 方法来转换为 RowMatrix ,从而利用其统计功能。
      CoordinateMatrix 常用于稀疏性比较高的计算中,是由 RDD[MatrixEntry] 来构建的, MatrixEntry 是一个 Tuple 类型的元素,其中包含行、列和元素值.
    2. MLlib 的算法库分析
      下图是 MLlib 算法库的核心内容。

      在这里我们分析一些 Spark 中常用的算法:
      1. 分类算法
        分类算法属于监督式学习,使用类标签已知的样本建立一个分类函数或分类模型,应用分类模型,能把数据库中的类标签未知的数据进行归类。分类在数据挖掘中是一项重要的任务,目前在商业上应用最多,常见的典型应用场景有流失预测、精确营销、客户获取、个性偏好等。 
        MLlib 目前支持分类算法有:逻辑回归、支持向量机、朴素贝叶斯和决策树。

        案例:导入训练数据集,然后在训练集上执行训练算法,最后在所得模型上进行预测并计算训练误差。

        import org.apache.spark.SparkContext
        import org.apache.spark.mllib.classification.SVMWithSGD
        import org.apache.spark.mllib.regression.LabeledPoint
        // 加载和解析数据文件
        val data = sc.textFile("mllib/data/sample_svm_data.txt")
        val parsedData = data.map { line 
        val parts = line.split(' ')
        LabeledPoint(parts(0).toDouble, parts.tail.map(x => x.toDouble).toArray)
        }
        // 设置迭代次数并进行进行训练
        val numIterations = 20
        val model = SVMWithSGD.train(parsedData, numIterations)
        // 统计分类错误的样本比例
        val labelAndPreds = parsedData.map { point =>
        val prediction = model.predict(point.features)
        (point.label, prediction)
        }
        val trainErr = labelAndPreds.filter(r => r._1 != r._2).count.toDouble / parsedData.count
        println("Training Error = " + trainErr)
         
      2. 回归算法
        回归算法属于监督式学习,每个个体都有一个与之相关联的实数标签,并且我们希望在给出用于表示这些实体的数值特征后,所预测出的标签值可以尽可能接近实际值。 MLlib 目前支持回归算法有:线性回归、岭回归、 Lasso 和决策树。

        案例:导入训练数据集,将其解析为带标签点的 RDD ,使用 LinearRegressionWithSGD 算法建立一个简单的线性模型来预测标签的值,最后计算均方差来评估预测值与实际值的吻合度。
        import org.apache.spark.mllib.regression.LinearRegressionWithSGD
        import org.apache.spark.mllib.regression.LabeledPoint
        // 加载和解析数据文件
        val data = sc.textFile("mllib/data/ridge-data/lpsa.data")
        val parsedData = data.map { line =>
        val parts = line.split(',')
        LabeledPoint(parts(0).toDouble, parts(1).split(' ').map(x => x.toDouble).toArray)
        }
        // 设置迭代次数并进行训练
        val numIterations = 20
        val model = LinearRegressionWithSGD.train(parsedData, numIterations)
        // 统计回归错误的样本比例
        val valuesAndPreds = parsedData.map { point =>
        val prediction = model.predict(point.features)
        (point.label, prediction)
        }
        val MSE = valuesAndPreds.map{ case(v, p) => math.pow((v - p), 2)}.reduce(_ +
        _)/valuesAndPreds.count
        println("training Mean Squared Error = " + MSE)
         
      3. 聚类算法
        聚类算法属于非监督式学习,通常被用于探索性的分析,是根据“物以类聚”的原理,将本身没有类别的样本聚集成不同的组,这样的一组数据对象的集合叫做簇, 并且对每一个这样的簇进行描述的过程。它的目的是使得属于同一簇的样本之间应该彼此相似,而不同簇的样本应该足够不相似,常见的典型应用场景有客户细分、 客户研究、市场细分、价值评估。 MLlib 目前支持广泛使用的 KMmeans 聚类算法。
        案例:导入训练数据集,使用 KMeans 对象来将数据聚类到两个类簇当中,所需的类簇个数会被传递到算法中,然后计算集内均方差总和 (WSSSE) ,可以通过增加类簇的个数 k 来减小误差。 实际上,最优的类簇数通常是 1 ,因为这一点通常是 WSSSE 图中的 “低谷点”。
        import org.apache.spark.mllib.clustering.KMeans
        //加载和解析数据文件
        val data = sc.textFile("kmeans_data.txt")
        val parsedData = data.map( _.split(' ').map(_.toDouble))
        //设置迭代次数、类簇的个数
        val numIterations = 20
        val numClusters = 2
        //进行训练
        val clusters = KMeans.train(parsedData, numClusters, numIterations)
        //统计聚类错误的样本比例
        val WSSSE = clusters.computeCost(parsedData)
        println("Within Set Sum of Squared Errors = " + WSSSE)
         
      4. 协同过滤
        协同过滤常被应用于推荐系统,这些技术旨在补充用户 - 商品关联矩阵中所缺失的部分。 MLlib 当前支持基于模型的协同过滤,其中用户和商品通过一小组隐语义因子进行表达,并且这些因子也用于预测缺失的元素。

        案例:导入训练数据集,数据每一行由一个用户、一个商品和相应的评分组成。假设评分是显性的,使用默认的 ALS.train() 方法,通过计算预测出的评分的均方差来评估这个推荐模型。

        import org.apache.spark.mllib.recommendation.ALS
        import org.apache.spark.mllib.recommendation.Rating
        //加载和解析数据文件
        val data = sc.textFile("mllib/data/als/test.data")
        val ratings = data.map(_.split(',') match {
        case Array(user, item, rate) => Rating(user.toInt, item.toInt, rate.toDouble)
        })
        //设置迭代次数
        val numIterations = 20
        val model = ALS.train(ratings, 1, 20, 0.01)
        //对推荐模型进行评分
        val usersProducts = ratings.map{ case Rating(user, product, rate) => (user, product)}
        val predictions = model.predict(usersProducts).map{
        case Rating(user, product, rate) => ((user, product), rate)
        }
        val ratesAndPreds = ratings.map{
        case Rating(user, product, rate) => ((user, product), rate)}.join(predictions)
        val MSE = ratesAndPreds.map{
        case ((user, product), (r1, r2)) => math.pow((r1- r2), 2)}.reduce(_ + _)/ratesAndPreds.count
        println("Mean Squared Error = " + MSE)
    3. MLlib 的实用程序分析
      实用程序部分包括数据的验证器、 Label 的二元和多元的分析器、多种数据生成器、数据加载器。
    4. 线性代数相关教程:http://v.ku6.com/playlist/index_2489402.html

一 、概述

随着计算机技术的发展,各行各业都开始采用计算机及相应的信息技术进行管理和运营,这使得企业生成、收集、存贮和处理数据的能力大大提高,数据量与日俱增。企业数据实际上是企业的经验积累,当其积累到一定程度时,必然会反映出规律性的东西;对企业来,堆积如山的数据无异于一个巨大的宝库。在这样的背景下,人们迫切需要新一代的计算技术和工具来开采数据库中蕴藏的宝藏,使其成为有用的知识,指导企业的技术决策和经营决策,使企业在竞争中立于不败之地。另一方面,近十余年来,计算机和信息技术也有了长足的进展,产生了许多新概念和新技术,如更高性能的计算机和操作系统、因特网(intemet)、数据仓库(datawarehouse)、神经网络等等。在市场需求和技术基础这两个因素都具备的环境下,数据挖掘技术或称KDD(KnowledgeDiscovery in Databases;数据库知识发现)的概念和技术就应运而生了。

数据挖掘(Data Mining)旨在从大量的、不完全的、有噪声的、模糊的、随机的数据中, 提取隐含在其中的、人们事先不知道的、但又是潜在有用的信息和知识。还有很多和这一术语相近似的术语,如从数据库中发现知识(KDD)、数据分析、数据融合(Data Fusion)以及决策支持等。

二 、数据挖掘的基本任务

数据挖掘的任务主要是关联分析、聚类分析、分类、预测、时序模式和偏差分析等。

 

1. 关联分析(association analysis)

关联规则挖掘由Rakesh Apwal等人首先提出。两个或两个以上变量的取值之间存在的规律性称为关联。数据关联是数据库中存在的一类重要的、可被发现的知识。关联分为简单关联、时序关联和因果关联。关联分析的目的是找出数据库中隐藏的关联网。一般用支持度和可信度两个阀值来度量关联规则的相关性,还不断引入兴趣度、相关性等参数,使得所挖掘的规则更符合需求。

 

2. 聚类分析(clustering)

聚类是把数据按照相似性归纳成若干类别,同一类中的数据彼此相似,不同类中的数据相异。聚 类分析可以建立宏观的概念,发现数据的分布模式,以及可能的数据属性之间的相互关系。

 

3. 分类(classification)

分类就是找出一个类别的概念描述,它代表了这类数据的整体信息,即该类的内涵描述,并用这 种描述来构造模型,一般用规则或决策树模式表示。分类是利用训练数据集通过一定的算法而求得分类规则。分类可被用于规则描述和预测。

 

4. 预测(predication)

预测是利用历史数据找出变化规律,建立模型,并由此模型对未来数据的种类及特征进行预测。 预测关心的是精度和不确定性,通常用预测方差来度量。

 

5. 时序模式(time-series pattern)

时序模式是指通过时间序列搜索出的重复发生概率较高的模式。与回归一样,它也是用己知的数据预测未来的值,但这些数据的区别是变量所处时间的不同。

 

6. 偏差分析(deviation)

在偏差中包括很多有用的知识,数据库中的数据存在很多异常情况,发现数据库中数据存在的异常情况是非常重要的。偏差检验的基本方法就是寻找观察结果与参照之间的差别。

 

三 数据挖掘常的基本技术

1. 统计学

统计学虽然是一门“古老的”学科,但它依然是最基本的数据挖掘技术,特别是多元统计分析,如判别分析、主成分分析、因子分析、相关分析、多元回归分析等。

 

2. 聚类分析和模式识别

聚类分析主要是根据事物的特征对其进行聚类或分类,即所谓物以类聚,以期从中发现规律和典型模式。这类技术是数据挖掘的最重要的技术之一。除传统的基于多元统计分析的聚类方法外,近些年来模糊聚类和神经网络聚类方法也有了长足的发展。

 

3. 决策树分类技术

决策树分类是根据不同的重要特征,以树型结构表示分类或决策集合,从而产生规则和发现规律。

 

4. 人工神经网络和遗传基因算法

人工神经网络是一个迅速发展的前沿研究领域,对计算机科学 人工智能、认知科学以及信息技术等产生了重要而深远的影响,而它在数据挖掘中也扮演着非常重要的角色。人工神经网络可通过示例学习,形成描述复杂非线性系统的非线性函数,这实际上是得到了客观规律的定量描述,有了这个基础,预测的难题就会迎刃而解。目前在数据挖掘中,最常使用的两种神经网络是BP网络和RBF网络 不过,由于人工神经网络还是一个新兴学科,一些重要的理论问题尚未解决。

 

5. 规则归纳

规则归纳相对来讲是数据挖掘特有的技术。它指的是在大型数据库或数据仓库中搜索和挖掘以往不知道的规则和规律,这大致包括以下几种形式:IF … THEN …

 

6. 可视化技术

可视化技术是数据挖掘不可忽视的辅助技术。数据挖掘通常会涉及较复杂的数学方法和信息技术,为了方便用户理解和使用这类技术,必须借助图形、图象、动画等手段形象地指导操作、引导挖掘和表达结果等,否则很难推广普及数据挖掘技术。
 

四 数据挖掘技术实施的步骤

数据挖掘的过程可以分为6个步骤:

    - 1) 理解业务:从商业的角度理解项目目标和需求,将其转换成一种数据挖掘的问题定义,设计出达到目标的一个初步计划。

    - 2) 理解数据:收集初步的数据,进行各种熟悉数据的活动。包括数据描述,数据探索和数据质量验证等。

    - 3) 准备数据:将最初的原始数据构造成最终适合建模工具处理的数据集。包括表、记录和属性的选择,数据转换和数据清理等。

    - 4) 建模:选择和应用各种建模技术,并对其参数进行优化。

    - 5) 模型评估:对模型进行较为彻底的评价,并检查构建模型的每个步骤,确认其是否真正实现了预定的商业目的。

    - 6) 模型部署:创建完模型并不意味着项目的结束,即使模型的目的是为了增进对数据的了解,所获得的知识也要用一种用户可以使用的方式来组织和表示。通常要将活动模型应用到决策制订的过程中去。该阶段可以简单到只生成一份报告,也可以复杂到在企业内实施一个可重复的数据挖掘过程。控制得到普遍承认。

五 数据挖掘的应用现状

数据挖掘是一个新兴的边缘学科,它汇集了来自机器学习、模式识别、数据库、统计学、人工智能以及管理信息系统等各学科的成果。多学科的相互交融和相互促进,使得这一新学科得以蓬勃发展,而且已初具规模。在美国国家科学基金会(NSF)的数据库研究项目中,KDD被列为90年代最有价值的研究项目。人工智能研究领域的科学家也普遍认为,下一个人工智能应用的重要课题之一,将是以机器学习算法为主要工具的大规模的数据库知识发现。尽管数据挖掘还是一个很新的研究课题,但它所固有的为企业创造巨大经济效益的潜力,已使其很快有了许多成功的应用,具有代表性的应用领域有市场预测、投资、制造业、银行、通讯等。

美国钢铁公司和神户钢铁公司利用基于数据挖掘技术的ISPA系统,研究分析产品性能规律和进行质量控制,取得了显著效果。通用电器公司(GE)与法国飞机发动机制造公司(sNEcMA),利用数据挖掘技术研制了CASSIOP.EE质量控制系统,被三家欧洲航空公司用于诊断和预测渡音737的故障,带来了可观的经济效益。该系统于1996年获欧洲一等创造性应用奖。

享有盛誉的市场研究公司,如美国的A.C.一Nielson和Information Resources,欧洲的GFK和ln.fratest Burk等纷纷开始使用数据挖掘工具来应付迅速增长的销售和市场信息数据。商家的激烈竞争导致了市场快速饱和,产品的迅速更新,使得经营者对市场信息的需求格外强烈利用数据挖掘技术所形成的市场预测能力和服务,使这些市场研究公司取得了巨大收益。

英国广播公司(BBC)也应用数据挖掘技术来预测电视收视率,以便合理安排电视节目时刻表。信用卡公司Alllelicall KxT,ress自采用数据挖掘技术后,信用卡使用率增加了10% 一15%。AT&T公司赁借数据挖掘技术技术侦探国际电话欺诈行为,可以尽快发现国际电话使用中的不正常现象。

在Python的世界中为数据挖掘产生了很多实用的库,本文主要列出一些常见库的说明,安装,以及使用的小例子,文中的安装以及演示环境都是基于Centos 6.5 的Desktop Mini版进行演示

 

  1. Numpy
    1. 介绍
      NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。
    2. 安装
      1. yum install gcc
      2. yum install gcc-c++
      3. yum install python-devel
      4. pip install numpy
    3. 详细说明可以参考:http://old.sebug.net/paper/books/scipydoc/numpy_intro.html
       
  2. Scipy
    1. 介绍
      SciPy函数库在NumPy库的基础上增加了众多的数学、科学以及工程计算中常用的库函数。例如线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵等等
    2. 安装
      1. 需要先安装好Numpy
      2. yum install lapack lapack-devel blas blas-devel
      3. pip install scipy
    3. 详细说明可以参考:http://old.sebug.net/paper/books/scipydoc/scipy_intro.html
  3. Matplotlib
    1. 介绍

      matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中。

      它的文档相当完备,并且 Gallery页面 中有上百幅缩略图,打开之后都有源程序。因此如果你需要绘制某种类型的图,只需要在这个页面中浏览/复制/粘贴一下,基本上都能搞定

    2. 安装
      1. yum -y install freetype-devel
      2. yum -y install libpng-devel
      3. pip install Matplotlib
    3. 详细说明可以参考:http://old.sebug.net/paper/books/scipydoc/matplotlib_intro.html#
  4. Pandas
    1. 介绍

      pandas 是基于 Numpy 构建的含有更高级数据结构和工具的数据分析包

      类似于 Numpy 的核心是 ndarray,pandas 也是围绕着 Series 和 DataFrame 两个核心数据结构展开的 。Series 和 DataFrame 分别对应于一维的序列和二维的表结构

    2. 安装
      1. 依赖numpy
      2. pip install pandas
      3. 如果需要处理Excel文件,需要执行 pip install xlrd
    3. 演示代码
      # -*- coding: utf-8 -*- from pandas import Series,DataFrame
      import pandas as pd
      
      s=Series([1,2,3],index=['a','b','c'])
      d=DataFrame([[1,2,3],[4,5,6]],columns=['a','b','c'])
      
      #head() method will return top 5 records print s.head()
      print s.describe()
      print d.head()
      print d.describe()
      
      #read data from xml file excel_data=pd.read_excel("./server.xlsx")
      print excel_data.head
  5. StatsModels
    1. 介绍

      Statismodels是一个Python包,提供一些互补scipy统计计算的功能,包括描述性统计和统计模型估计和推断。
      主要功能

      • 线性回归模型:广义最小二乘法(Generalized least squares),普通最小二乘法(ordinary least squares)
      • glm
      • discrete:离散变量的回归,基于最大似然估计
      • rlm
      • tsa:时间序列分析模型
      • nonparametric
      • datasets
      • stats:常用统计检验
      • iolib:读Stata的.dta格式,输出ascii、latex和html
    2. 安装
      1. 依赖numpy,scipy,Matplotlib
      2. pip install StatsModels
  6. Scikit-Learn
    1. 介绍
      scikit-learn是一个和机器学习相关的库,如果不是最流行的,那么也算得上是所有语言中流行的机器学习库之一。它拥有大量的数据挖掘和数据分析功能,使其成为研究人员和开发者的首选库。
    2. 安装
      1. 依赖numpy,scipy,Matplotlib
      2. pip install Scikit-Learn
  7. Keras
    1. 介绍
      Keras是基于Theano的一个深度学习框架,它的设计参考了Torch,用Python语言编写,是一个高度模块化的神经网络库,支持GPU和CPU
    2. 安装
      1. 依赖numpy,scipy,theano
      2. pip install keras
  8. Gensim
    1. 介绍
       Gensim是一个相当专业的主题模型Python工具包在文本处理中,比如商品评论挖掘,有时需要了解每个评论分别和商品的描述之间的相似度,以此衡量评论的客观性。评论和商品描述的相似度越高,说明评论的用语比较官方,不带太多感情色彩,比较注重描述商品的属性和特性,角度更客观。那么Python 里面有计算文本相似度的程序包吗,恭喜你,不仅有,而且很好很强大,那就是gensim。
    2. 安装
      1. pip install gensim
      2.  

前面两篇文章对机器学习中的一些概念,以及开发环境的搭建做了简单的介绍。本文主要用来总结关于矩阵的一些知识。

“矩阵”这个词听起来充满了数学色彩,一看到这个词,一大堆的数据公式,符号,等等已经在我脑海中进行闪现,可是等我硬着头皮把相关的知识点看完后,觉得也就没有那么难了,毕竟我们知识搬运工,所以对它也不需要研究的那么深入,只需要知道一些基础知识就可以了。

  1. 定义
    1. 数学系的定义:“由 m×n 个数组成的一个 m 行 n 列的矩形表格“
    2. 程序员的定义:"具有相同属性的对象的集合"
    3. 综合定义:
      1. 矩阵为具有相同特征和特征数量的对象集合,表现为一张二维数据表
      2. 一个对象表示为矩阵中的一行,一个特征表示为矩阵中的一列,每个特

        征都有数值型的取值,而不能是某些文字描述

      3. 特征相同、取值相异的对象集合所构成的矩阵,使对象之间既相互独立,

        又相互联系;

  2. 在机器学习中的作用
    1. 通过解线性方程组,达到聚类、分类或预测的目的
      1. 聚类,分类
        为了说明矩阵是怎么在聚类,分类的计算中起到作用的,用一个书上的例子来表达.
        下表中列出了几种生物的体重以及生命周期/保质期,从重量和生命周期两个特征中,苹果和梨具有相似性,大象和鲨鱼具有相似性。从表格的数字上可以很直观的看出,大象与鲨鱼的重量较之苹果(或梨)的重量更相似;或者大象与鲨鱼的寿命较之苹果(或梨)的保质期更相似;由于这种相似性,我们很自然地可以将苹果和梨分为一类:水果(区别于植物);大象和鲨鱼分为一类:大型动物。

        名称

        重量(KG)

        生命周期/保质期
        大象

        5000

        70*365

        鲨鱼

        4800

        68*365

        苹果

        0.2

        10

        0.3

        7

        如果使用重量以及生命周期作为坐标描绘在二维的平面坐标系上的话,也可以比较明显的看出4个物种的关系,向量在这方面的作用也就是通过将对象集转变为一个平面直角坐标系内的点集,通过计算点与点之间的距离,完成聚类、分类,类似的运算完全可以扩展到多维的情况。
      2. 预测
        为了说明矩阵是如何作用在预测方面的,同样通过一个例子来说明,下面的图是男生身高对照表:

         

        这个表列举了 2~18 岁男生的正常体重、身高的变化。数值上呈现一种递增的趋势,每个对象都与上一行或下一行的对象在时间上相关,并且时间间隔相等,都为 1 年。这种时间上的相关性使矩阵反映出某一事物在时间上连续变化的过程。

        由此可见,预测或回归可以看作根据对象在某种序列(时间)上的相关性,表现为特

        征取值变化的一种趋势。

      3. 总结:分类、聚类和回归是机器学习最基本的主题。通过矩阵,可以构建客观事物的多维度数学模型,并通过条件概率分布、梯度、神经网络、协方差等等运算方式,多角度认识和分析事物。
    2. 方程降次,也就是利用矩阵的二次型,通过升维将线性不可分的数据集映射到高维中,转换为线性可分的情形,这是支持向量机的基本原理之一

    3. 矩阵可以通过特征值和特征向量,完成维度约简,简化类似图片这种高维数据集的运算,主成分分析使用的就是这个原理。

  3. 程序员怎么用
    如果你是一名Python的程序员,那么你很幸运,有个叫Numpy的库已经帮你把矩阵的操作全部封装好了,你只需要调用即可,如果你是一名Java的程序员,则可以使用Apache Commons Math library,或是使用成熟的机器学习的库,具体请参见:http://www.csdn.net/article/2015-12-25/2826560
  4. 常见基本运算

    在程序设计中,我们可以从形式上把矩阵理解为一个二维数组。以 Python 语言为例,矩阵就是嵌套着若干个 list 的一个大 list。内部的每个 list 都是等长的,其中每个元素都是整型或浮点型的数值。内部的 list 就是行向量,即一个对象。

    本人是有着Java经验的Python程序员,本着简单的原则,学习机器学习的过程中果断的选择的Python作为主要的使用语言,下面就以Numpy为例,通过一长段代码介绍一些常用的矩阵运算。
    [python] view plain copy
    1. # -*- coding: utf-8 -*-  
    2. __author__ = 'eric.sun'  
    3. import numpy as np  
    4.   
    5. #初始化matrix  
    6. def init_matrix():  
    7.     zeros=np.zeros([3,5])  
    8.     ones=np.ones([3,3])  
    9.     print ones  
    10.     print zeros  
    11.   
    12. #生成固定维度的matrix  
    13. def gen_random_matrix():  
    14.     rand_matrix=np.random.rand(3,4)  
    15.     print rand_matrix  
    16.   
    17. #生成单位矩阵  
    18. def gen_unit_matrix():  
    19.     unit_matrix=np.eye(5)  
    20.     print unit_matrix  
    21.   
    22. matrix_add=lambda m_a,m_b:m_a+m_b  
    23. matrix_sub=lambda m_a,m_b:m_a-m_b  
    24.   
    25. #矩阵的相加,相减,维度必须相同  
    26. def matrix_add_sub():  
    27.     matrix1=np.ones([3,3])  
    28.     matrix2=np.eye(3)  
    29.     print matrix_add(matrix1,matrix2)  
    30.     print matrix_sub(matrix1,matrix2)  
    31.   
    32. #一个整数乘以一个矩阵  
    33. def multi_matrix():  
    34.     matrix=np.eye(3)  
    35.     print 3*matrix  
    36.   
    37. #矩阵和矩阵的相乘  
    38. def multi_matrix2():  
    39.     ori=[[ 3,4,2,4],[ 0,3,1,2],[ 2,6,4,3],[ 2,6,4,1]]  
    40.     ori2=[[ 1,4,3,1],[ 2,1,1,2],[ 1,2,4,3],[ 2,6,4,5]]  
    41.     ori3=2*[[ 4,3,2,3],[ 2,1,1,1]]  
    42.     #相同维度的相乘,相同坐标元素的相乘  
    43.     print np.multiply(ori,ori2)  
    44.     print '\n'  
    45.     #不同维度的相乘,相同坐标元素的相乘  
    46.     print np.multiply(np.mat(ori),ori3)  
    47.     print '\n'  
    48.     #  
    49.   
    50.     print np.mat(ori)*np.mat(ori3)  
    51.   
    52. def others():  
    53.     ori=[[ 3,4,2,4],[ 0,3,1,2],[ 2,6,4,3],[ 2,6,4,1]]  
    54.     matrix=np.mat(ori)  
    55.     [m,n]=np.shape(matrix)  
    56.     #得到矩阵的行列数  
    57.     print m,n  
    58.     #行切片  
    59.     print matrix[0]  
    60.     #列切片  
    61.     print matrix.T[0]  
    62.   
    63. #matrix的sum操作  
    64. def matrix_sum():  
    65.     ori=[[ 3,4,2],[ 0,3,1],[ 2,6,4]]  
    66.     print ori  
    67.     matrix=np.mat(ori)  
    68.     print matrix  
    69.     print np.sum(matrix)  
    70.   
    71. #matrix的次方  
    72. def power_matrix():  
    73.     ori=[[ 3,4,2],[ 0,3,1],[ 2,6,4]]  
    74.     print np.power(np.mat(ori),10)  
    75.   
    76.   
    77. if __name__ == '__main__':  
    78.     # init_matrix()  
    79.     # gen_random_matrix()  
    80.     # gen_unit_matrix()  
    81.     # matrix_add_sub()  
    82.     # multi_matrix()  
    83.     matrix_sum()  
    84.     # multi_matrix2()  
    85.     # power_matrix()  
    86.     # others()  

 

转载于:https://my.oschina.net/hblt147/blog/1596267

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值