【机器学习】支持向量机SVM及实例应用

2023-11-05

【机器学习】支持向量机

1.分类超平面与最大间隔

2.对偶问题与拉格朗日乘子法

3.核函数

4.软间隔与正则化

5.实例应用:python使用支持向量机SVM

    准备:    

        数据集

        导入SVM模块

    步骤:

        1.读取数据集

        2.划分训练样本与测试样本

        3.训练SVM分类器

        4.计算分类准确率

        5.绘制图像




       上图是一个关于机器学习算法的时间线来自于Eren Golge。可以看出SVM旺盛的生命力。实际上,即使是深度学习非常火热的今天,SVM依然盛行。在一些小样本分类问题上,SVM表现非常好,用深度学习模型可能反而会使问题变得更复杂。

    下面开始介绍SVM--支持向量机。


1.分类超平面与最大间隔

    给定训练样本集 D ={ (X1 ,Yl),(X2,Y2)..., (Xm,Ym)}, Yi ∈{-1,+1},分类学习最基本的想法就是基于训练集D在样本空间中找到一个划分超平面、将不同类别的样本分开

    但能将训练样本分开的划分超平面可能有很多,如图 6.1所示,我们应该努力去找到哪一个昵?

                

     原则上,是去找位于两类训练样本"正中间"的划分超平面,即图 6.1中黑色最粗的那个,因为该划分超平面对训练样本局部扰动的"容忍性最好,鲁棒性最强,泛化能力最强

    例如,由于训练集的局限性或噪声的因素,训练集外的样本可能比图6.1中的训练样本更接近两个类的分隔界,这将使许多划分超平面出现错误,而黑色最粗的那个超平面受影响最小。换言之,这个划分超平面所产生的分类结果是最鲁棒的,对未见示例的泛化能力最强。

    在样本空间中,划分超平面可通过如下线性方程来描述:

            

    其中:

    x=(x1,x2…xd)为输入数据,维度为d。

    为法向量,决定了超平面的方向。

     b为位移项,决定了超平面与原点之间的距离。

    显然,分类超平面可被法向量ω和位移b确定,下面我们将其记为(w,b)。样本空间中任意点 x到超平面(w,b)的距离可写为:

            

    点到超平面的距离,可参考点到直线的距离公式,见附录【1】。

     假设超平面(w,b)能将训练样本正确分类,即对于  

                

    所以,令:

         

    如图6.2所示,距离超平面最近的这几个训练样本点使式(6.3)的等号成立,它们被称为"支持向量",两个异类支持向量到超平面的距离之和为:

            

    其中,γ被称为"间隔"。

 

    那如何找到具有“最大间隔”的分类超平面呢?

    欲找到具有"最大间隔" (maximum margin) 的划分超平面,也就是要找到能满足式(6.3)中约束的参数w和b,使得γ最大,即

    

    显然,为了最大化间隔γ,仅需最小化||w||。于是,式(6.5)可重写为:

    

    上述(6.6)是支持向量机的基本型

    支持向量机有何特点?

    支持向量满足:

    最大化间隔真的仅与ω有关吗?

    NO!事实上,最大化间隔不只与ω有关,偏置b通过约束隐性地影响着w的取值,进而对间隔产生影响。

    为什么目标函数要写成(6.6)中的凸函数形式呢?

    在表示最大化间隔的优化问题中,发现式(6.5)中的目标函数是非凸的,并没有现成的可用的软件来解决非凸函数的优化问题。所以改成了(6.6)中的凸函数形式。

    关于凸函数,可见附录【2】。

 2.对偶问题与拉格朗日乘子法

    我们希望求解式(6.6)来得到最大间隔分类超平面所对应的模型f(x):

    

    其中ωb是模型参数。注意到式(6.6)本身是一个凸二次规划问题,能直接用现成的优化计算包求解,但我们可以有更高效的办法。
    对式(6.6)使用拉格朗日乘子法可得到其"对偶问题" 。具体来说,对式(6.6)的每条约束添加拉格朗日乘子,则该问题的拉格朗日函数可写为:

    从对偶问题(6.11)解出的是式(6.8)中的拉格朗日乘子,它恰对应着训练样本。注意到式(6.6)中有不等式约束,因此上述过程需满足KKT(Karush-Kuhn-Tucker)条件,即要求

        

    于是,对任意训练样本,总有

        若,则该样本将不会在式(6.12) 的求和中出现,也就不会对f(x)有任何影响;

        若,则必有,所对应的样本点位于最大间隔边界上,是一个支持向量。
    这显示出支持向量机的一个重要性质训练完成后,大部分的训练样本都不需保留,最终模型仅与支持向量有关。

    那么如何求解式(6.11) 呢?不难发现,这是一个二次规划问题?可使用通用的二次规划算法来求解,二次规划可见附录【3】。这里我还没搞懂,先留着坑。

 3.核函数

    在本章前面的讨论中,我们假设训练样本是线性可分的即存在一个划分超平将训练样本正确分。然而在现实任务中,原始样本空间内,许并不存在个能正确划分两类样本的超平面。例如图 6.3 中的" 异或 " 问题就不是线性可分的。

                

    那如何解决非线性可分问题呢?

    对于原空间中的非线性可分问题,可将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分。例如在图6.3中,若将原始的二维空间映射到一个合适的三维空间 ,就能找到一个合适的划分超平面。幸运的是,如果原始空间是有限维,即属性数有限,那么一定存在一个高维特征空间使样本可分。

            

                

    这里的函数 κ(.,.)就是"核函数"。式(6.24)显示出模型最优解可通过训练样本的核函数展开,这一展式亦称"支持向量展式 "显然,若己知合适映射Ф的具体形式,则可写出核函数 κ(.,.)。但在现实任务中我们通常不知道Ф是什么形式,那么,合适的核函数是否一定存在呢?什么样的函数能做核函数呢?

    我们有下面的定理:

        

    那核函数的特点是什么?

    核函数:一个对称函数所对应的核矩阵半正定,它就可作为核函数使用。

    事实上,对于一个半正定核矩阵,总能找到一个与之对应的映射Ф。换言之,任何一个核函数都隐式地定义了一个称为"再生核希尔伯特空间"的特征空间。
    通过前面的讨论可知,我们希望样本在特征空间内线性可分,因此特征空间的好坏对支持向量机的性能至关重要。需注意的是,在不知道特征映射的形式时,我们并不知道什么样的核函数是合适的,而核函数也仅是隐式地定义了这个特征空间。于是,"核函数选择"成为支持向量机的最大变数。若核函数选择不合适,则意味着将样本映射到了一个不合适的特征空间,很可能导致性能不佳。

        

