Python编程总结(一)

1. python中将Numpy数组保存为图像的方法:

        方法1: import scipy.misc

                   scipy.misc.imsave(‘resultImg.jpg’, numpyMat)

        注意:上面的转换将最小值min转换为黑色,将最大值转换为白色,如果需要得到精确的灰度或者RGB值,应该使用下面的方 式:

                  import scipy.misc

                  scipy.misc.toimage(numpyMat, cmin = 0, cmax =(自己设定的值)).save(‘resultImg.jpg’)

        方法2:from PIL import Image

                  outImg = Image.fromarray(numpyMat)

                  outImg.save(‘resultImg.jpg’)

        方法3:使用struct中的pack和unpack进行打包,根据格式的具体报文内容进行写图;

        方法4:import matplotlib

                  matplotlib.image.imsave(‘resultImg.jpg’, numpyMat)

        方法5:import matplotlib.pyplot as plt

                  plt.imshow(numpyMat)

                  plt.savefig(‘resultImg.jpg’),

         注意:这里将保存plot图而不是图像本身。

        方法6:使用opencv中的函数,具体如下:

                  import cv2

                  import numpy as np

                  cv2.imwrite(‘resultImg.jpg’, numpyMat)

        总结:通过对上面的实现过程进行分析,可以看到大部分的方法实现都是采用的第三方的库,只有第3种方法是采用自己的代码实现,具体过程需要对图像的格式header等有深入的了解。

 

2. Numpy类型矩阵的形状重塑:

    Img_mat = Img_mat.reshape((row, cols));

 

3. python中将Numpy矩阵变为一个行矩阵:

    Img_mat.reshape(-1): 结果是一个一行的一维向量;

    Img_mat.reshape(-1,1): 结果是一个一列的二维向量;

 

4. python中创建一个3行4列的二维全0数组或全1的无符号8位整型数组:

    arr = np.zeros((3,4), dtype = ’uint8’);

    arr = np.ones((3,4), dtype = ’uint8’);

 

5. Python 中从一个文件调用另外一个文件的方法:例如从b.py调用fun函数到a.py中,可以使用下面的语句(在a.py中):

    import b

    xxx = b.func()

 

6. python中aa[::2,::,2]的意识是每隔两行每隔两列进行抽样,[1::2,1::,2]是指从第二行和第二列开始每隔两行和每隔两列进行采样。

 

7. a//b的结果是:floor除法,即结果是不大于小数结果的最大整数。

 

8. python中*args和**kwargs用法:

Python编程总结(一)

        从上面可以看出,*args表示任意多个无名参数,是一个tuple,**kwargs表示关键字参数。当同时使用*args和**kwargs时,*args必须放在**kwargs前,否则会出现语法错误,如下:

Python编程总结(一)

 

9. Sklearn的四大结构:classification, clustering, dimensionality reduction, regression.

        分类:SVC Ensemble Classifiers, kernel approximation, KNeighbors Classification, SGD Classifier, Naive Bayes, Text Data, Linear SVC,;

        聚类: Spectral Clustering, KMeans, MiniBatch Kmeans, MeanShift, VBGMM;

        降维:Randomized PCA, Isomap, Spectral Embedding, LLE, kernel approximation;

 

10. 常用的回归:线性,决策树,SVM,KNN,集成回归,随机森林,Adaboost, GradientBoosting, Bagging, ExtraTrees;

常用的分类:线性,决策树,SVM,KNN,朴素贝叶斯,集成分类,随机森林,Adaboost, Gradient Boosting, bagging, ExtraTrees;

        常用的聚类:K均值(K-means),层次聚类(Hierarchical clustering),DBSCAN;

        常用的降维: LinearDiscriminantAnalysis, PCA;

        模型选择:比较,验证,选择参数和模型,通过参数调整提高精度,例如grid search, cross validation, metrics;

        预处理:特征提取和归一化,把输入数据(如文本)转换为机器学习算法可用的数据,例如preprocessing, feature extraction。

 

11. Lasso: 是估计稀疏系数的线性模型,它在有些情况下是有用的,因为其倾向于使用具有较少参数的情况,有效地减少给定解决方案所依赖变量的数量。因此,Lasso及其变体是压缩感知领域的基础。在一定条件下,它可以恢复一组非零权重的精确集。

 

