• [技术干货] 【转载】在Spark程序中使用深度学习模型来处理非结构化数据
    【转载华为云社区】随着大数据和AI业务的不断融合,大数据分析和处理过程中,通过深度学习技术多非结构化数据(如图片、音频、文本)的进行大数据处理的业务场景越来越多。本文会介绍Spark如何与深度学习框架进行协同工作,在大数据的处理过程利用深度学习框架对非结构化数据进行处理。Spark介绍Spark是大规模数据处理的事实标准,包括机器学习的操作,希望把大数据处理和机器学习管道整合。Spark使用函数式编程范式扩展了MapReduce模型以支持更多计算类型,可以涵盖广泛的工作流。Spark使用内存缓存来提升性能,因此进行交互式分析也足够快速(就如同使用Python解释器,与集群进行交互一样)。缓存同时提升了迭代算法的性能,这使得Spark非常适合机器学习。由于Spark库提供了Python、Scale、Java编写的API,以及内建的机器学习、流数据、图算法、类SQL查询等模块;Spark迅速成为当今最重要的分布式计算框架之一。与YARN结合,Spark提供了增量,而不是替代已存在的Hadoop集群。在最近的Spark版本中,Spark加入了对于K8s的支持,为Spark与AI能力的融合提供了更好的支持。深度学习框架介绍TensorFlowTensorFlow 最初是由 Google 机器智能研究部门的 Google Brain 团队开发,基于Google 2011年开发的深度学习基础架构DistBelief构建起来的。由于Google在深度学习领域的巨大影响力和强大的推广能力,TensorFlow一经推出就获得了极大的关注,并迅速成为如今用户最多的深度学习框架。TensorFlow是一个非常基础的系统,因此也可以应用于众多领域。但由于过于复杂的系统设计,对读者来说,学习TensorFlow底层运行机制更是一个极其痛苦的过程。TensorFlow的接口一直处于快速迭代之中,并且没有很好地考虑向后兼容性,这导致现在许多开源代码已经无法在新版的TensorFlow上运行,同时也间接导致了许多基于TensorFlow的第三方框架出现BUG。KerasKeras 于2015年3月首次发布,拥有“为人类而不是机器设计的API”,得到Google的支持。它是一个用于快速构建深度学习原型的高层神经网络库,由纯Python编写而成,以TensorFlow,CNTK,Theano和MXNet为底层引擎,提供简单易用的API接口,能够极大地减少一般应用下用户的工作量。严格意义上讲,Keras并不能称为一个深度学习框架,它更像一个深度学习接口,它构建于第三方框架之上。Keras的缺点很明显:过度封装导致丧失灵活性。Keras最初作为Theano的高级API而诞生,后来增加了TensorFlow和CNTK作为后端。学习Keras十分容易,但是很快就会遇到瓶颈,因为它缺少灵活性。另外,在使用Keras的大多数时间里,用户主要是在调用接口,很难真正学习到深度学习的内容。PyTorchPyTorch于2016年10月发布,是一款专注于直接处理数组表达式的低级API。 前身是 Torch(一个基于 Lua 语言的深度学习库)。Facebook 人工智能研究院对PyTorch提供了强力支持。 PyTorch 支持动态计算图,为更具数学倾向的用户提供了更低层次的方法和更多的灵活性,目前许多新发表的论文都采用PyTorch作为论文实现的工具,成为学术研究的首选解决方案。Caffe/Caffe2.0Caffe的全称是Convolutional Architecture for Fast Feature Embedding,它是一个清晰、高效的深度学习框架,于2013年底由加州大学伯克利分校开发,核心语言是C++。它支持命令行、Python和MATLAB接口。Caffe的一个重要特色是可以在不编写代码的情况下训练和部署模型。如果您是C++熟练使用者,并对CUDA计算游刃有余,你可以考虑选择Caffe在Spark大数据处理中使用深度学习框架在Spark程序中使用一个预训练过的模型,将其并行应用于大型数据集的数据处理。比如,给定一个可以识别图片的分类模型,其通过一个标准数据集训练(如ImageNet)过。可以在一个Spark程序中调用一个框架(如TensorFlow或keras)进行分布式预测。通过在大数据处理过程中调用预训练模型可以直接对非结构化数据进行直接处理。我们重点介绍在Spark程序中使用Keras+TensorFlow来进行模型推理。使用深度学习处理图片的第一步,就是载入图片。Spark 2.3中新增的ImageSchema包含了载入数百万张图像到 Spark DataFrame 的实用函数,并且以分布式方式自动解码,容许可扩展地操做。使用Spark's ImageSchema:from pyspark.ml.image import ImageSchema image_df = ImageSchema.readImages("/data/myimages") image_df.show()也可以利用Keras的图片处理库:from keras.preprocessing import image img = image.load_img("/data/myimages/daisy.jpg", target_size=(299, 299))可以通过图片路径来构造Spark DataFrame:def get_image_paths_df(sqlContext, dirpath, colName):     files = [os.path.abspath(os.path.join(dirpath, f)) for f in os.listdir(dirpath) if f.endswith('.jpg')]     return sqlContext.createDataFrame(files, StringType()).toDF(colName)使用Keras接口加载预训练模型:from keras.applications import InceptionV3 model = InceptionV3(weights="imagenet") model.save('/tmp/model-full.h5') model = load_model('/tmp/model-full.h5') 定义图片识别推理方法:        def iv3_predict(fpath):             model = load_model('/tmp/model-full.h5')             img = image.load_img(fpath, target_size=(299, 299))             x = image.img_to_array(img)             x = np.expand_dims(x, axis=0)             x = preprocess_input(x)               preds = model.predict(x)             preds_decode_list = decode_predictions(preds, top=3)             tmp = preds_decode_list[0]             res_list = []             for x in tmp:                 res = [x[0], x[1], float(x[2])]                 res_list.append(res)             return res_list定义推理输入结果Schemadef get_labels_type():         ele_type = StructType()         ele_type.add("class", data_type=StringType())         ele_type.add("description", data_type=StringType())         ele_type.add("probability", data_type=FloatType())         return ArrayType(ele_type)将推理方法定义成Spark UDFspark.udf.register("iv3_predict", iv3_predict, returnType=get_labels_type()) 载入图片定义为数据表df = get_image_paths_df(self.sql) df.createOrReplaceTempView("_test_image_paths_df") 使用SQL语句对接图片进行处理df_images = spark.sql("select fpath, iv3_predict(fpath) as predicted_labels from _test_image_paths_df") df_images.printSchema() df_images.show(truncate=False) 结语在大数据Spark引擎中使用深度学习框架加载预处理模型,来进行非结构数据处理有非常多的应用场景。但是由于深度学习框架的目前比较多,模型与框架本身是深度耦合,在大数据环境中安装和部署深度学习框架软件及其依赖软件会非常复杂,同时不利于大数据集群的管理和维护,增加人力成本。华为云DLI服务,采用大数据Serverless架构,用户不需要感知实际物理集群,同时DLI服务已经在大数据集群中内置了AI计算框架和底层依赖库(Keras/tensorflow/scikit-learn/pandas/numpy等)。DLI最新版本中已经支持k8s+Docker生态,并开放用户自定义Docker镜像能力,提供给用户来扩展自己的AI框架、模型、算法包。在Serverless基础上,为用户提供更加开放的自定义扩展能力。
  • [技术干货] 【武汉HDZ】Python算法--常用降维方法-常用降维方法解读
    常用降维方法-常用降维方法解读1. 引言  机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达,目前最多使用向量表达形式。 y是数据点映射后的低维向量表达,通常y的维度小于x的维度(当然提高维度也是可以的)。f可能是显式的或隐式的、线性的或非线性的。  目前大部分降维算法处理向量表达的数据,也有一些降维算法处理高阶张量表达的数据。之所以使用降维后的数据表示是因为在原始的高维空间中,包含有冗余信息以及噪音信息,在实际应用例如图像识别中造成了误差,降低了准确率;而通过降维,我们希望减少 冗余信息 所造成的误差,提高识别(或其他应用)的精度。又或者希望通过降维算法来寻找数据内部的本质结构特征。  在很多算法中,降维算法成为了数据预处理的一部分,如PCA。事实上,有一些算法如果没有降维预处理,其实是很难得到很好的效果的。2. 主成分分析算法(PCA)  Principal Component Analysis(PCA)是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中表示,并期望在所投影的维度上数据的方差最大,以此使用较少的数据维度,同时保留住较多的原数据点的特性。  通俗的理解,如果把所有的点都映射到一起,那么几乎所有的信息(如点和点之间的距离关系)都丢失了,而如果映射后方差尽可能的大,那么数据点则会 分散开来,以此来保留更多的信息。可以证明,PCA是丢失原始数据信息最少的一种线性降维方式。(实际上就是最接近原始数据,但是PCA并不试图去探索数 据内在结构)  设 n 维向量w为目标子空间的一个坐标轴方向(称为映射向量),最大化数据映射后的方差,有:  其中 m 是数据实例的个数, xi是数据实例 i 的向量表达, x拔是所有数据实例的平均向量。定义W为包含所有映射向量为列向量的矩阵,经过线性代数变换,可以得到如下优化目标函数:  其中tr表示矩阵的迹,A是数据协方差矩阵。  容易得到最优的W是由数据协方差矩阵前 k 个最大的特征值对应的特征向量作为列向量构成的。这些特征向量形成一组正交基并且最好地保留了数据中的信息。  PCA的输出就是Y = W‘X,由X的原始维度降低到了k维。  PCA追求的是在降维之后能够最大化保持数据的内在信息,并通过衡量在投影方向上的数据方差的大小来衡量该方向的重要性。但是这样投影以后对数据 的区分作用并不大,反而可能使得数据点揉杂在一起无法区分。这也是PCA存在的最大一个问题,这导致使用PCA在很多情况下的分类效果并不好。具体可以看下图所示,若使用PCA将数据点投影至一维空间上时,PCA会选择2轴,这使得原本很容易区分的两簇点被揉杂在一起变得无法区分;而这时若选择1轴将会得 到很好的区分结果。  Discriminant Analysis所追求的目标与PCA不同,不是希望保持数据最多的信息,而是希望数据在降维后能够很容易地被区分开来。后面会介绍LDA的方法,是另一 种常见的线性降维方法。另外一些非线性的降维方法利用数据点的局部性质,也可以做到比较好地区分结果,例如LLE,Laplacian Eigenmap等。优点:它是无监督学习,完全无参数限制的。在PCA的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后的结果只与数据相关,与用户是独立的。用PCA技术可以对数据进行降维,同时对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果。同时最大程度的保持了原有数据的信息。各主成分之间正交,可消除原始数据成分间的相互影响。计算方法简单,易于在计算机上实现。缺点:如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。贡献率小的主成分往往可能含有对样本差异的重要信息。特征值矩阵的正交向量空间是否唯一有待讨论。在非高斯分布的情况下,PCA方法得出的主元可能并不是最优的,此时在寻找主元时不能将方差作为衡量重要性的标准。3. LDA  Linear Discriminant Analysis(也有叫做Fisher Linear Discriminant)是一种有监督的(supervised)线性降维算法。与PCA保持数据信息不同,LDA是为了使得降维后的数据点尽可能地容易被区分!  假设原始数据表示为X,(m*n矩阵,m是维度,n是sample的数量)  既然是线性的,那么就是希望找到映射向量a, 使得 a‘X后的数据点能够保持以下两种性质:同类的数据点尽可能的接近(within class)不同类的数据点尽可能的分开(between class)  所以PCA用的这张图,如果图中两堆点是两类的话,那么我们就希望他们能够投影到轴1去(PCA结果为轴2),这样在一维空间中也是很容易区分的。优点在降维过程中可以使用类别的先验知识经验,而像PCA这样的无监督学习则无法使用类别先验知识;LDA在样本分类信息依赖均值而不是方差的时候,比PCA之类的算法较优;缺点LDA不适合对非高斯分布样本进行降维,PCA也有这个问题。LDA降维最多降到类别数k-1的维数,如果我们降维的维度大于k-1,则不能使用LDA。当然目前有一些LDA的进化版算法可以绕过这个问题;*LDA在样本分类信息依赖方差而不是均值的时候,降维效果不好;LDA可能过度拟合数据4. 局部线性嵌入 (LLE)  Locally linear embedding(LLE)是一种非线性降维算法,它能够使降维后的数据较好地保持原有 流形结构 。LLE可以说是流形学习方法最经典的工作之一。很多后续的流形学习、降维方法都与LLE有密切联系。  见图,使用LLE将三维数据(b)映射到二维(c)之后,映射后的数据仍能保持原有的数据流形(红色的点互相接近,蓝色的也互相接近),说明LLE有效地保持了数据原有的流行结构。  但是LLE在有些情况下也并不适用,如果数据分布在整个封闭的球面上,LLE则不能将它映射到二维空间,且不能保持原有的数据流形。那么我们在处理数据中,首先假设数据不是分布在闭合的球面或者椭球面上。  LLE算法认为每一个数据点都可以由其近邻点的线性加权组合构造得到。算法的主要步骤分为三步:(1)寻找每个样本点的k个近邻点;(2)由每个 样本点的近邻点计算出该样本点的局部重建权值矩阵;(3)由该样本点的局部重建权值矩阵和其近邻点计算出该样本点的输出值。5. Laplacian Eigenmaps 拉普拉斯特征映射  Laplacian Eigenmaps,看问题的角度和LLE有些相似,也是用局部的角度去构建数据之间的关系。  它的直观思想是希望相互间有关系的点(在图中相连的点)在降维后的空间中尽可能的靠近。Laplacian Eigenmaps可以反映出数据内在的流形结构。  使用时算法具体步骤为:  1.构建图  使用某一种方法来将所有的点构建成一个图,例如使用KNN算法,将每个点最近的K个点连上边。K是一个预先设定的值。  2.确定权重  确定点与点之间的权重大小,例如选用热核函数来确定,如果点i和点j相连。  见上图所示,左边的图表示有两类数据点(数据是图片),中间图表示采用Laplacian Eigenmap降维后每个数据点在二维空间中的位置,右边的图表示采用PCA并取前两个主要方向投影后的结果,可以清楚地看到,在此分类问题 上,Laplacian Eigenmap的结果明显优于PCA。  上图说明的是,高维数据(图中3D)也有可能是具有低维的内在属性的(图中roll实际上是2D的),但是这个低维不是原来坐标表示,例如如果要保持局部关系,蓝色和下面黄色是完全不相关的,但是如果只用任何2D或者3D的距离来描述都是不准确的。
  • [技术干货] 【武汉HDZ】Python算法--常用降维方法-常用降维方法的目的
    常用降维方法-常用降维方法的目的  正所谓每一个结果的出现都是一系列的原因导致的,当构建机器学习模型时候,有时候数据特征异常复杂,这就需要经常用到数据降维技术,下面主要介绍一些降维的主要原理。1. 降维的目的  在实际的机器学习项目中,特征选择/降维是必须进行的,因为在数据中存在以下几个 方面的问题:数据的多重共线性:特征属性之间存在着相互关联关系。多重共线性会导致解的空间不稳定, 从而导致模型的泛化能力弱;高纬空间样本具有稀疏性,导致模型比较难找到数据特征;过多的变量会妨碍模型查找规律;仅仅考虑单个变量对于目标属性的影响可能忽略变量之间的潜在关系。通过特征选择/降维的目的是:减少特征属性的个数确保特征属性之间是相互独立的  当然有时候也存在特征矩阵过大, 导致计算量比较大,训练时间长的问题  因为篇幅有限,本次实验主要介绍以下两种降维方法:PCALDA2. 常见两大降维方法2.1 PCA  主成分析(PCA):将高纬的特征向量合并称为低纬度的特征属性,是一种无监督 的降维方法。  算法目标是通过某种线性投影,将高维的数据映射到低维的空间中表 示,并且期望在所投影的维度上数据的方差最大(最大方差理论),以此使用较 少的数据维度,同时保留较多的原数据点的特性。主成分选择   假设原来的特征数据是n维数据,首先选着方差最大方向为第一维数据。第二个坐标轴选择和第一个坐标轴垂直或者正交 的方向;第三个坐标轴选择和第一个、第二个坐标轴都垂直或者正交的方向;该 过程一直重复,直到新坐标系的维度和达到给定的值。 而这些方向所表示的数据特征就被称为“主成分”。2.2 LDA  线性判断分析(LDA):LDA是一种基于分类模型进行特征属性合并的操作,是一 种有监督的降维方法。  LDA的原理是,将带上标签的数据(点),通过投影的方法,投影到维度更低的 空间中,使得投影后的点,会形成按类别区分,一簇一簇的情况,相同类别的点, 将会在投影后的空间中更接近。用一句话概括就是:“投影后类内方差最小,类 间方差最大”  比较:相同点:两者均可以对数据完成降维操作两者在降维时候均使用矩阵分解的思想两者都假设数据符合高斯分布不同点:LDA是监督降维算法,PCA是无监督降维算法LDA降维最多降到类别数目k-1的维数,而PCA没有限制LDA除了降维外,还可以应用于分类LDA选择的是分类性能最好的投影,而PCA选择样本点投影具有最大方差的方向
  • [技术干货] 【武汉HDZ】Python算法--常用降维方法-机器学习数学预备知识
    常用降维方法-机器学习数学预备知识1.机器学习简介  机器学习的特点就是:以计算机为工具和平台,以数据为研究对象,以学习方法为中心;是概率论、线性代数、数值计算、信息论、最优化理论和计算机科学等多个领域的交叉学科。2. 机器学习预备数学知识2.1 线性代数2.1.1 标量  一个标量就是一个单独的数,一般用小写的的变量名称表示。2.1.2 向量  一个向量就是一列数,这些数是有序排列的。用过次序中的索引,我们可以确定每个单独的数。通常会赋予向量粗体的小写名称。当我们需要明确表示向量中的元素时,我们会将元素排列成一个方括号包围的纵柱,我们可以把向量看作空间中的点,每个元素是不同的坐标轴上的坐标。2.1.3 矩阵  矩阵是二维数组,其中的每一个元素被两个索引而非一个所确定。我们通常会赋予矩阵粗体的大写变量名称,比如A。 如果一个实数矩阵高度为m,宽度为n,那么我们说。2.1.4 张量  几何代数中定义的张量是基于向量和矩阵的推广,通俗一点理解的话,我们可以将标量视为零阶张量,矢量视为一阶张量,那么矩阵就是二阶张量。  例如,可以将任意一张彩**片表示成一个三阶张量,三个维度分别是图片的高度、宽度和色彩数据。将这张图用张量表示出来,就是最下方的那张表格:        其中表的横轴表示图片的宽度值,这里只截取0~319;表的纵轴表示图片的高度值,这里只截取0~4;表格中每个方格代表一个像素点,比如第一行第一列的表格数据为[1.0,1.0,1.0],代表的就是RGB三原色在图片的这个位置的取值情况(即R=1.0,G=1.0,B=1.0)。2.1.5 范数  有时我们需要衡量一个向量的大小。在机器学习中,我们经常使用被称为范数(norm) 的函数衡量矩阵大小。Lp 范数如下:2.1.6 特征分解  许多数学对象可以通过将它们分解成多个组成部分。特征分解是使用最广的矩阵分解之一,即将矩阵分解成一组特征向量和特征值。  方阵A的特征向量是指与A相乘后相当于对该向量进行缩放的非零向量:2.1.7 奇异值分解  矩阵的特征分解是有前提条件的,那就是只有对可对角化的矩阵才可以进行特征分解。但实际中很多矩阵往往不满足这一条件,甚至很多矩阵都不是方阵,就是说连矩阵行和列的数目都不相等。这时候怎么办呢?人们将矩阵的特征分解进行推广,得到了一种叫作“矩阵的奇异值分解”的方法,简称SVD。通过奇异分解,我们会得到一些类似于特征分解的信息。  它的具体做法是将一个普通矩阵分解为奇异向量和奇异值。比如将矩阵A分解成三个矩阵的乘积:2.2 概率论2.2.1 随机变量  随机变量可以随机地取不同值的变量。我们通常用小写字母来表示随机变量本身,而用带数字下标的小写字母来表示随机变量能够取到的值。  对于向量值变量,我们会将随机变量写成X,它的一个值为x。就其本身而言,一个随机变量只是对可能的状态的描述;它必须伴随着一个概率分布来指定每个状态的可能性。  随机变量可以是离散的或者连续的。2.2.2 概率分布  给定某随机变量的取值范围,概率分布就是导致该随机事件出现的可能性。  从机器学习的角度来看,概率分布就是符合随机变量取值范围的某个对象属于某个类别或服从某种趋势的可能性。2.2.3 条件概率  很多情况下,我们感兴趣的是某个事件在给定其它事件发生时出现的概率,这种概率叫条件概率。  我们将给定X=x时Y=y发生的概率记为,这个概率可以通过下面的公式来计算:2.2.4 贝叶斯公式  先看看什么是“先验概率”和“后验概率”,以一个例子来说明:  假设某种病在人群中的发病率是0.001,即1000人中大概会有1个人得病,则有: P(患病) = 0.1%;即:在没有做检验之前,我们预计的患病率为P(患病)=0.1%,这个就叫作"先验概率"。  再假设现在有一种该病的检测方法,其检测的准确率为95%;即:如果真的得了这种病,该检测法有95%的概率会检测出阳性,但也有5%的概率检测出阴性;或者反过来说,但如果没有得病,采用该方法有95%的概率检测出阴性,但也有5%的概率检测为阳性。用概率条件概率表示即为:P(显示阳性|患病)=95%  现在我们想知道的是:在做完检测显示为阳性后,某人的患病率P(患病|显示阳性),这个其实就称为"后验概率"。  而这个叫贝叶斯的人其实就是为我们提供了一种可以利用先验概率计算后验概率的方法,我们将其称为“贝叶斯公式”。  这里先了解条件概率公式:        由条件概率可以得到乘法公式:  将条件概率公式和乘法公式结合可以得到:  再由全概率公式:  代入可以得到贝叶斯公式:  在这个例子里就是:  贝叶斯公式贯穿了机器学习中随机问题分析的全过程。从文本分类到概率图模型,其基本分类都是贝叶斯公式。期望、方差、协方差等主要反映数据的统计特征,机器学习的一个很大应用就是数据挖掘等,因此这些基本的统计概念也是很有必要掌握。另外,像后面的EM算法中,就需要用到期望的相关概念和性质。2.2.5 期望  在概率论和统计学中,数学期望是试验中每次可能结果的概率乘以其结果的总和。它是最基本的数学特征之一,反映随机变量平均值的大小。2.2.6 方差  概率中,方差用来衡量随机变量与其数学期望之间的偏离程度;  统计中的方差为样本方差,是各个样本数据分别与其平均数之差的平方和的平均数。2.2.7 协方差  在概率论和统计学中,协方差被用于衡量两个随机变量X和Y之间的总体误差。数学定义式为:
  • [技术干货] 【武汉HDZ】Python算法--常用降维方法--机器学习简介
    常用降维方法--机器学习简介1. 机器学习简介  机器学习的萌芽诞生与19世纪60年代,20年前开始逐渐兴起,他是一门跨学科的交融。这里面包含了概率论、统计学等等学科。随着计算机硬件的提升,计算机运算速度的不断提高,它真正开始计入我们的日常生活当中。而在不久的将来,我相信它会成为我们生活中必不可少的组成元素。我们说说日常生活中机器学习的应用。第一个提到的最具代表性的公司应该就是google,它们所研发的GOOGLE NOW,GOOGLE PHOTOS 都是基于机器学习的产物。同样在百度,图片识别也是应用到机器学习中的视觉处理系统。于此同时,各种各样的企业都开始尝试把自己的产品往机器学习上靠拢。比如金融公司的汇率预测,股票涨跌。房地产公司的房价预测等等。2. 常见机器学习算法2.1 监督学习算法  如果在学习过程中,我们不断的向计算机提供数据和这些数据对应的值,比如说给计算机看猫和狗的图片,告诉计算机那些图片里是猫,那些是狗,然后在让它学习去分辨猫和狗。通过这种指引的方式,让计算机学习我们是如何把这些图片数据对应上图片所代表的物体。也就是让计算机学习这些标签可以代表那些图片。这种学习方式叫做“监督学习”。预测房屋的价格,股票的涨停同样可以用监督学习来实现。大家所熟知的神经网络同样是一种监督学习的方式。2.2 非监督学习算法  同样在这种学习过程中,我只给计算机提供猫和狗的图片,但是并没有告诉它那些是猫那些是狗。取而代之的是,我让它主机去判断和分类。让它自己总结出这两种类型的图片的不同之处。这就是一种“非监督学习”,在这种学习过程中,我们可以不用提供数据所对应的标签信息,计算机通过观察各种数据之间的特性,会发现这些特性背后的规律。这些规律也就是非监督方法所学到的东西。2.3 半监督学习算法  还有一种方法,综合了监督学习和非监督学习的特征,这种叫作“半监督学习”,它主要考虑如何利用少量有标签的样本和大量的没有标签样本进行训练和分类。在规划机器人的行为准则方面,一种机器人学习方法叫作“强化学习”,也就是把计算机丢到一个对于它完全陌生的环境或者让它完成一项从未接触过的任务。它自己回去尝试各种手段。最后让自己成功使用这一个陌生的环境。或者学会完成这件任务的方法途径。比如我想训练机器人去投篮,我们只需要给它一个球。并告诉它你投进了我给你记一分,让它自己去尝试各种各样的投篮方法。在开始阶段,它的命中率可能会非常低。不过它回像人类一样主机总结和学习投篮失败或成功的经验。最后达到很高的命中率。GOOGLE 开发的ALPHAGO 也就是应用了之一种学习方式。2.4 遗传算法  还有一种和强化学习类似的学习方法,叫做遗传算法。这种方法是模拟我们熟知的进化理论,淘汰弱者,适者生存。通过这样的淘汰机制去选择最优的设计或模型。比如开发者所开发的计算机学会超级玛丽,最开始的马里奥1代可能不久就牺牲了,不过系统会基于1代的马里奥随机生成2代。然后在保存这些代里面最厉害的马里奥。淘汰掉比较弱的马里奥代,然后再次基于强者“繁衍和变异”,生出更强的马里奥,这也就是遗传算法的基本思想。3. 机器学习的历史  1950年,计算机科学家 Alan Turing发明了所谓的图灵测试,计算机必须通过文字对话一个人,让人以为她在和另一个人说话。图灵认为,只有通过这个测试,机器才能被认为是“智能的”。1952年,Arthur Samuel创建了第一个真正的机器学习程序——一个简单的棋盘游戏,计算机能够从以前的游戏中学习策略,并提高未来的性能。接着是Donald Michie 在1963年推出的强化学习的tic-tac-toe程序。在接下来的几十年里,机器学习的进步遵循了同样的模式--一项技术突破导致了更新的、更复杂的计算机,通常是通过与专业的人类玩家玩战略游戏来测试的。  它在1997年达到巅峰,当时IBM国际象棋电脑深蓝(Deep Blue)在一场国际象棋比赛中击败了世界冠军加里·卡斯帕罗夫(Garry Kasparov)。最近,谷歌开发了专注于古代中国棋类游戏围棋(Go)的AlphaGo,该游戏被普遍认为是世界上最难的游戏。尽管围棋被认为过于复杂,以至于一台电脑无法掌握,但在2016年,AlphaGo终于获得了胜利,在一场五局比赛中击败了Lee Sedol。  机器学习最大的突破是2006年的深度学习。深度学习是一类机器学习,目的是模仿人脑的思维过程,经常用于图像和语音识别。深度学习的出现导致了我们今天使用的(可能是理所当然的)许多技术。你有没有把一张照片上传到你的Facebook账户,只是为了暗示给照片中的人贴上标签?Facebook正在使用神经网络来识别照片中的面孔。或者Siri呢?当你问你的iPhone关于今天的棒球成绩时,你的话语会用一种复杂的语音解析算法进行分析。如果没有深度学习,这一切都是不可能的。4. 机器学习的应用场景4.1 市民出行选乘公交预测    基于海量公交数据记录,希望挖掘市民在公共交通中的行为模式。以市民出行公交线路选乘预测为方向,期望通过分析广东省部分公交线路的历史公交卡交易数据,挖掘固定人群在公共交通中的行为模式,分析推测乘客的出行习惯和偏好,从而建立模型预测人们在未来一周内将会搭乘哪些公交线路,为广大乘客提供信息对称、安全舒适的出行环境,用数据引领未来城市智慧出行。2、基于运营商数据的个人征信评估运营商作为网络服务供应商,积累了大量的用户基本信息及行为特征数据,如终端数据、套餐消费数据、通信数据等等。实名制政策保证了运营商用户数据能与用户真实身份匹配,并真实客观的反映用户行为。广泛覆盖的网络基础设施提供了积累大量实时数据的条件,这些用户数据实时反馈着用户的各个维度的信息及特征。在我国,个人征信评估主要通过引用央行个人征信报告,但对于很多用户没有建立个人信用记录的用户,金融机构想要了解他们的信用记录成本又较高,传统征信评估手段难以满足目前多种多样的新兴需求。金融业务不同于其他大数据业务,对数据的真实性、可信度和时效性要求较高,而这正是运营商数据的价值所在。期望利用运营商用户数据,提供完善的个人征信评估。4.3 商品图片分类    京东含有数以百万计的商品图片,“拍照购”“找同款”等应用必须对用户提供的商品图片进行分类。同时,提取商品图像特征,可以提供给推荐、广告等系统,提高推荐/广告的效果。希望通过对图像数据进行学习,以达到对图像进行分类划分的目的。4.4 广告点击行为预测    用户在上网浏览过程中,可能产生广告曝光或点击行为。对广告点击进行预测,可以指导广告主进行定向广告投放和优化,使广告投入产生最大回报。希望基于100万名随机用户在六个月的时间范围内广告曝光和点击日志,包括广告监测点数据,预测每个用户在8天内是否会在各监测点上发生点击行为。4.5 基于文本内容的垃圾短信识别    垃圾短信已日益成为困扰运营商和手机用户的难题,严重影响到人们正常生活、侵害到运营商的社会形象以及危害着社会稳定。而不法分子运用科技手段不断更新垃圾短信形式且传播途径非常广泛,传统的基于策略、关键词等过滤的效果有限,很多垃圾短信“逃脱”过滤,继续到达手机终端。希望基于短信文本内容,结合机器学习算法、大数据分析挖掘来智能地识别垃圾短信及其变种。4.6 大数据精准营销中搜狗用户画像挖掘    “物以类聚,人以群分”这句古语不仅揭示了物与人的自组织趋向,更隐含了“聚类”和“人群”之间的内在联系。在现代数字广告投放系统中,以物拟人,以物窥人,才是比任何大数据都要更大的前提。在现代广告投放系统中,多层级成体系的用户画像构建算法是实现精准广告投放的基础技术之一。其中,基于人口属性的广告定向技术是普遍适用于品牌展示广告和精准竞价广告的关键性技术。在搜索竞价广告系统中,用户通过在搜索引擎输入具体的查询词来获取相关信息。因此,用户的历史查询词与用户的基本属性及潜在需求有密切的关系。希望基于用户历史一个月的查询词与用户的人口属性标签(包括性别、年龄、学历)做为训练数据,通过机器学习、数据挖掘技术构建分类算法来对新增用户的人口属性进行判定。4.7 基于用户位置信息的商业选址    随着信息技术的快速发展,移动设备和移动互联网已经普及到千家万户。在用户使用移动网络时,会自然的留下用户的位置信息。随着近年来GIS地理信息技术的不断完善普及,结合用户位置和GIS地理信息将带来创新应用。如百度与万达进行合作,通过定位用户的位置,结合万达的商户信息,向用户推送位置营销服务,提升商户效益。希望通过大量移动设备用户的位置信息,为某连锁餐饮机构提供新店选址。4.8 中文地址标准化处理    地址是一个涵盖丰富信息的变量,但长期以来由于中文处理的复杂性、国内中文地址命名的不规范性,使地址中蕴含的丰富信息不能被深度分析挖掘。通过对地址进行标准化的处理,使基于地址的多维度量化挖掘分析成为可能,为不同场景模式下的电子商务应用挖掘提供了更加丰富的方法和手段,因此具有重要的现实意义。3、非人恶意流量识别  2016年第一季度Facebook发文称,其Atlas DSP平台半年的流量质量测试结果显示,由机器人模拟和黑IP等手段导致的非人恶意流量高达75% . 仅2016上半年,AdMaster反作弊解决方案认定平均每天能有高达 28% 的作弊流量。低质量虚假流量的问题一直存在,这也是过去十年间数字营销行业一直在博弈的问题。基于AdMaster海量监测数据,50%以上的项目均存在作弊嫌疑;不同项目中,作弊流量占广告投放5%到95%不等;其中垂直类和网盟类媒体的作弊流量占比最高;PC端作弊流量比例显著高于移动端和智能电视平台。广告监测行为数据被越来越多地用于建模和做决策,例如绘制用户画像,跨设备识别对应用户等。作弊行为,恶意曝光,网络爬虫,误导点击,甚至是在用户完全无感知的情况下被控制访问等产生的不由用户主观发出的行为给数据带来了巨大的噪声,给模型训练造成了很大影响。  希望基于给定的数据,建立一个模型来识别和标记作弊流量,去除数据的噪声,从而更好的使用数据,使得广告主的利益最大化。
  • [技术干货] 【武汉HDZ】Python算法--数据降维概述
    数据降维概述1.数据降维概述  所谓的数据降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中,可以解决大规模特征下的数据显示问题,使得数据集更易使用,降低后续算法的计算,消除噪声影响并使得结果更易理解。 数据降维的方法有很多,可从线性或非线性角度对其简单分类。 线性降维是指通过降维所得到的低维数据能保持高维数据点之间的线性关系,主要包括  主成分分析(Principal Component Analysis,PCA)、线性判别分析(Linear Discriminant Analysis,LDA);  非线性降维一类是基于核的,如 KPCA(Kernel PCA);另一类就是通常所说的流形学习:从高维采样数据中恢复出低维流形结构,即找到高维空间中的低维流形,并求出相应的嵌入映射,如:等距映射(Isomap)、局部线性嵌入(Locally Linear Embedding,LLE)等。 整体来说,线性方法计算块,复杂度低,但对复杂的数据降维效果较差。2.有监督和无监督  有监督学习:对具有概念标记(分类)的训练样本进行学习,以尽可能对训练样本集外的数据进行标记(分类)预测。这里,所有的标记(分类)是已知的。因此,训练样本的岐义性低。  无监督学习:对没有概念标记(分类)的训练样本进行学习,以发现训练样本集中的结构性知识。这里,所有的标记(分类)是未知的。因此,训练样本的岐义性高。聚类就是典型的无监督学习。3.线性降维  主成分分析(Principal Component Analysis,PCA)是最常用的线性降维方法,是一种无监督的降维方法。它的目标是通过某种线性投影,将高维的数据映射到低维的空间中表示,并期望在所投影的维度上数据的方差最大,以此使用较少的数据维度,同时保留住较多的原数据点的特性。常用于高维数据的降维,例如二维数据集降维就是把点投射成一条线,数据集的每个样本都可以用一个值表示,同样也可以利用主成分分析将三维的图像转换成二维的。 PCA 追求的是在降维之后能够最大化保持数据的内在信息,并通过衡量在投影方向上的数据方差的大小来衡量该方向的重要性,但是这样投影以后对数据的区分作用并不大,反而可能使得数据点揉杂在一起无法区分。  下图是PCA的投影的一个表示,黑色的点是原始的点,带箭头的虚线是投影的向量,pc1表示特征值最大的特征向量,pc2表示特征值次大的特征向量,两者是彼此正交的,因为这原本是一个2维的空间,所以最多有两个投影的向量。4.非线性降维  主成分分析(PCA)和线性判别分析(LDA)能很好地解决呈线性关系的数据的降维,但是对于有非线性结构的数据,这种变换会丢失部分重要信息。事实上,存在非线性关系的数据集并不少见,例如将一把椅子平移,那各个平移点可看做存在线性关系,但将其旋转时,就变为了非线性关系。这种情况下,通常采用流形学习的方法。  等距映射(Isomap)是一种较为经典的非线性降维算法,其主要目标是找到给定的高维流形对应的低维嵌入,使得高维流形上数据点间的近邻结构在低维嵌入中得以保持。算法通过将每个数据点和临近的数据点连接构成图,用图论中的dijkstra距离来估计流形的测地距离。其创新之处在于计算高维流形上数据点间距离时,不是用传统的欧式距离,而是采用微分几何中的测地线距离,并且找到了一种用实际输入数据估计其测地线距离的算法(即图论中的最小路径逼近测地线距离)。Isomap的优点在于:  (1) 求解过程依赖于线性代数的特征值和特征向量问题,保证了结果的稳健性和全局最优性;  (2) 能通过剩余方差判定隐含的低维嵌入的本质维数;  (3) Isomap方法计算过程中只需要确定唯一的一个参数(近邻参数k或邻域半径e)。在Python中,Scikit-Learn库提供了用于等距映射的类,其构造函数为:  (4) sklearn.manifold.Isomap(n_neighbors=5,n_components=2,eigen_solver='auto',tol=0,max_iter=None,path_method='auto',neighbors_algorithm='auto', n_jobs=1)。局部线性嵌入(Locally linear embedding,LLE)也是一种非线性降维算法,它能够使降维后的数据较好地保持原有流形结构,LLE 是许多其它流形学习方法的基础。LLE 算法认为每一个数据点都可以由其近邻点的线性加权组合构造得到。算法的主要步骤分为三步:  (1) 寻找每个样本点的 k 个近邻点;  (2) 由每个样本点的近邻点计算出该样本点的局部重建权值矩阵;  (3) 由该样本点的局部重建权值矩阵和其近邻点计算出该样本点的输出值。 在 Python 中,Scikit-Learn 库提供了用于局部线性嵌入的类,其构造函数为:sklearn.manifold.LocallyLinearEmbedding(n_neighbors=5,n_components=2,reg=0.001,eigen_solver='auto',tol=1e-06,max_iter=100,method='standard',hessian_tol=0.0001,modified_tol=1e-12,neighbors_algorithm='auto',random_state=None, n_jobs=1)。  通过修改参数method可以设置局部线性嵌入的具体版本,如使用标准的局部线性嵌入则将该参数设为 standard。5.数据标准化  数据标准化处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理。最基本的标准化方法有:  (1) 中心化:将变量的每一个数值减去该变量的均值;  (2) 缩放:将变量的每一个数值除以该变量的标准差;  (3) 归一化:对变量的每一个数值做中心化和缩放处理,使得每一个数值代表其与均值相差的标准差的倍数。  在Python中,Scikit-Learn库提供了用于数据标准化的类,其构造函数为:sklearn.preprocessing.StandardScaler(copy=True,with_mean=True, with_std=True),通过参数copy可以设置是否在原数据上进行标准化,默认为 True 即标准化后生成新的拷贝,通过参数 with_mean 和 with_std 决定是否中心化和缩放,默认都为 True。6.常用降维方法简介  几种常用的降维方法有:缺失值比率、低方差滤波、高相关滤波、随机森林/组合树、主成分分析、反向特征消除、前向特征构造。  (1) 缺失值的比率  数据列如果存在太多的缺失值是不可能有太多的有用信息,因此设定一个阈值,如果数据列缺失的数据大于阈值时将数据列删除。设定的阈值越大,删除的数据列越多随之维度减少的幅度也越大。  (2) 低方差过滤  和缺失值比率很相似,数据列中的数据很小的变动即方差过小时(低于预先设定的阈值)删除数据列。特别注意的是:方差是依赖于范围的,因此在应用该方法前对数据正则化处理。  (3) 高相关过滤  数据列中有相似趋势往往也存在着相似的信息,这种情况下往往一个数据列就可以参与机器学习的模型的建立了,因此我们需要计算数值列之间的相关系数和标称列之间的皮尔逊积矩系数和皮尔逊卡方值,双列的相关系数高于设定的阈值时可以减少到只有一个。提醒一下:相关量比较敏感,因此列的归一化需要一个相对有意义的相关性比较。  (4) Random Forests/Ensemble Trees  决策树的 Ensemble 也成为 RF(随机森林),除了在做有效的分类器很有用外,在特征选择方面也很有效果。一种降维的方法是针对目标属性生成一个大的和构造的树,然后使用每个属性的使用统计数据发现大多数信息的特征子集。可以生成大量层次很低的树(2 层),与每棵树正在训练总额的一小部分数量的属性。如果一个属性经常被选为最佳的,它是最有可能被保留的一个有效特征。在 RF 中分数计算的随机属性的使用统计数据告诉我们——相对于其他属性——这是最有预测力的属性。  (5) PCA(主成分分析)  主成分分析(PCA)是一种正交统计过程,将一个数据集的原始 n 坐标转换成一个新的 n 组坐标(叫做主成分)。转化的结果,第一个主成分具有最大可能的方差,在正交于(不相关)先前的主成分的限制条件下,每个成功转化后的成分都具有最高可能的方差。只保留第一个 m < n 成分降低了数据的维度,同时保留大部分的数据信息也就是变化的数据。注意, PCA 转化对原始变量的变化比例很敏感。数据列(维度)范围在应用 PCA 之前需要正则化;同时也要注意新的坐标系(PCs)不再是真正的系统变量了;PCA 在应用到你的数据集产生新的维度时也就失去了它的可解释性,如果结果的可解释性对于你的数据分析很重要,那么在针对你的项目分析时,PCA 不能作为你的首要选择转化方法。  (6) 反向特征的消除  这个方法中,在给定的迭代次数下选定的分类算法对 n 个输入特征进行训练,然后每次删除一个输入特征用相同的模型对剩下的 n-1 个输入特征训练 n 次,删除的输入特征在错误率上已产生最小的增长应该就将其删除,留给将剩余的 n-1 个输入特征。分类器接着使用 n-2 个特征作为输入,等等…每次迭代 k 产生一个模型训练 n-k 特征和一个出错率 e(k);选择一个最大可容许的错误率,我们定义的最小数量的特性必须达到所选的机器学习算法的分类器的性能。  (7) 正向特征的构建  这种方法和反向特征消除方法具有相反的处理过程。刚开始只处理一个特征,然后逐步每次添加一个特征,也就是说输入特征即特征维度在分类器的性能上产生最大的增加。就这两种算法而言,计算特别耗时而且计算量也特别大,它们实际上只适用于一个数据集已经相对具有较少的输入列(特侦维度)。  除了上面谈到的几种方法外,随机推测、NMF、自动编码器、卡方检验或信息增益、多维度等级法、一致性分析、因子分析、聚类和贝叶斯模型在数据降维上表现也不错。
  • [技术干货] 【武汉HDZ】Python算法-- 基于聚类的离群点检测方法
    基于聚类的离群点检测方法1.基于聚类的离群点检测概述  在利用python进行数据挖掘时,离群点检测经常是必不可少的一部分。离群点检测的任务是发现与大部分其它对象显著不同的对象。大部分数据挖掘方法都将这种差异信息视为噪声丢弃,然而在部分情况下,罕见的数据可能蕴含着更大的研究价值。2.丢弃远离其他簇的小簇  一种利用聚类检测离群点的方法是丢弃远离其他簇的小簇。通常,该过程可以简化为丢弃小于某个最小阔值的所有簇。  这个方法可以和其他任何聚类技术一起使用,但是需要最小簇大小和小簇与其他簇之间距离的阈值。而且这种方案对簇个数的选择高度敏感,使用这个方案很难将离群点得分附加到对象上。  在下图图1中,聚类簇数K=2,可以直观地看出其中一个包含5个对象的小簇远离大部分对象,可以视为离群点。3.基于原型的聚类  另一种比较系统的方法,首先聚类所有对象,然后评估对象属于簇的程度(离群点得分)。在这种方法中,可以用对象到它的簇中心的距离来度量属于簇的程度。特别的,如果删除一个对象导致该目标的明显改进,则可将该对象视为离群点。例如,在K均值算法中,删除远离其相关簇中心的对象能够显著地改进该簇的误差平方和(SSE)。  对于基于原型的聚类,评估对象属于簇的程度(离群点得分)主要有两种方法:一是度量对象到簇原型的距离,并用它作为该对象的离群点得分;二是考虑到簇具有不同的密度,可以度量簇到原型的相对距离,相对距离是点到质心的距离与簇中所有点到质心距离的中位数之比。  可以注意到,在基于聚类的离群点检测中,对象是否被认为是离群点可能高度依赖于簇的个数(如K很大时的噪声簇)。该问题也没有一个简单的答案,这里提供两种解决思路:一种是改变簇的个数重复检测分析,另一种是聚类得到大量小簇,此时若存在离群点,则它多半真的是一个离群点(但这样的缺点是一组离群点可能形成小簇从而逃避检测)。4.基于聚类的离群点检测的改进  离群点对初始聚类的影响:通过聚类检测离群点时,离群点会影响聚类结果。为了处理该问题,可以使用的方法有:对象聚类、删除离群点、对象再次聚类(这个不能保证产生最优结果)。  还有一种更复杂的方法:取一组不能很好地拟合任何簇的特殊对象,这组对象代表潜在的离群点。随着聚类过程的进展,簇在变化。不再强属于任何簇的对象被添加到潜在的离群点集合;测试当前在该集合中的对象,如果它现在强属于一个簇,就可以将它从潜在的离群点集合中移除。聚类过程结束时还留在该集合中的点被分类为离群点(这种方法也不能保证产生最优解,甚至不比前面的简单算法好,在使用相对距离计算离群点得分时,这个问题特别严重)。  对象是否被认为是离群点可能依赖于簇的个数(如 K 很大时的噪声簇)。该问题也没有简单的答案。一种策略是对于不同的簇个数重复该分析。另一种方法是找出大量小簇,其想法如下:  (1) 较小的簇倾向于更加凝聚;  (2) 如果存在大量小簇时,一个对象是离群点,则它多半是一个真正的离群点。 不利的一面是一组离群点可能形成小簇从而逃避检测。 利用前面的数据进行聚类分析,并计算各个样本到各自聚类中心的距离,分析离群样本,得到距离误差图。
  • [技术干货] 【武汉HDZ】Python算法--基于密度的离群点检测方法
    基于密度的离群点检测方法1.平稳性检验  通过估计概率分布的参数来建立一个数据模型。如果一个数据对象不能很好地同该模型拟合,即如果它很可能不服从该分布,则它是一个离群点。2.一元正态分布中的的离群点检测  正态分布是统计学中最常用的分布之一。 若随机变量x的密度函数如下式:则称x服从正态分布,简称x服从正态分布N(μ,σ),其中参数μ和σ分别为均值和标准差。  下图所示N(0,1)的密度函数:  N(0,1)的数据对象出现在该分布的两边尾部的机会很小,因此可以用它作为检测数据对象是否是离群点的基础。数据对象落在3倍标准差中心区域之外的概率仅有0.0027。3.混合模型的离群点检测  混合模型是一种特殊的统计模型,它使用若干统计分布对数据建模。每一个分布对应一个簇,而每个分布的参数提供对应簇的描述,通常用中心和发散描述。  混合模型将数据看作从不同的概率分布得到的观测值的集合。概率分布可以是任何分布,但是通常是多元正态的,因为这种类型的分布不难理解,容易从数学上进行处理,并且已经证明在许多情况下都能产生好的结果。这种类型的分布可以对椭圆簇建模。  总的来说,混合模型数据产生过程为:定几个类型相同但参数不同的分布,随机地选取一个分布并由它产生一个对象。重复该过程m次,其中m是对象的个数。  具体地讲,假定有K个分布和m个对象X=x1,x2,…,xm。设第j个分布的参数为句,并设 A 是所有参数的集合,即A=a1, a2, … , ak。则$P(x_i|a_j)$是第i个对象来自第j个分布的概率。选取第j个分布产生一个对象的概率由权值$w_j(1 ≤ j ≤ K)$给定,其中权值(概率)受限于其和为1的约束,即:于是,对象x的概率由以下公式给出:  如果对象以独立的方式产生,则整个对象集的概率是每个个体对象局的概率的乘积,公式如下:  对于混合模型,每个分布描述一个不同的组,即一个不同的簇。通过使用统计方法,可以由数据估计这些分布的参数,从而描述这些分布(簇)。也可以识别哪个对象属于哪个簇。然而,泪合模型只是给出具体对象属于特定簇的概率。  聚类时,混合模型方法假定数据来自混合概率分布,并且每个簇可以用这些分布之一识别。同样,对于离群点检测,用两个分布的混合模型建模,个分布为正常数据,而另一个为离群点。  聚类和离群点检测的目标都是估计分布的参数,以最大化数据的总似然。 离群点检测常用的简单的方法:先将所有数据对象放入正常数据集,这时离群点集为空集;再用一个迭代过程将数据对象从正常数据集转移到离群点集,该转移能提高数据的总似然。  具体操作如下:  假设数据集U包含来自两个概率分布的数据对象:M是大多数(正常)数据对象的分布,而 N 是离群点对象的分布。数据的总概率分布可以记作:$U(x) = (1 -\lambda M(x) + \lambda N(x)$,其中,x是一个数据对象;$\lambda ∈[0,1]$,给出离群点的期望比例。分布M由数据估计得到,而分布N通常取均匀分布。设Mt和Nt分别为时刻t正常数据和离群点对象的集合。初始t=0,M0=D,而N0≠Ø。  根据公式混合模型中公式$P(x|A)=\sum_{j=1}^K w_jP_j(x|a_j)$推导,在整个数据集的似然和对数似然可分别由下面两式给出:  其中PD、PMt、PNt分别是 、Mt、Nt的概率分布函数。  因为正常数据对象的数量比离群点对象的数量大很多,因此当一个数据对象移动到离群点集后,正常数据对象的分布变化不大。在这种情况下,每个正常数据对象的总似然的贡献保持不变。此外,如果假定离群点服从均匀分布,则移动到离群点集的每一个数据对象对离群点的似然贡献一个固定的量。这样,当一个数据对象移动到离群点集时,数据总似然的改变粗略地等于该数据对象在均匀分布下的概率(用λ加权)减去该数据对象在正常数据点的分布下的概率(用 l-λ加权)。从而,离群点由这样一些数据对象组成。这样,数据对象在均匀分布下的概率比正常数据对象分布下的概率高。  在某些情况下是很难建立模型的。例如,因为数据的统计分布未知或没有训练数据可用。在这种情况下,可以考虑其他不需要建立模型的检测方法。
  • [技术干货] 【武汉HDZ】Python算法--离群点检测概述
    离群点检测概述1.离群点检测概念  离群点是由系统受外部干扰而产生的。但是,形成离群点的系统外部干扰非常多。可能是采样中的误差,计算错误等,都有可能产生极端大值或者极端小值。其次可能是被研究的对象受到非正常的因素影响而引起的,例如在人口死亡序列中,由于某年发生了海啸,使该月死亡人数剧增,形成离群点;在股票价格序列中,由于受某项政策出台或某种谣传等等,都会出现极增,极减现象,变现为序列中的离群点。  就餐饮企业而言,经常会碰到如下问题。  (1) 如何根据客户的消费记录检测是否为异常刷卡消费?  (2) 如何检测是否有异常订单?  这一类异常问题可以通过离群点检测来解决。 离群点检测是数据挖掘中重要的一部分,它的任务是发现与大部分其他对象显著不同的对象。大部分数据挖掘方法都将这种差异信息视为噪声而丢弃,然而在一些应用中,罕见的数据可能蕴含着更大的研究价值。  在数据的散布图中,图1所示离群点远离其他数据点。因为离群点的属性值明显偏离期望的或常见的属性值,所以离群点检测也称偏差检测。        离群点检测已经被广泛应用于电信和信用卡的诈骗检测、贷款审批、电子商务、网络入侵和天气预报等领域。例如,可以利用离群点检测分析运动员的统计数据,以发现异常的运动员。2.离群点的成因  离群点的主要成因有:数据来源于不同的类、自然变异、数据测量和收集误差。3.离群点的类型   从数据范围:全局离群点和局部离群点;从整体来看,某些对象没有离群特征,但是从局部来看,却显示了一定的离群性。如图所示,C是全局离群点,D是局部离群点。  从数据类型 :数值型离群点和分类型离群点,这是以数据集的属性类型进行划分的。  从属性的个数:一维离群点和多维离群点,一个对象可能有一个或多个属性。  4.常用离群点检测方法  常用离群点检测方法描述与评估如图所示:        基于统计模型的离群点检测方法需要满足统计学原理,如果分布已知,则检验可能非常有效。基于邻近度的离群点检测方法比统计学方法更一般、更容易使用,因为确定数据集有意义的邻近度量比确定它的统计分布更容易。基于密度的离群点检测与基于邻近度的离群点检测密切相关,因为密度常用邻近度定义:  (1) 一种是定义密度为到K个最邻近的平均距离的倒数,如果该距离小,则密度高;  (2) 另一种是使用DBSCAN聚类算法,一个对象周围的密度等于该对象指定距离d内对象的个数。
  • [技术干货] 【转载】用技术布道:华为云背后的“智囊团”们
    华为云有一支“神秘之师”,所有成员均是来自业界管理、销售、市场、技术等各个领域的精英。它是华为云重要的“外脑”之一,为华为云的发展出谋划策;它也是华为云的“宣传队”,让更多的行业客户和合作伙伴可以更深入地了解华为云;它还是华为云的“先遣队”,可以优先体验华为云的产品和解决方案,并与各行各业的用户分享体验和实践经验。他们就是华为云MVP(Most Valuable Professional),即华为云最有价值专家。能够享有华为云MVP头衔的人都不简单,要么是行业意见领袖、技术专业人士,要么是在业界具有一定影响力和特殊贡献的专家。他们专注于帮助他人了解和使用华为云的技术、产品及解决方案,并代表用户优化产品体验,增进华为云与用户之间的相互了解。在没有实际接触前,想象中的华为云MVP应该是治学严谨、表情严肃的老专家,或者是有三头六臂、手眼通天的重量级大咖,反正是有一种距离感,高高在上。但实际上,除了确实是各自领域的专家以外,华为云MVP是奋战在一线的管理、销售和技术人员,风华正茂,富有朝气和闯劲,而且极具个性:有的善于写作,透着文艺青年范儿;有的语言表达颇具感染力,像是个演说家……听他们讲讲企业上云的酸甜苦辣,再聊一聊华为云的创新与实践,有茅塞顿开之感,意犹未尽。Part 1:与华为云一起修炼贵州开拓未来计算机有限公司(以下简称“贵州开拓未来”)CTO宋雷,华为云MVP,未见其人,先见其文。作为今日头条的认证作家,宋雷在平时的工作中只要有空闲时间、有灵感,就会写作,至今已在华为云博客上发表了18篇技术文章。宋雷是华为云名副其实的技术布道师。在华为云组织的相关活动中,宋雷分享了许多专业技术经验和使用华为云的实践经验,而他的笔正是最有效的传播工具。贵州开拓未来CTO 宋雷宋雷口中的小公司——贵州开拓未来虽然只有100多人,却随着大数据浪潮的到来快速崛起,专业从事房地产领域大数据信息化平台的研发、运营和大数据分析,拥有自主可控的大数据技术和成熟的服务产品,开发人员的比例高达70%,是贵州省最大的房产信息化系统建设公司。在房产信息化行业向数字化转型的过程中,贵州开拓未来扮演着助力者和推动者的角色。作为企业的CTO,宋雷并不满足于做一名单纯的战术领导者,而是要在公司的技术战略层面做出规划和设计,同时还要兼顾管理战术层面的一些细节。宋雷表示:“作为CTO,我会更加关注前沿技术的发展,比如人工智能、云计算和大数据等技术,并且会结合企业的自身情况,引入合适的技术,在公司进行落地,更好地推动公司业务的创新与发展。”在工作中,宋雷经常会使用华为软件开发云观察公司产品的研发进度,公司的版本管理服务器、开发服务器、测试服务器都构建在华为云服务器之上。对于贵州开拓未来而言,云服务是大数据应用的基础设施,不管是大数据的存储、分析甚至是采集,都可以在云的基础上完成。云计算极大地节省了企业的研发成本,以及系统采购成本和运维成本。华为云的稳定性、安全性以及经济性,完全可以满足贵州开拓未来的应用需求。贵州开拓未来的产品研发对云端部署提出了许多新的要求,接下来会更多地尝试采用SaaS应用。在宋雷看来,华为云在混合云和私有云上具有一定优势,这是由华为自身的基因决定的。华为云的产品在非功能特性上比较出色,比如稳定性和性能,如能进一步提升用户体验,就更加完美。在贵阳只有两名华为云MVP,宋雷便是其中之一,这也让他感觉重任在肩。2019年,宋雷参加了多场华为云产品在贵州的推介会,以及华为软件开发云针对贵阳高新区领导的汇报会议。推广和帮助其他人使用华为云、体验华为云,并提出建设性的改进意见,宋雷义不容辞。虽然责任更重了,但宋雷同时也感到自我驱动力更强了。不管是出于爱好、激情还是责任,在宋雷看来,写作都是自我驱动力的一种体现。将写作看作是一种修炼的宋雷,将伴随华为云一起修炼、提升和完善。Part2:和华为云ModelArts共同成长时间一晃,任如意担任帆一尚行(上汽云计算中心)AI团队的技术负责人已经两年了。博士毕业、研究方向是船舶智能控制系统的任如意,一直对工业领域的AI应用情有独钟,所以现在的工作对他来说是如鱼得水。刚刚成为华为云MVP的任如意据说是华为云ModelArts一站式AI开发与管理平台的铁杆粉。回忆起曾在华为杭州研究所一年半的工作经历,任如意至今记忆犹新,当初在中央软件院编程语言实验室从事与编程语言和AI芯片相关的工作,让他获益匪浅。帆一尚行(上汽云计算中心)AI团队技术负责人任如意为了支撑集团的自动驾驶业务开发,任如意所在的团队开发了一站式自动驾驶平台——iGear平台,方便自动驾驶研发团队在其上构建丰富的业务应用,同时还为集团内其他部门开发诸如燃料电池实验分析平台、故障检测等端到端的解决方案等。上汽集团在AI方面已经有非常多成功的落地实践,包括智能制造、自动驾驶、智能物流、智能出行等,比如全球首次5G+AI智能化港区作业成功落地,以及上汽5G智能重卡成功实现在港区特定场景下的L4级自动驾驶等。上汽集团在AI方面最迫切的需求,就是更强大、更便宜的算力,无论是在训练侧还是在端侧。“现在基于深度学习的人工智能开发、训练、推理和部署的成本比较高,如果将来能够有更普惠、更便宜的软硬件方案和标准,那么做AI开发和应用将是一件非常幸福的事。”任如意有感而发。说来凑巧,因为开发iGear机器学习平台的缘故,任如意较为深入地研究了市场上几乎所有的机器学习平台。华为云ModelArts刚开放试用时,任如意就已经在关注,后来华为云ModelArts正式发布后,任如意便迫不及待地将其几乎所有功能都试用了一遍。“我个人比较喜欢ModelArts清晰的定位和务实的功能。”任如意表示,“ModelArts定位于一个普惠的机器学习平台,基本包含了中小企业、研究者和个人进行AI开发的所有功能,并且以一种清晰、简单的用户界面展现出来。在标注、预标注、训练、部署、框架等各个方面,做到了功能和易用性的很好平衡。”通过实际使用,任如意感觉ModelArts是公有云平台中比较优秀的机器学习平台。而让任如意非常期待的是,ModelArts未来可以无缝对接华为自研AI芯片。在试用ModelArts的过程中。任如意还积极地参与到ModelArts社区中,并因此结识了华为的许多专家和社区里的朋友,进一步加深了对ModelArts的了解。ModelArts经常会有一些社区活动,比如算法实践和竞赛等,为大家提供了一个交流技术、分享想法的平台。这也让任如意与华为云ModelArts越走越近。作为团队中的技术架构师,任如意的主要工作是帮助团队进行总体架构设计和技术选型,解决一些工程上的难题,并且致力于打造一支热爱分享、心态开放、算法和工程能力齐头并进的AI技术团队。正是基于此,他理想中的AI平台应该能够全方位地支撑AI开发和落地,让开发人员在其上只专注于业务开发,而将其他的都交给平台来处理。“我们希望拥有一个稳健的能够存储海量数据的分布式存储系统、强大灵活的数据处理系统、功能多样且易用的标注服务及自动标注服务、强大的算力和能够灵活调度、提供不同算力的训练平台,以及模型推理发布平台等。”任如意表示,“因此,我们知道,做一个通用的AI开发平台并非易事,需要从不同的需求中提炼出真正核心的部分。这就是像ModelArts这样的公有云上的机器学习平台需要不断创新和完善的。”任如意个人比较推崇公有云上普惠性的机器学习平台。他个人所做的一些小项目就是构建在华为云ModelArts上的。作为华为云MVP,任如意表示,自己最重要的责任还是在ModelArts社区的推广上。他曾经作为社区专家与华为云CTO张顺茂等一起发布了沃土计划2.0,并且做过一次基于ModelArts开发人脸情绪识别应用的技术直播,有近5000人收看。这些令人兴奋、激动的瞬间都成了任如意2019年最美好的回忆。让他倍感欣喜的是,ModelArts社区在迅速壮大,有更多小伙伴参与其中。作为社区的一份子,任如意希望未来能够与社区一起成长进步。Part3:与华为云合作是一种享受说实话,最开始关注南京小脚印网络科技有限公司(以下简称“小脚印科技”)产品副总林艺玲,主要因为她是华为云MVP中屈指可数的女性。不过在仔细看了她的简历后,对于她华为云MVP的身份不由得暗暗称赞:截至目前,她已在华为云博客上发表了21篇技术文章;在华为全联接大会上,为女性开发者站台;成功地为华为云推荐过两位MVP,并推荐两位用户采用华为云……这应该是华为云MVP最成功的典范吧!小脚印科技专注于为照明、电力、交通、地产等行业的客户提供包括智能终端、云端管理、大数据和AI运营服务等在内的一揽子解决方案。作为公司产品与运营的负责人,林艺玲在日常工作中经常要与华为云的软件开发云、AI云,以及云服务器等打交道。举例来说,华为软件开发云提供了项目管理、质量管理等一些很好的工具,基于这些功能和工具,小脚印科技顺利完成了任务把控、Bug跟进、开发质量管理等工作。南京小脚印网络科技有限公司产品副总 林艺玲“最初,我感觉华为云上的东西很全、很强大,但是怎么用完全摸不清方向,使用起来也有点困难。后来,我将改进建议通过平台、线下等多种方式进行反馈,基本上每个反馈意见都得到了华为云的积极响应。”林艺玲表示,“用心倾听用户的声音,快速反馈和迭代发布,华为云越来越好用。这是让我印象最深刻的。”接下来,小脚印科技将在AI方面重点投入,会考虑将现有业务与华为AI云相结合,为客户提供更优质的服务。在工作中,林艺玲并没有性别差异观念。公司的目标是又快又好地打造产品,为用户解决问题,让用户满意的同时又感觉很惊艳。而这一切离不开团队的协作,只有所有成员各司其职,才能赢得客户的青睐,而这与性别无关,只与有没有把本职工作做好有关。林艺玲之所进入IT行业,说到底还是因为热爱。在这样一个偏男性主导的工作环境中,她在刚入行时也曾质疑过自己,但是做产品岗后,她的想法彻底改变了:“可能在编程方面,我无法达到一些男生的高度,但在产品方面,我比较敏感,能够快速发现并理解用户需求,找到问题解决的路径,并将很多好的想法付诸实践,创造让世界变得更美好的东西。这就像是哥伦布发现新大陆,充满惊喜,让人倍感珍惜并全情投入。”在IT行业浸润多年,到现在,林艺玲完全是在享受自己的工作。虽然忙碌,可是她非常享受对自己工作节奏感的把握、探寻未知领域的乐趣,以及在变化中寻找不变的快感。承担起华为云MVP的职责,对林艺玲来说也是一种享受。她参加了包括华为全联接大会MVP研讨会、产品体验调查和访谈,以及云上直播话题互动等在内的多项活动。成为华为云MVP后,她在使用华为产品时,会自然而然地从完善产品角度去考虑功能,而且范围不局限在华为云的产品,针对其他种类的华为产品也会主动体验和提出改进建议,比如短信业务、WeLink等。此外,林艺玲还为华为云社区撰写技术博客,与他人交流技术问题等。在这些沟通和互动中,她不禁感慨华为云对开发者的重视,同时也惊讶于华为云的前进速度。特别值得一提的是,林艺玲非常主动地将自己身边一些不同领域资深的开发者朋友吸引过来,成功推荐了在卫星通信、5G及IoT等行业有多年实战经验的两位专家,一方面可以让这些朋友在与华为云开发者交流的过程中有所收获,另一方面也能助力华为云开发者社区的成长。后记在上云的早期,企业用户之所以对上云犹豫不决,或者望而却步,很大程度上就是怕在一缺资金、二缺人才、三缺技术的基础上自己摸着石头过河,会多走弯路,甚至有失败的风险。华为云MVP的独特价值体现在:他们是一批成功上云、用云的榜样,通过他们的现身说法,为其他想上云的企业提供了有益的借鉴;华为云MVP还是一面镜子,可以让华为云看清企业上云最真实的需求,并据此持续优化自身的产品和解决方案;华为云MVP更是尽职尽责的云计算布道者,擎着云计算的旗帜,引导市场和应用不断走向深入。华为云MVP就像是星星之火,在你我的身边点燃企业上云最炽热的火焰。
  • [技术干货] 【AIoT融合实践在线训练营】第3章华为云平台搭建实验所用jar包下载
    【AIoT融合实践在线训练营】第3章华为云平台搭建实验所用jar包下载,见附件
  • [技术干货] KNN 原理
    KNN 工作原理假设有一个带有标签的样本数据集(训练样本集),其中包含每条数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较。计算新数据与样本数据集中每条数据的距离。对求得的所有距离进行排序(从小到大,越小表示越相似)。取前 k (k 一般小于等于 20 )个样本数据对应的分类标签。求 k 个数据中出现次数最多的分类标签作为新数据的分类。KNN 通俗理解给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的 k 个实例,这 k 个实例的多数属于某个类,就把该输入实例分为这个类。KNN 开发流程收集数据:任何方法 准备数据:距离计算所需要的数值,最好是结构化的数据格式 分析数据:任何方法 训练算法:此步骤不适用于 k-近邻算法 测试算法:计算错误率 使用算法:输入样本数据和结构化的输出结果,然后运行 k-近邻算法判断输入数据分类属于哪个分类,最后对计算出的分类执行后续处理KNN 算法特点优点:精度高、对异常值不敏感、无数据输入假定 缺点:计算复杂度高、空间复杂度高 适用数据范围:数值型和标称型
  • [技术干货] 【武汉HDZ】Python算法协同过滤算法——基于物品的协同过滤算法
    【Python算法】协同过滤算法——基于物品的协同过滤算法推荐算法背景:        互联网的迅猛发展将人类带入了信息社会和网络经济时代,信息化影响到了生活的方方面面。但是随着互联网产业的扩大,为用户提供更多选的同时也带来了筛选与推荐的难题。于是便提出了推荐算法帮助用户快速找到自己喜爱的东西。例如京东、淘宝、美团等,在用户购买物品后,均会给用户推荐他们可能喜欢的物品,不仅免去了用户不断查找类似物品的烦恼,而且也使得用户可以货比多家,最终找到自己物美价廉的商品,而相关的网站平台也可以提升自己的销量。电影推荐也是比较常见的,例如用户观看了阿甘正传,可能推荐给用户肖申克的救赎、当幸福来敲门等,推荐相关的应用数不胜数,但其核心就是相关的推荐算法的组合。目前有关个性化推荐算法主要分为三大类:1.基于协同过滤的推荐;2.基于内容过滤的推荐;3.社会化推荐。本文主要讨论基于协同过滤的推荐,而该算法也可以划分为两类:这里主要介绍基于物品的协同过滤算法(ItemCF):内容过滤根据信息资源与用户兴趣的相似性来推荐商品,通过计算用户兴趣模型和商品特征向量之间的向量相似性,主动将相似度高的商品发送给该模型的客户。由于每个客户都独立操作,拥有独立的特征向量,不需要考虑别的用户的兴趣,不存在评价级别多少的问题,能推荐新的项目或者是冷门的项目。这些优点使得基于内容过滤的推荐系统不受冷启动和稀疏问题的影响实验工具1.python  Python是一种计算机程序设计语言。是一种动态的、面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。Python已经成为最受欢迎的程序设计语言之一。自从2004年以后,python的使用率呈线性增长。2011年1月,它被TIOBE编程语言排行榜评为2010年度语言。  由于Python语言的简洁性、易读性以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python来教授程序设计课程。例如卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论就使用Python语言讲授。  众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。而Python专用的科学计算扩展库就更多了,例如如下3个十分经典的科学计算扩展库:NumPy、SciPy和matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图功能。因此Python语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。jupyter        Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。Jupyter Notebook 的本质是一个 Web 应用程序,便于创建和共享文学化程序文档,支持实时代码,数学方程,可视化和 markdown。 用途包括:数据清理和转换,数值模拟,统计建模,机器学习等等基于物品的推荐算法以及流程例如前面背景中介绍的,用户喜欢看阿甘正传,且给了高评分后,那么系统将会寻找与阿甘正传类似的电影推荐给用户。算法流程构建用户–>物品的倒排;构建物品与物品的同现矩阵;计算物品之间的相似度,即计算相似矩阵;根据用户的历史记录,给用户推荐物品;算法流程1构建用户–>物品的倒排如下表,行表示用户,列表示物品,1表示用户喜欢该物品用户\物品abcdeA11B1111C1D111E11例如python构建的数据格式如下 { 'A': {'a': '1', 'b': '1', 'd': '1'},  'B': {'c': '1', 'b': '1', 'e': '1'},  'C': {'c': '1', 'd': '1'},  'D': {'c': '1', 'b': '1', 'd': '1'}, 'E': {'a': '1', 'd': '1'} }算法流程2构建物品与物品的同现矩阵共现矩阵C表示同时喜欢两个物品的用户数,是根据用户物品倒排表计算出来的。如根据上面的用户物品倒排表可以计算出如下的共现矩阵C:物品\物品abcdeA12B1221C221D222E11算法流程3计算物品之间的相似度,即计算相似矩阵其中两个物品之间的相似度如何计算?设|N(i)|表示喜欢物品i的用户数,|N(i)⋂N(j)|表示同时喜欢物品i,j的用户数,则物品i与物品j的相似度为:(1)式有一个问题,当物品j是一个很热门的商品时,人人都喜欢,那么wij就会很接近于1,即(1)式会让很多物品都和热门商品有一个很大的相似度,所以可以改进一下公式:算法流程2中的共现矩阵C其实就是式(2)的分子,矩阵N(用于计算分母)表示喜欢某物品的用户数(是总的用户数),则(2)式中的分母便很容易求解出来了。矩阵N如下所示:物品abcde用户数23341利用式(2)便能计算物品之间的余弦相似矩阵如下:物品\物品abcdea0.410.71b0.410.670.580.58c0.670.580.58d0.710.580.58e0.580.58算法流程4根据用户的历史记录,给用户推荐物品;最终推荐的是什么物品,是由预测兴趣度决定的。物品j预测兴趣度=用户喜欢的物品i的兴趣度×物品i和物品j的相似度例如:A用户喜欢a,b,d ,兴趣度分别为1,1,1推荐c的预测兴趣度=1X0.67+1X0.58=1.25推荐e的预测兴趣度=1X0.58=0.58python实现算法数据描述该数据为用户,兴趣度,物品    #用户,兴趣度,物品     uid_score_bid = ['A,1,a', 'A,1,b', 'A,1,d', 'B,1,b', 'B,1,c', 'B,1,e', 'C,1,c', 'C,1,d', 'D,1,b', 'D,1,c', 'D,1,d',                      'E,1,a', 'E,1,d']  2.python实现物品推荐    # -*- coding: UTF-8 -*-     from math import sqrt     import operator     # 用户,兴趣度,物品     uid_score_bid = ['A,1,a', 'A,1,b', 'A,1,d', 'B,1,b', 'B,1,c', 'B,1,e', 'C,1,c', 'C,1,d', 'D,1,b', 'D,1,c', 'D,1,d',                      'E,1,a', 'E,1,d']     # 1.构建用户-->物品的倒排     def loadData(files):         data = {}         for line in files:             user,score,item = line.split(",")             data.setdefault(user,{})             data[user][item] = score         print("----1.用户:物品的倒排----")         print(data)         return data     # 2.1 构造物品-->物品的共现矩阵     # 2.2 计算物品与物品的相似矩阵     def similarity(data):         # 2.1 构造物品:物品的共现矩阵         N = {}  # 喜欢物品i的总人数         C = {}  # 喜欢物品i也喜欢物品j的人数         for user,item in data.items():             for i,score in item.items():                 N.setdefault(i,0)                 N[i] += 1                 C.setdefault(i,{})                 for j,scores in item.items():                     if j not in i:                         C[i].setdefault(j,0)                         C[i][j] += 1         print("---2.构造的共现矩阵---")         print ('N:',N)         print ('C',C)         # 2.2 计算物品与物品的相似矩阵         W = {}         for i,item in C.items():             W.setdefault(i,{})             for j,item2 in item.items():                 W[i].setdefault(j,0)                 W[i][j] = C[i][j]/sqrt(N[i]*N[j])         print("---3.构造的相似矩阵---")         print(W)         return W     # 3.根据用户的历史记录,给用户推荐物品     def recommandList(data,W,user,k=3,N=10):         rank = {}         for i,score in data[user].items():  # 获得用户user历史记录,如A用户的历史记录为{'a': '1', 'b': '1', 'd': '1'}             for j,w in sorted(W[i].items(),key=operator.itemgetter(1),reverse=True)[0:k]:  # 获得与物品i相似的k个物品                 if j not in data[user].keys():  # 该相似的物品不在用户user的记录里                     rank.setdefault(j,0)                     rank[j] += float(score) * w         print("---4.推荐----")         print(sorted(rank.items(),key=operator.itemgetter(1),reverse=True)[0:N])         return sorted(rank.items(),key=operator.itemgetter(1),reverse=True)[0:N]     if __name__ == '__main__':         # 用户,兴趣度,物品         uid_score_bid = ['A,1,a', 'A,1,b', 'A,1,d', 'B,1,b', 'B,1,c', 'B,1,e', 'C,1,c', 'C,1,d', 'D,1,b', 'D,1,c', 'D,1,d',                          'E,1,a', 'E,1,d']         data = loadData(uid_score_bid)  # 获得数据         W = similarity(data)  # 计算物品相似矩阵         recommandList(data, W, 'A', 3, 10)  #推荐运行结果如下图:电影推荐应用案例1.电影数据描述    data = {'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5,                           'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5,                           'The Night Listener': 3.0},             'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5,                              'Just My Luck': 1.5, 'Superman Returns': 5.0, 'The Night Listener': 3.0,                              'You, Me and Dupree': 3.5},             'Michael Phillips': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0,                                  'Superman Returns': 3.5, 'The Night Listener': 4.0},             'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0,                              'The Night Listener': 4.5, 'Superman Returns': 4.0,                              'You, Me and Dupree': 2.5},             'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,                              'Just My Luck': 2.0, 'Superman Returns': 3.0, 'The Night Listener': 3.0,                              'You, Me and Dupree': 2.0},             'Jack Matthews': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,                               'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5},             'Toby': {'Snakes on a Plane': 4.5, 'You, Me and Dupree': 1.0, 'Superman Returns': 4.0}             }2.推荐推荐过程和上面的代码过程一样,仅不用构造倒排数据demo.py:    # -*- coding: UTF-8 -*-     from math import sqrt     import operator     data = {'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5,                               'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5,                               'The Night Listener': 3.0},                 'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5,                                  'Just My Luck': 1.5, 'Superman Returns': 5.0, 'The Night Listener': 3.0,                                  'You, Me and Dupree': 3.5},                 'Michael Phillips': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0,                                      'Superman Returns': 3.5, 'The Night Listener': 4.0},                 'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0,                                  'The Night Listener': 4.5, 'Superman Returns': 4.0,                                  'You, Me and Dupree': 2.5},                 'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,                                  'Just My Luck': 2.0, 'Superman Returns': 3.0, 'The Night Listener': 3.0,                                  'You, Me and Dupree': 2.0},                 'Jack Matthews': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,                                   'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5},                 'Toby': {'Snakes on a Plane': 4.5, 'You, Me and Dupree': 1.0, 'Superman Returns': 4.0}                 }     # 1.构建用户-->物品的倒排(此推荐无需使用)     def loadData(files):         data = {}         for line in files:             user,score,item = line.split(",")             data.setdefault(user,{})             data[user][item] = score         print("----1.用户:物品的倒排----")         print(data)         return data     # 2.1 构造物品-->物品的共现矩阵     # 2.2 计算物品与物品的相似矩阵     def similarity(data):         # 2.1 构造物品:物品的共现矩阵         N = {}  # 喜欢物品i的总人数         C = {}  # 喜欢物品i也喜欢物品j的人数         for user,item in data.items():             for i,score in item.items():                 N.setdefault(i,0)                 N[i] += 1                 C.setdefault(i,{})                 for j,scores in item.items():                     if j not in i:                         C[i].setdefault(j,0)                         C[i][j] += 1         print("---2.构造的共现矩阵---")         print ('N:',N)         print ('C',C)         # 2.2 计算物品与物品的相似矩阵         W = {}         for i,item in C.items():             W.setdefault(i,{})             for j,item2 in item.items():                 W[i].setdefault(j,0)                 W[i][j] = C[i][j]/sqrt(N[i]*N[j])         print("---3.计算的相似矩阵---")         print(W)         return W     # 3.根据用户的历史记录,给用户推荐物品     def recommandList(data,W,user,k=3,N=10):         rank = {}         for i,score in data[user].items():  # 获得用户user历史记录,如A用户的历史记录为{'a': '1', 'b': '1', 'd': '1'}             for j,w in sorted(W[i].items(),key=operator.itemgetter(1),reverse=True)[0:k]:  # 获得与物品i相似的k个物品                 if j not in data[user].keys():  # 该相似的物品不在用户user的记录里                     rank.setdefault(j,0)                     rank[j] += float(score) * w         print("---3.推荐----")         print(sorted(rank.items(),key=operator.itemgetter(1),reverse=True)[0:N])         return sorted(rank.items(),key=operator.itemgetter(1),reverse=True)[0:N]     if __name__ == '__main__':         print("---1.构造数据---")         W = similarity(data)  # 计算物品相似矩阵         recommandList(data, W, 'Toby', 10, 10)  #推荐推荐结果如下图所示:
  • [分享交流] 关于modelArts自动训练问题
    本人想训练一个识别图片是彩色还是黑白的模型,但是照片训练的时候黑白照片会报错({"question": ["mode illegal"], "solution": ["convert to rgb"]}),报错信息是提示我转换成彩色,但是我的目的就是识别图片为彩色还是黑白,这个有什么好的解决办法吗?
  • [技术干货] 【基于CloudIDE的AI模型训练Codelab体验分享】
    这个codelabs事例非常有代表性。对CloudIDE感触特别大。1、CloudIDE云端开发环境可以很好的提高效率,以前更换设备、出差或者涉及到团队多人协同非常痛苦,在环境的一致性上总是需要花费很大精力,还经常因为环境问题造成意想不到的bug。CloudIDE环境自动帮你安装准备好,只需要通过浏览器就能使用,并且能使用云端强大的算力,感觉以后出差连电脑都不用带了。2、像window端的VS或者android端AS等IDE动辄几百兆甚至上G的安装包,CloudIDE简直就太香了。CloudIDE实现了大部分IDE的功能,有着在线编写代码,智能提示,代码提交,代码片段智能搜索等功能,非常方便。下面是codelabs完成记录情况1、开通CloudIDE2、创建IDE实例3、ModelArts SDK的下载和初始化安装配置4、access_key、secret_key、 project_id、 region_name获取access_key和secret_key会进行手机短信验证码验证后下载一个csv表格project_id和region_name在API凭证里获取,modelarts如果在多region下都有就要选择你正在用的region5、填写的时候记得单引号里面不能有空格,在网页里面复制经常前面会带一个空格6、使用ModelArts SDK进行训练作业7、modelarts控制台能看到训练相关信息并且在线服务里面也部署好8、进行在线预测测试手写数字数据,来源于MUIST数据集,童鞋们可以直接用