4.软间隔与正则化

    在前面的讨论中,我们一假定训练样本在样本空间或特征空间中是线性可分的,即存在一个超平面能将不同类的样本完全划分开。然而,在现实任务往往很难确定合适的核函数使得练样本在特征空中线性可分。

    退一步说,即使恰好找到了某个核函数使训练集在特征空间中线性可分,也很难断定这个貌似线性可分的结果不是由于过拟合所造成的。

    那么如何缓解该问题呢

    缓解该问题的一个办法是:允许支持向量机在一些样本上出错。为此,引入"软间隔"的概念,如图 6.4所示:

        

    具体来前面介绍的支持向量机是要求所有样本均满足约束(6.3),所有样本都必须划分正确这称为"硬间隔" ,而软隔则是允许某些样本不满足约束:

    

        

5.实例应用:python使用支持向量机SVM

准备:    

    数据集

    导入SVM模块

步骤:

    1.读取数据集

    2.划分训练样本与测试样本

    3.训练SVM分类器

    4.计算分类准确率

    5.绘制图像

     因为Python中的sklearn库也集成了SVM算法,所以在Python中一样可以使用支持向量机做分类。

    【注意】本文的运行环境是windows+Pycharm+python3.6。

    Scikit-Learn库基本实现了所有的机器学习算法,具体使用详见官方文档说明:

    http://scikit-learn.org/stable/auto_examples/index.html#support-vector-machines

    因为本文是基于sklearn包,所以需先在python中下载sklearn包,网上有很多教程,在此不再叙述。

    数据集

    本文用的数据集为Iris.data可从UCI数据库中下载,http://archive.ics.uci.edu/ml/datasets/Iris

    Iris.data的数据格式如下:共5列,前4列为样本特征,第5列为类别,分别有三种类别Iris-setosa, Iris-versicolor, Iris-virginica

    注意:因为在分类中类别标签必须为数字量,所以应将Iris.data中的第5列的类别(字符串)转换为num.

        