12. 分解成分中的信号(矩阵分解问题):

        I. 主成分分析:

           a. 准确的PCA和概率解释(Exact PCA and probability interpretation);

           b. 增量PCA(Incremental PCA):解决PCA一次处理数据量过大的问题;

           c. PCA随机使用SVD:通过丢弃具有较低奇异值的奇异向量成分,将数据降维到低维空间并保留大部分方差;

           d. 核PCA:kernel PCA是PCA的扩展,通过使用核方法实现非线性降维(dimensionality reduction),它具有许多应用,包括去噪、压缩和结构化预测(structured prediction)(kernel dependency estimation);

           e. 稀疏主成分分析(SparsePCA和MiniBatchSparsePCA):是PCA的一个变体,目的是提取能更好地重建数据的稀疏组成几 何,小批量稀疏PCA(MiniBatchSparsePCA)是一个SparsePCA的一个变种,速度更快,但准确度有所降低,对于给定的迭代次数,通过迭代改组特征的小块来达到速度增加。

        II. 截断奇异值分解和隐语义分析(TruncatedSVD):

        TruncatedSVD实现一个奇异值分解(SVD)的一个变体,只计算k个最大的奇异值,其中k是用户指定的参数。当截断的SVD被应用于term-document矩阵时(CountVectorizer或者TfidfVectorizer)时,这种转换被称为Laten semantic analysis(LSA),因为它将这样的矩阵转换为低维度的semantic空间,特别地是LSA能够抵抗同义词和多义词的影响(两者大致意味着每个单词有多重含义),这导致term-document矩阵过度稀疏,并且在诸如余弦相似性的度量下表现出差的相似性。LSA也被称为LSI,尽管严格地说它是在持久索引中用于信息检索的目的。

        III. 词典学习:

             a. 带有预计算词典的稀疏编码:

             b. 通用词典学习:

             c. 小批量字典学习:

        VI. 因子分解:因子分解的主要优点是可以独立地对输入空间的每个方向的方差建模,在异方差噪声存在的情况下,可以做出比PCA更好的模型选择。

        V. 独立成分分析(ICA):独立分量分析是将多变量信号分解为独立性最强的加性子组件。它通过Fast ICA算法在scikit-learn中实现。ICA通常不用于降低维度,而是用于分离叠加信号。由于ICA模型不包括噪声项,因此要使模型正确,必须使用白化。ICA通常用于分离混合信号(称为盲源分离问题),也可以用于稀疏子成分的非线性分解。

        VI. 非负矩阵分解(NMF或者NNMF):

        VII. 隐Dirichlet分配(LDA):LDA是离散数据集(如文本语料库)的集合的生成概率模型,也是一个主题模型,用于从文档集合中发现抽象主题,LDA的图形模型是一个三层贝叶斯模型。

 

13. python中axis=-1,axis=0,axis=1的不同含义;

       a. axis = -1表示按照默认方式;

       b. axis = 0表示按照列计算;

       c. axis = 1表示按照行计算;

       例如: A = arrar([[1,2],[3,4]]),那么A.sum(axis=-1)的结果就是[3,7],A.sum(axis=0)的结果就是[4,6],A.sum(axis=1)的结果就是[3,7],也就是说默认是按照行有限计算。

 

14. python中,如果a=b,那么a改变后b的值也会跟随着改变,这一点要特别注意。也就是这是浅层拷贝,即引用,而不是深层拷贝。

 

15. Keras中定义自己的Loss函数

        a. Keras本身提供了很多常用的loss函数(即目标函数),但这些损失函数都是比较基本、通用的,有时候需要根据自己所做的任务来定义损失函数,Keras是一个很高级的封装,自定义loss还是比较简单。

        b. 第一种方式:自定义一个函数,在keras/keras/losses.py文件中,可以看到很多Keras自带loss的实现代码,比如最简单的均方误差损失函数:

         def mean_squared_error(y_true, y_pred):

         return K.mean(K.square(y_pred-y_true),axis=-1);

其中y_true为网络给出的预测值,y_true为标签,两者均为tensor。在loss中直接操作这两个变量即可实现自己想要的loss。例如将其改为四次方的平均值作为新的loss:

          def mean_squared_error2(y_true,y_pred):

          return K.mean(K.square(K.square(y_pred-y_true)),axis=-1),

然后再model编译阶段将loss指定为自定义的函数:

          model.compile(optimizer=’rmsprop’,loss= mean_squared_error2)

        c. keras自带的loss函数就有mse和交叉熵,自己设计loss的一个示例如下:

Python编程总结(一)

                                                                            

Python编程总结(一)

 

16. 采用keras.layers.merge函数进行级联的时候会出现“typeerror module object is not callable”问题的解决,目前还没有其他方法,将merge替换为concatenate,同时去掉mode参数:

        output = merge([x1,x2],mode='concat')

        output = merge([x1,x2],axis=0)

 

17. ValueError: setting an array element with a sequence问题的解决:

       问题产生原因:将一个sequence输入到一个元素element中,维度不匹配。

 

18. tf.concat,tf.stack,tf.unstack的用法,tf.concat相当于numpy中的np.concatenate函数,用于将两个张量在某一个维度(axis)合并起来,例如

        a = tf.constant([[1,2,3],[3,4,5]]) # shape (2,3)

        b = tf.constant([[7,8,9],[10,11,12]]) # shape (2,3)

        ab1 = tf.concat([a,b], axis=0) # shape(4,3)

        ab2 = tf.concat([a,b], axis=1) # shape(2,6)

tf.stack作用类似于tf.concat,都是通过拼接得到两个张量,不同之处在于tf.concat拼接的是除了拼接维度axis之外的其他维度的shape完全相同的张量,并且产生的张量的阶数不会发生变化,而tf.stack则会在新的张量阶上拼接,产生的张量的阶数将会增加。

Python编程总结(一)

 

19. Tensorflow中TypeError: Using a `tf.Tensor` as a Python `bool` isnot allowed. Use `if t is not None:` instead of `if t:` to test if a tensor isdefined, and use TensorFlow ops such as tf.cond to execute subgraphsconditioned on the value of a tensor.问题的解决方法:

    将条件判断由“if grad:”改为“if grad is not None:”。

 

20. tensor中K.less(x,y) is not None, 表示当x<y的时候,K.great(x,y) is not None表示x>y的时候。要注意这两个函数的使用。

 

21. tensorflow中没有K.cond函数,但是可以采用K.switch函数进行逻辑判断来分流,具体如下:

       nearest_neighbor_dist = K.ones([1,])*float(‘inf’)

       for jj in range(cls_num):

             temp = l2_dist[jj,:]

             low_bound=K.less(K.constant(0),temp)

             sed_cond = K.switch(low_bound, lambda:temp, lambda:nearest_neighbor_dist)

              up_bound=K.less(temp, nearest_neighbor_dist)

              nearest_neighbor_dist = K.switch(up_bound, lambda: sed_cond, lambda:nearest_neighbor_dist)

 

22. 目前流行的降维方法:LLE[10],LE[11],MVU[12],KPCA[8],GPLVM[17],MEU[19],SMCE[24],tSNE[20],SPL。

        LLE:L. K. Saul and S. T. Roweis, “Think globally, fit locally: Unsupervised learning of low dimensional manifolds,” J. Mach. Learn. Res., vol. 4, pp. 119–155, 2003.

        LE: M. Belkin and P. Niyogi, “Laplacian eigenmaps and spectral techniques for embedding and clustering,” in Proc. 28th Int. Conf. Neural Inf. Process. Syst., 2001, vol. 14, pp. 585–591.

        MVU: K. Weinberger, F. Sha, and L. Saul, “Learning a kernel matrix for nonlinear dimensionality reduction,” in Proc. 29th Int. Conf. Mach. Learn., 2004, Art. no. 106.

        KPCA: B. Sch€olkopf, A. Smola, and K. Muller, “Kernel principal component analysis,” in Advances in Kernel Methods - Support Vector Learning. Cambridge, MA, USA: MIT Press, 1999, pp. 327–352.

        GPLVM: N. D. Lawrence, “Probabilistic non-linear principal component analysis with gaussian process latent variable models,” J. Mach. Learn. Res., vol. 6, pp. 1783–1816, 2005.

        MEU: N. D. Lawrence, “A unifying probabilistic perspective for spectral dimensionality reduction: Insights and new models,” J. Mach. Learn. Res., vol. 13, no. 1, pp. 1609–1638, 2012.

        SMCE: E. Elhamifar and R. Vidal, “Sparse manifold clustering and embedding,” in Proc. Int. Conf. Neural Inf. Process. Syst., 2011, pp. 55–63.

        tSNE: L. Van der Maaten and G. Hinton, “Visualizing data using T-SNE,” J. Mach. Learn. Res., vol. 9, pp. 2579–2605, 2008.

 

23. 降维方法总结:总体上降维方法分为两种:projection和Manifold Learning。

           PCA的一些变种:增量PCA(IPCA),当数据量大时,使用SVD分解会耗费很大内存,运算速度慢,可以使用IPCA将每次训练给一个mini_patch,实现在线学习。随机PCA可以快速找到接近前d个的主成分,其计算复杂度与d相关而不与n相关。通过数学方法达到增加特征类似的功能实现非线性分类。T-SNE:通过仿射变换将数据点映射到概率分布上,主要包括两个步骤:SNE构建一个高维对象之间的概率分布,使得相似的对象具有更高的概率被选择,而不相似的对象有较低的概率被选择。降维方法还有SVD,truncatedSVD,LDA和isomap。

 

24. python中的yeild函数返回一个迭代对象,通过这个迭代对象每次得到一个数组或者多个返回值,从而实现分批处理。

 

25. 在python中,在if判断条件时,如果两个变量只是值相等,但是类型不同,那么逻辑结果也是否,这点在tensor中加入判断语句时很有用。

 

26. 在tensor的换流中,没有if…else…等可以使用,只能用tf.cond等函数来转换数据流。

 

27. matlab中有关struct的函数:

           函数名                   功能描述

           deal                 把输入处理成输出

           fieldnames            获取结构的字段名

           getfield               获取结构中指定字段的值

           rmfield               删除结构的字段(不是字段内容)

           setfield               设置结构数组中指定的字段的值

           struct                创建结构数组

           struct2cell            结构数组转化成元胞数组

           isfield                判断是否存在该字段

           isstruct               判断某变量是否是结构类型