导入SVM模块

    首先在使用SVM时,需先从sklearn包中导入SVM模块。

[cpp]  view plain  copy
  1. from sklearn import svm  

1.读取数据集

[cpp]  view plain  copy
  1. #1.读取数据集  
  2. path='F:/Python_Project/SVM/data/Iris.data'  
  3. data=np.loadtxt(path, dtype=float, delimiter=',', converters={4:Iris_label} )  
  4. #converters={4:Iris_label}中“4”指的是第5列:将第5列的str转化为label(number)  

    定义的转换函数为:可实现将类别Iris-setosa, Iris-versicolor, Iris-virginica映射成 0,1,2。

[cpp]  view plain  copy
  1. #define converts(字典)  
  2. def Iris_label(s):  
  3.     it={b'Iris-setosa':0, b'Iris-versicolor':1, b'Iris-virginica':2 }  
  4.     return it[s]  

    读取文件用的是loadtxt函数,其声明如下:

[cpp]  view plain  copy
  1. def  loadtxt(fname, dtype=float, comments='#', delimiter=None,converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)  

    常用的参数有:

        fname: 文件路径,例 path='F:/Python_Project/SVM/data/Iris.data'

    dtype:样本的数据类型 例dtype=float

          delimiter:分隔符。例 delimiter=','

          converters:将数据列与转换函数进行映射字典。例 converters={4:Iris_label}含义是将第5列的数据对应转换函数进行转换。

          usecols:选取数据的列。


2.划分训练样本与测试样本

[cpp]  view plain  copy
  1. #2.划分数据与标签  
  2. x,y=np.split(data,indices_or_sections=(4,),axis=1) #x为数据,y为标签  
  3. x=x[:,0:2] #为便于后边画图显示,只选取前两维度。若不用画图,可选取前四列x[:,0:4]  
  4. train_data,test_data,train_label,test_label =sklearn.model_selection.train_test_split(x,y, random_state=1, train_size=0.6,test_size=0.4)  
       1. split(数据,分割位置,轴=1(水平分割) or 0(垂直分割))。

  2.  sklearn.model_selection.train_test_split随机划分训练集与测试集。train_test_split(train_data,train_label,test_size=数字, random_state=0)

  参数解释:

      train_data:所要划分的样本特征集

      train_label:所要划分的样本类别

      test_size:样本占比,如果是整数的话就是样本的数量.(注意:)

                   --  test_size:测试样本占比。 默认情况下,该值设置为0.25。 默认值将在版本0.21中更改。 只有train_size没有指定时, 

                        它将保持0.25,否则它将补充指定的train_size,例如train_size=0.6,则test_size默认为0.4。

                   -- train_size:训练样本占比。

      random_state:是随机数的种子。

      随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。

3.训练SVM分类器

[cpp]  view plain  copy
  1. #3.训练svm分类器  
  2. classifier=svm.SVC(C=2,kernel='rbf',gamma=10,decision_function_shape='ovr') # ovr:一对多策略  
  3. classifier.fit(train_data,train_label.ravel()) #ravel函数在降维时默认是行序优先  

    kernel='linear'时,为线性核,C越大分类效果越好,但有可能会过拟合(defaul C=1)。

  kernel='rbf'时(default),为高斯核,gamma值越小,分类界面越连续;gamma值越大,分类界面越“散”,分类效果越好,但有可能会过拟合。

  decision_function_shape='ovr'时,为one v rest(一对多),即一个类别与其他类别进行划分,

  decision_function_shape='ovo'时,为one v one(一对一),即将类别两两之间进行划分,用二分类的方法模拟多分类的结果。

4.计算分类准确率

[cpp]  view plain  copy
  1. #4.计算svc分类器的准确率  
  2. print("训练集:",classifier.score(train_data,train_label))  
  3. print("测试集:",classifier.score(test_data,test_label))  

    结果:

        

    还有另一种计算准确率的方法:

[cpp]  view plain  copy
  1. #也可直接调用accuracy_score方法计算准确率  
  2. from sklearn.metrics import accuracy_score  
  3. tra_label=classifier.predict(train_data) #训练集的预测标签  
  4. tes_label=classifier.predict(test_data) #测试集的预测标签  
  5. print("训练集:", accuracy_score(train_label,tra_label) )  
  6. print("测试集:", accuracy_score(test_label,tes_label) )  

    实际上,classifier.score()内部也是先predict得到tes_label , 然后调用了accuracy_score(test_label,tes_label)方法来计算准确率的。

    可以查看一下内部决策函数,返回的是 样本到分类超平面的距离
[cpp]  view plain  copy
  1. #查看决策函数  
  2. print('train_decision_function:',classifier.decision_function(train_data)) # (90,3)  
  3. print('predict_result:',classifier.predict(train_data))  

   (1) 若选用“ovr”(一对多),则每个样本会产生3个距离值(3为类别种类数)。如下

        

           

    (2)若选用“ovo”(一对一),则每个样本会产生3*(3-1)/2=3 个距离值,即 :距离值个数=类别数*(类别数-1)/2。结果如下:

        

        

5.绘制图像

    确定坐标轴范围、字体、背景颜色

[cpp]  view plain  copy
  1. #5.绘制图形  
  2. #确定坐标轴范围  
  3. x1_min, x1_max=x[:,0].min(), x[:,0].max() #第0维特征的范围  
  4. x2_min, x2_max=x[:,1].min(), x[:,1].max() #第1维特征的范围  
  5. x1,x2=np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j ] #生成网络采样点  
  6. grid_test=np.stack((x1.flat,x2.flat) ,axis=1) #测试点  
  7. #指定默认字体  
  8. matplotlib.rcParams['font.sans-serif']=['SimHei']  
  9. #设置颜色  
  10. cm_light=matplotlib.colors.ListedColormap(['#A0FFA0''#FFA0A0''#A0A0FF'])  
  11. cm_dark=matplotlib.colors.ListedColormap(['g','r','b'] )  
  12.   
  13. grid_hat = classifier.predict(grid_test)       # 预测分类值  
  14. grid_hat = grid_hat.reshape(x1.shape)  # 使之与输入的形状相同  

    这里用到了mgrid()函数,该函数的作用这里简单介绍一下:

   假设假设目标函数F(x,y)=x+y。x轴范围1~3,y轴范围4~6,当绘制图像时主要分四步进行:

  【step1:x扩展】(朝右扩展):

       [1 1 1]

   [2 2 2]

   [3 3 3]

  【step2:y扩展】(朝下扩展):

   [4 5 6]

   [4 5 6]

   [4 5 6]

  【step3:定位(xi,yi)】:

   [(1,4) (1,5) (1,6)]

   [(2,4) (2,5) (2,6)]

   [(3,4) (3,5) (3,6)]

  【step4:将(xi,yi)代入F(x,y)=x+y】

  因此这里x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j]后的结果为:

  

  再通过stack()函数,axis=1,生成测试点

  

    绘图:

[cpp]  view plain  copy
  1. plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light)     # 预测值的显示  
  2. plt.scatter(x[:, 0], x[:, 1], c=y[:,0], s=30,cmap=cm_dark)  # 样本  
  3. plt.scatter(test_data[:,0],test_data[:,1], c=test_label[:,0],s=30,edgecolors='k', zorder=2,cmap=cm_dark) #圈中测试集样本点  
  4. plt.xlabel('花萼长度', fontsize=13)  
  5. plt.ylabel('花萼宽度', fontsize=13)  
  6. plt.xlim(x1_min,x1_max)  
  7. plt.ylim(x2_min,x2_max)  
  8. plt.title('鸢尾花SVM二特征分类')  
  9. plt.show()  
           pcolormesh(x,y,z,cmap)这里参数代入x1,x2,grid_hat,cmap=cm_light绘制的是背景。

      scatter中edgecolors是指描绘点的边缘色彩,s指描绘点的大小,cmap指点的颜色。

      xlim指图的边界。

     pcolormesh(x,y,z,cmap)绘制的背景如下:即将坐标系下的点都进行一个分类。

[cpp]  view plain  copy
  1. plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light)     # 预测值的显示  

                

                所有样本点的分类结果:

                    

                将测试点从中圈出来:

                        


    完整代码如下:

[cpp]  view plain  copy
  1. # -*- coding:utf-8 -*-  
  2. """  
  3. @author:Lisa  
  4. @file:svm_Iris.py  
  5. @func:Use SVM to achieve Iris flower classification  
  6. @time:2018/5/30 0030上午 9:58  
  7. """  
  8. from sklearn import svm  
  9. import numpy as np  
  10. import matplotlib.pyplot as plt  
  11. import matplotlib  
  12. import sklearn  
  13. from sklearn.model_selection import train_test_split  
  14.   
  15. #define converts(字典)  
  16. def Iris_label(s):  
  17.     it={b'Iris-setosa':0, b'Iris-versicolor':1, b'Iris-virginica':2 }  
  18.     return it[s]  
  19.   
  20.   
  21. #1.读取数据集  
  22. path='F:/Python_Project/SVM/data/Iris.data'  
  23. data=np.loadtxt(path, dtype=float, delimiter=',', converters={4:Iris_label} )  
  24. #converters={4:Iris_label}中“4”指的是第5列:将第5列的str转化为label(number)  
  25. #print(data.shape)  
  26.   
  27. #2.划分数据与标签  
  28. x,y=np.split(data,indices_or_sections=(4,),axis=1) #x为数据,y为标签  
  29. x=x[:,0:2]  
  30. train_data,test_data,train_label,test_label =train_test_split(x,y, random_state=1, train_size=0.6,test_size=0.4) #sklearn.model_selection.  
  31. #print(train_data.shape)  
  32.   
  33. #3.训练svm分类器  
  34. classifier=svm.SVC(C=2,kernel='rbf',gamma=10,decision_function_shape='ovo') # ovr:一对多策略  
  35. classifier.fit(train_data,train_label.ravel()) #ravel函数在降维时默认是行序优先  
  36.   
  37. #4.计算svc分类器的准确率  
  38. print("训练集:",classifier.score(train_data,train_label))  
  39. print("测试集:",classifier.score(test_data,test_label))  
  40.   
  41. #也可直接调用accuracy_score方法计算准确率  
  42. from sklearn.metrics import accuracy_score  
  43. tra_label=classifier.predict(train_data) #训练集的预测标签  
  44. tes_label=classifier.predict(test_data) #测试集的预测标签  
  45. print("训练集:", accuracy_score(train_label,tra_label) )  
  46. print("测试集:", accuracy_score(test_label,tes_label) )  
  47.   
  48. #查看决策函数  
  49. print('train_decision_function:\n',classifier.decision_function(train_data)) # (90,3)  
  50. print('predict_result:\n',classifier.predict(train_data))  
  51.   
  52. #5.绘制图形  
  53. #确定坐标轴范围  
  54. x1_min, x1_max=x[:,0].min(), x[:,0].max() #第0维特征的范围  
  55. x2_min, x2_max=x[:,1].min(), x[:,1].max() #第1维特征的范围  
  56. x1,x2=np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j ] #生成网络采样点  
  57. grid_test=np.stack((x1.flat,x2.flat) ,axis=1) #测试点  
  58. #指定默认字体  
  59. matplotlib.rcParams['font.sans-serif']=['SimHei']  
  60. #设置颜色  
  61. cm_light=matplotlib.colors.ListedColormap(['#A0FFA0''#FFA0A0''#A0A0FF'])  
  62. cm_dark=matplotlib.colors.ListedColormap(['g','r','b'] )  
  63.   
  64. grid_hat = classifier.predict(grid_test)       # 预测分类值  
  65. grid_hat = grid_hat.reshape(x1.shape)  # 使之与输入的形状相同  
  66.   
  67. plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light)     # 预测值的显示  
  68. plt.scatter(x[:, 0], x[:, 1], c=y[:,0], s=30,cmap=cm_dark)  # 样本  
  69. plt.scatter(test_data[:,0],test_data[:,1], c=test_label[:,0],s=30,edgecolors='k', zorder=2,cmap=cm_dark) #圈中测试集样本点  
  70. plt.xlabel('花萼长度', fontsize=13)  
  71. plt.ylabel('花萼宽度', fontsize=13)  
  72. plt.xlim(x1_min,x1_max)  
  73. plt.ylim(x2_min,x2_max)  
  74. plt.title('鸢尾花SVM二特征分类')  
  75. plt.show()  
 -------------------------------------------        ------------------------------------------------

-------------------------------------------------------   附录   ----------------------------------------------

附录【1】:

    

    注意:  ||w||是指欧几里得范数,例,w=(w1,w2,…wn)的转置,  ||w||的求解如下:

        所以,的表达式如下:

        

附录【2

    凸函数:对区问 [α,b]上定义的函数 f,若它对区间[a,b]中任意两点X1,X2 均有

                   ,则称 f 为区间 [α , b]上的凸函数 。

    在凸集中任取两个点连成一条直线,这条直线上的点仍然在这个集合内部,如下图的左图。

    优点:凸函数局部最优就是全局最优,而右边的非凸函数的局部最优就不是全局最优了。

        

    (左为凸函数,右为非凸函数)

附录【3

    二次规划
    二次规划(Quadratic Programming,简称 QP)是一类典型的优化问题,包括凸二次优化和非凸二次优化。在此类问题中,目标函数是变量的二次函数,而约束条件是变量的线性不等式

    假定变量个数为d,约束条件的个数为m,则标准的二次规划问题形如:

        

    其中m为d维向量,为实对称矩阵,为实矩阵,和为实向量,Ax≤b的每一行对应一个约束。

    可能的情况有:

    (1)若Q为半正定矩阵,则式(B.12)目标函数是凸函数,相应的二次规划是凸二次优化问题,此时若约束条件Ax≤b定义的可行域不为空,且目标函数在此可行域有下界,则该问题将有全局最小值。

    (2)若Q为正定矩阵,则该问题有唯一的全局最小值。

    (3)若Q为非正定矩阵,则式(B.12)是有多个平稳点和局部极小点的NP难问题。
    常用的二次规划解法有椭球法(ellipsoid method)、内点法(interior point)、增广拉格朗日法 (augmented Lagrangian) 、梯度投影法 (gradient projeetion) 等。若Q为正定矩阵,则相应的二次规划问题可由椭球法在多项式时间内求解。

    注意:

    非标准二次规划问题中可以包含等式约束,注意到等式约束能用两个不等式约束来代替;不等式约束可通过增加松弛变量的方式转化为等式约束。

 -------------------------------------------         END      -------------------------------------

参考:

周志华《机器学习》

SVM-支持向量机原理详解与实践 https://www.cnblogs.com/spoorer/p/6551220.html

Python中的支持向量机SVM的使用(有实例) http://www.cnblogs.com/luyaoblog/p/6775342.html(非常好)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【机器学习】支持向量机SVM及实例应用 的相关文章

随机推荐

  • Cisco Packet Tracer 实验:生成树配置

    实验目的 1 理解广播风暴的成因 2 掌握STP和RSTP原理及配置方法 实验内容 实验描述 学校为了开展计算机教学和网络办公 建立的一个计算机教室和一个校办公区 这两处的计算机网络通过两台交换机互联组成内部校园网 为了提高网络的可靠性 作
  • Navicat Premium 连接 MySQL 8.0 报错“1251”分析解决

    人闲太久 努力一下就以为是在拼命 一 问题 Navicat Premium 连接 MySQL 8 0 报错 1251 Client does not support authentication protocol requested by
  • 如何自定义sort函数中的比较函数

    在做剑指offer时 有一道题 题目描述 输入一个正整数数组 把数组里所有数字拼接起来排成一个数 打印能拼接出的所有数字中最小的一个 例如输入数组 3 32 321 则打印出这三个数字能排成的最小数字为321323 思路 自定义比较器 若a
  • TensorFlow在MNIST中的应用-无监督学习-自编码器(autoencoder)和encoder

    参考 TensorFlow技术解析与实战 TensorFlow上实现AutoEncoder自编码器 前面讲到的都是有监督学习 他的重要特征是数据都是有标记的 无标记的数据应该用什么样的网络模型来学习呢 这里用一个叫做 自编码网络 的网络模型
  • 同步和异步的区别

    同步 进程之间的关系不是相互排斥临界资源的关系 而是相互依赖的关系 进一步的说明 就是前一个进程的输出作为后一个进程的输入 当第一个进程没有输出时第二个进程必须等待 具有同步关系的一组并发进程相互发送的信息称为消息或事件 其中并发又有伪并发
  • c语言如何判断数据是否符合正态分布_统计学-1:判断数据是否满足正态分布

    1 正态分布的定义 正态分布 The Normal Distribution 假设一随机变量X服从一个期望为 方差为 的正态分布 概率密度函数为 则可记为 import 1 正态分布为什么常见 真正原因是中心极限定理 Central Lim
  • Linux 的性能调优的思路

    Linux操作系统是一个开源产品 也是一个开源软件的实践和应用平台 在这个平台下有无数的开源软件支撑 我们常见的apache tomcat mysql等 开源软件的最大理念是自由 开放 那么Linux作为一个开源平台 最终要实现的是通过这些
  • offset client style 之间的区别

    offset 返回一个指向最近的 closest 指包含层级上的最近 包含该元素的定位元素 如果没有定位的元素 则 offsetParent 为最近的 table元素对象或根元素 标准模式下为 html quirks 模式下为 body 父
  • 【状态估计】电力系统状态估计的虚假数据注入攻击建模与对策(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 文献来源 文献分享阅读 我用夸克网盘分享了
  • mysql alter字段,mysql alter 语句用法,添加、修改、删除字段

    mysql alter 语句用法 添加 修改 删除字段 主键 alter table tabelname add new field id int 5 unsigned default 0 not null auto increment a
  • Spark报错解决:org.apache.spark.SparkException: Task failed while writing rows.at org.apache.spark.sql.ex

    文章目录 报错信息 解决方法 报错信息 报错信息很长 这里截取了最先的一个错误信息 发现是写入文件时出错 Caused by org apache spark SparkException Job aborted due to stage
  • 数仓 面试题(离线)实战解答

    无意间翻到以前的数仓面试题 今天把它整理出来 方便你我他 数仓分层 为什么要对数仓进行分层 1 说说对数据仓库的理解 数据仓库是面向主题进行组织的 数据是集成的 不可更新的 随时间变化的的 数据仓库经历了这样三个阶段 简单报表阶段 数据集市
  • Go语言中如何在range循环中修改数组/切片内容

    在go语言中 我们经常会使用到range来帮助我们遍历一些数据 通常情况下都是查看操作多一些 但是当我们需要对其原地址上的内容进行变更时 通常都是使用 for i 0 i
  • mac下统计代码行数方法

    使用cloc工具统计 1 首先在终端执行命令下载cloc brew install cloc 没有brew的先下载brew 这个后面写一个 这里先占位 2 cloc使用 进入想要查询的项目文件夹 然后执行下面的命令查询 cloc 如下图所示
  • 【深入理解C++】调用父类的拷贝构造函数

    文章目录 1 默认的拷贝操作 2 调用父类的拷贝构造函数 3 用子类对象初始化父类对象 1 默认的拷贝操作 默认情况下 继承体系下类对象的拷贝是每个成员变量逐个拷贝 include
  • 下采样方法

    AntiAliasInterpolation2d代码解读 注记 最近在看一些视频驱动的代码时 常见一种特殊的下采样方法 故在这里记录一下 Class AntiAliasInterpolation2d nn Module 初始化 def in
  • 两个有序序列的中位数 (25 分)

    已知有两个等长的非降序序列S1 S2 设计函数求S1与S2并集的中位数 有序序列A 0 A 1 A N 1 的中位数指A N 1 2 的值 即第 N 1 2 个数 A 0 为第1个数 输入格式 输入分三行 第一行给出序列的公共长度N 0
  • Hive 中常用的查询语句解读及应用(分组、Join、排序语句)

    文章目录 Hive 中常用的查询语句 2 分组 2 1 Group By 语句 2 2 Having 语句 3 Join 语句 3 1 等值 Join 3 2 表的别名 3 3 内连接 3 4 左外连接 3 5 右外连接 3 6 满外连接
  • mysql数据库使用between and 的不包含右边界问题

    最近在公司经常支持业务部门数据提取 遇到了一个提取时间间隔的问题 想到了between and比较方便 之前经常用这个关键字 但是从来没思考过它的边界问题 所以趁这次研究了一下 废话不多说 直接上例子 select from user se
  • 【机器学习】支持向量机SVM及实例应用

    机器学习 支持向量机 1 分类超平面与最大间隔 2 对偶问题与拉格朗日乘子法 3 核函数 4 软间隔与正则化 5 实例应用 python使用支持向量机SVM 准备 数据集 导入SVM模块 步骤 1 读取数据集 2 划分训练样本与测试样本 3