精华内容
下载资源
问答
  • 简单的山寨QQ

    2014-05-19 18:49:21
    界面设计类似简单QQ界面,可以使用BorderLayout布局管理器,在上面(BorderLayou.NORTH)显示“好友列表”四个字,中间部分(BorderLayou.CENTER)显示自己的好友名单,名单可以用多个JLabel控件(JLabel中添加...
  • 1.qq好友界面作为主操作界面,从数据类中添加好友头像,好友名字等信息,点击主操作界面上的好友,能够打开聊天对话框类; 2.添加好友头像,好友名字等信息的行为是相同的,建立一个新的类,只需要留出接口即可; ....

     主要功能

    1.实现QQ好友界面;

    2.点击QQ好友图标,可以打开对应的聊天对话框;

    说明:聊天对话框的界面即为上次所描述的UDP的实现界面,略有改动;

     

    整体程序操作分析:

    1.qq好友界面作为主操作界面,从数据类中添加好友头像,好友名字等信息,点击主操作界面上的好友,能够打开聊天对话框类;

    2.添加好友头像,好友名字等信息的行为是相同的,建立一个新的类,只需要留出接口即可;

    3.聊天对话框类中,好友信息不一致以外,聊天的连接是一致的,同样可以留出接口,建立新的类;

     

    qq好友界面:

    1.目前分组是固定的;

    #include "drawer.h"
    #include<QGroupBox>
    #include<QVBoxLayout>
    #include<QHBoxLayout>
    #include<QPixmap>
    #include<QIcon>
    #include<QMouseEvent>
    #include<perinfo.h>
    #include<QDebug>
    #include<mychat.h>
    Drawer::Drawer()
    
    {
        setWindowTitle("QQ");
    
        QGroupBox  *groupBox1=new QGroupBox;
        QVBoxLayout *layout1 =new QVBoxLayout(groupBox1);
        layout1->setMargin(10);
        layout1->setAlignment(Qt::AlignLeft);
        layout1->addWidget(Getmodecontain());//
        layout1->addWidget(Getmodecontain());
        layout1->addStretch();
    
    
        QGroupBox *groupBox2=new QGroupBox;
        QVBoxLayout *layout2=new QVBoxLayout(groupBox2);
        layout2->setMargin(10);
        layout2->setAlignment(Qt::AlignLeft);
        layout2->addWidget(Getmodecontain());
        layout2->addWidget(Getmodecontain());
        layout2->addStretch();
    
        QGroupBox *groupBox3=new QGroupBox;
        QVBoxLayout *layout3=new QVBoxLayout(groupBox3);
        layout3->setMargin(10);
        layout3->setAlignment(Qt::AlignLeft);
        layout3->addWidget(Getmodecontain());
        layout3->addWidget(Getmodecontain());
        layout3->addStretch();
    
        resize(256,512);
        this->addItem((QWidget*)groupBox1,QIcon("right.png"),"我的好友");
        this->addItem((QWidget*)groupBox2,QIcon("right.png"),"陌生人");
        this->addItem((QWidget*)groupBox3,QIcon("right.png"),"黑名单");
    
    }
    
    
    MyChat* Drawer:: showchat(int index)  //点击得到index,给MyChat类
     {
        qDebug()<<"showchat:::"<<index;
        MyChat *chatDialog = new MyChat;   //创建聊天对话框
    
        chatDialog->setPerInfo(lst->per.at(index));
        chatDialog->show();
    
        return chatDialog;
    
     }
    
    perInfo* Drawer::Getmodecontain()   //创建好友(ToolButton)且写入相关信息
    {
    
    //    perList *lst=new perList;  //新建一个对象 ,lst中存放好友信息
           while(num_per<lst->perlist_size())
            {
               perInfo *person1=new perInfo;        
              person1->setpersonMessage((lst->per).at(num_per)); //得到每个结构体中的内容
    
              // qDebug()<<lst->per.at(num_per).name;//显示查看信息
               connect(person1,SIGNAL(myclicked(int)),this,SLOT(showchat(int)));
              num_per++;
              return person1;
            }
           return 0;  //不能丢
    }

    perInfo是一个基于QToolButton的类, Drawer是主界面,成员函数Getmodecontain()是指从链表中获取好友数量,将好友对应的信息加载到perInfo(实质上是含有好友信息的QToolButton)中,每一个都是新建的,被添加到不同的位置,就形成了 上面的qq界面

     

    showchat(int index)是槽函数,对应点击好友操作;

    2.perInfo类

    #include "perinfo.h"
    #include<QtDebug>
    #include<QMouseEvent>
    perInfo::perInfo()
    {
    
    }
    void perInfo:: setpersonMessage(PersonMessage person)//给ToolButton写入参数
    {
           {
               this->setText(person.name);
               this->setIcon((QPixmap(person.HeadImage)));
               this->setIconSize((QPixmap(person.HeadImage)).size());
               this->setAutoRaise(true);
               this->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
           }
             index=person.numer;
    }
    
    void perInfo::mousePressEvent(QMouseEvent *e) // 点击动作
    {
    
        if(e->button()==Qt::LeftButton)
        {
            qDebug()<<this->index;  //可以得到对应按钮的index,便于查看
        }
    }
    
    void perInfo::mouseReleaseEvent(QMouseEvent *e)  //发送
    {
        if(e->button()==Qt::LeftButton)
        {
    //        qDebug()<<this->index;  //可以得到对应按钮的index
           emit myclicked(index); //发送对应按钮的index
        }
    }

    成员函数 setpersonMessage(PersonMessage person)就是从链表中获取信息,写入ToolButton中;

     

    咳咳,写文的功底还是木有提高,希望每次都能进步,将自己所学的,所想表达的描述清楚,哈哈!qq功能持续更新中......

    
    

     

    转载于:https://www.cnblogs.com/whitewn/p/6839331.html

    展开全文
  • 简单代码变出超个性化的QQ昵称

    千次阅读 2017-11-12 15:05:00
    第一招、在QQ名字中加入表情: 我们可以通过在QQ名字中加入 /db 这种QQ表情启动命令来让自己的QQ名字变得很酷……但是有的需要很多字符才能完成一个表情的,在名字中加上这么多的字母也不好看。有没有更好的办法呢?...
    第一招、在QQ名字中加入表情:
      我们可以通过在QQ名字中加入 /db 这种QQ表情启动命令来让自己的QQ名字变得很酷……但是有的需要很多字符才能完成一个表情的,在名字中加上这么多的字母也不好看。有没有更好的办法呢?

      有的,我们可以利用一些特殊符号来实现,就是这个 。在文本形式下我们看起来它是一个黑点而已,但只要你将它复制到你QQ资料上,它就会以符号的形式出现的,然后利用它加上对应字母一样可以实现前面说的效果的,用这个办法可以帮大家节省QQ名字的空间,让自己中意的名字和好看的QQ表情结合,看起来更眩!

      第二招、不在聊天对话框留下时间和自己的QQ名字:
      大家也许和过一些人聊天,他们的记录上面都是聊天窗口不留下时间和QQ名字的,看起来就是像一个隐身人了,是不是觉得很酷呢...这也是通过特殊符号:  来实现的,在名字前加上 这个符号,就可以了。

      第三招、让自己的名字在好友名单上排名靠前:
      大家也许很希望自己的QQ在朋友里面是靠在最前面的,让他(她)能一眼就看见你的QQ了。

      也要用通过特殊字符来搞定,就是: 把这个字符加在你名字的前面就会使你的名字排在好友列表的前面咯。

      这样大家的QQ名字就可以变得更酷起来了,让别人也羡慕你有属于自己具有个性的QQ名。

      下面是QQ表情列表。找出你喜欢的表情加在自己的名字中,让自己的QQ名字变炫吧!

      只需要把前面的和字母复制到自己的名字中就可以了

      A /惊讶 1

      B /撇嘴 2

      C /色 3

      D /发呆 4

      E /得意 5

      F /流泪 6

      G /害羞 7

      H /闭嘴 8

      I /睡 9

      J /大哭 10

      K /尴尬 11

      L /发怒 12

      M /调皮 13

      N /呲牙 14

      O /微笑 15

      P /多多 81

      Q /美女 82

      R /汉良 83

      S /毛毛 84

      T /Q仔 85

      U /美眉 46

      V /飞吻 86

      W /找 45

      X /跳 44

      Y /闪人 41

      Z /发抖 42

      a /西瓜 90

      b /玫瑰 64

      c /凋谢 65

      d /吻 66

      e /爱心 67

      f /心碎 68

      g /蛋糕 54

      h /礼物 70

      i /下雨 91

      j /多云 92

      k /太阳 75

      l /雪人 93

      m /星星 94

      o /强 77

      p /弱 78

      q /女 95

      r /男 96

      s /难过 16

      t /酷 17

      u /非典 18

      v /抓狂 19

      w /吐 20

      x /惊恐 27

      y /流汗 28

      z /憨笑 29

      ` /酒杯 53

      ~ /小狗 49

      _ /汽水 89

      | /猪头 47

       /爱情 43

      [ /怄火 87

      ] /白酒 88

      { /大病 30

      } /猫咪 48

    本文转自 msc 51CTO博客,原文链接:http://blog.51cto.com/a/962



    展开全文
  • 原文链接:https://mp.weixin.qq.com/s/K1xjEaBMA2INQcRNwaz0jw 本文是《机器学习宝典》第 9 篇,读完本文你能够掌握机器学习中线性支持向量机模型。...这个名字会让初学者有很大的困惑,不理解...

    原文链接:https://mp.weixin.qq.com/s/K1xjEaBMA2INQcRNwaz0jw

    本文是《机器学习宝典》第 9 篇,读完本文你能够掌握机器学习中线性支持向量机模型。

    在前一篇 逻辑回归 中已经知道逻辑回归能够完成二分类,这篇文章介绍另外一个能够实现二分类的模型:支持向量机(support vector machine,SVM)。这个名字会让初学者有很大的困惑,不理解到底什么是所谓的"支持向量"。相信通过这篇文章后,你会明白这个名称的含义。

    从逻辑回归到支持向量机

    我们已经知道,将一个样本中的各个特征进行线性组合的结果是 $ \boldsymbol{\omega}^{T} \boldsymbol{x} + b$ ,它的取值范围是 (,+)(- \infty, +\infty) ,逻辑回归通过 sigmoid 函数 g(z)=11+ezg(z) = \frac{1}{1 + e^{-z}} 将线性组合的结果映射到 (0,1)(0, 1) ,映射后的结果认为是 y=1y=1 (正样本)的概率。仔细观察下逻辑回归的完整公式: fω,b(x)=g(ωTx+b)=11+e(ωTx+b)f_{\boldsymbol{\omega}, b}(\boldsymbol{x}) = g(\boldsymbol{\omega}^{T} \boldsymbol{x} + b) = \frac{1}{1 + e^{-(\boldsymbol{\omega}^{T} \boldsymbol{x} + b)}},我们能够发现,其实 fω,bf_{\boldsymbol{\omega}, b} 的结果只是与 $ \boldsymbol{\omega}^{T} \boldsymbol{x} + b$ 有关,sigmoid 函数 g(z)g(z) 的作用只是映射,如果 $ \boldsymbol{\omega}^{T} \boldsymbol{x} + b > 0$,则 fω,b(x)&gt;0.5f_{\boldsymbol{\omega}, b}(\boldsymbol{x}) &gt; 0.5,那么就认为该样本目标 y=1y=1;如果 $ \boldsymbol{\omega}^{T} \boldsymbol{x} + b < 0$,则 fω,b(x)&lt;0.5f_{\boldsymbol{\omega}, b}(\boldsymbol{x}) &lt; 0.5,那么就认为该样本目标 y=0y=0

    回过头仔细想下,逻辑回归其实是使用全部训练样本去学习参数 ω,b\boldsymbol{\omega}, b,尽可能使得学到的参数 ω,b\boldsymbol{\omega}, b 能够将正样本的特征的线性组合 $ \boldsymbol{\omega}^{T} \boldsymbol{x} + b$ 大于0,将负样本的特征的线性组合 $ \boldsymbol{\omega}^{T} \boldsymbol{x} + b$ 小于0。这么做的原因是因为逻辑回归借助了 sigmoid 函数 g(z)g(z),这样在它的的眼中,$ \boldsymbol{\omega}^{T} \boldsymbol{x} + b$ 越大于 0,属于正样本的概率就越高;越小于 0,属于负样本的概率就越高。

    进一步,如果我们将标签 y=0y = 0y=1y = 1 替换成 y=1y = -1y=1y = 1 ,同时映射函数 g(z)g(z) 不是 sigmoid 函数,而是下面这个函数:

    g(z)={1z01z&lt;0 g(z)= \begin{cases} 1&amp; z \geq 0 \\ -1&amp; z &lt; 0 \end{cases}

    那么我们可以认为,只要 fω,b(x)=ωTx+b0f_{\boldsymbol{\omega},b}(\boldsymbol{x}) = \boldsymbol{\omega}^{T} \boldsymbol{x} + b \geq 0,标签 y=1y = 1fω,b(x)=ωTx+b&lt;0f_{\boldsymbol{\omega},b}(\boldsymbol{x}) = \boldsymbol{\omega}^{T} \boldsymbol{x} + b &lt; 0,标签 y=1y = -1。由于一个超平面可以通过 ωTx+b=0\boldsymbol{\omega}^T \boldsymbol{x} + b = 0 来表示,所以可以认为我们找到了一个划分超平面,这个超平面能够将正负样本区分开。为了直观理解,下图是在二维空间中线性可分的情况下超平面划分样本的示意图(二维空间中,超平面会是一条直线)。

    在超平面 ωTx+b=0\boldsymbol{\omega}^T \boldsymbol{x} + b = 0 中,ω=(ω1,ω2,...,ωd)\boldsymbol{\omega} = (\omega_{1}, \omega_{2}, ..., \omega_{d}) 表示法向量,决定超平面的方向,bb 表示位移项,决定超平面与原点之间的距离。也就是说,参数 ω\boldsymbol{\omega}bb 共同决定了这个超平面。

    这里有个小问题:ω\boldsymbol{\omega} 为什么是超平面的法向量呢?可以这样证明,假设 x1,x2\boldsymbol{x}_{1}, \boldsymbol{x}_{2} 是该超平面上的两个点,则向量 ωT\boldsymbol{\omega}^T 和向量 x1x2\boldsymbol{x}_{1} - \boldsymbol{x}_{2} 的点积为:

    ωT(x1x2)=ωTx1ωTx2=(b)(b)=0 \boldsymbol{\omega}^T (\boldsymbol{x}_{1} - \boldsymbol{x}_{2}) = \boldsymbol{\omega}^T \boldsymbol{x}_{1} - \boldsymbol{\omega}^T \boldsymbol{x}_{2} = (-b) - (-b) = 0

    ω(x1x2)\boldsymbol{\omega} \perp (\boldsymbol{x}_{1} - \boldsymbol{x}_{2}) ,由于 (x1x2)//ωTx+b(\boldsymbol{x}_{1} - \boldsymbol{x}_{2}) // \boldsymbol{\omega}^T \boldsymbol{x} + b,所以 ω(ωTx+b)\boldsymbol{\omega} \perp (\boldsymbol{\omega}^T \boldsymbol{x} + b)

    支持向量机其实要做的就是找到这样一个划分超平面 (ω,b)(\boldsymbol{\omega}, b),能够在特征空间将两类样本分开,并且该超平面距离各样本最远。此外,相比于距离超平面较远的一些样本,我们更关心距离超平面较近的一些样本是否能被正确划分,这些距离焦平面较近的样本就是支持向量。也就是说,**支持向量机只是使用少量的训练样本(支持向量)来学习超平面参数 ω\boldsymbol{\omega}bb **。这是支持向量机与逻辑回归不一样的一个地方,因为逻辑回归是使用全部的训练样本学习参数 ω\boldsymbol{\omega}bb 。可以看出,支持向量机的思想是非常简单的。

    函数间隔与几何间隔

    我们已经知道,支持向量机要找的超平面需要在特征空间中距离各样本最远,那如何衡量远近呢?我们可以使用间隔来衡量。说到间隔,存在函数间隔几何间隔两种。

    我们先来说下函数间隔,当我们的超平面 ωTx+b=0\boldsymbol{\omega}^T \boldsymbol{x} + b = 0 确定后,我们定义一个样本的函数间隔为:

    γ^(i)=y(i)(ωTx(i)+b) \hat{\gamma}^{(i)} = y^{(i)}(\boldsymbol{\omega}^T \boldsymbol{x}^{(i)} + b)

    想一想,函数间隔 γ^\hat{\gamma} 有什么含义呢?其实我们可以通过它的正负性来判断分类是否正确。γ^\hat{\gamma} 如果大于等于 0 的话,说明分类正确;反之分类错误。

    如果特征空间线性可分,一定存在一个超平面将样本完全分类正确,那么这时候函数间隔 γ^\hat{ \gamma } 一定是大于等于 0 的。
    γ^(i)=ωTx(i)+b \hat{\gamma}^{(i)} = |\boldsymbol{\omega}^T \boldsymbol{x}^{(i)} + b|
    得到了一个样本的函数间隔,现在定义下在训练数据上的函数间隔:
    γ^=minγ^(i),i=1,2,&ThinSpace;,m \hat{\gamma} = \min \hat{\gamma}^{(i)}, \quad i=1,2, \cdots, m

    也就是说训练数据上的函数间隔就是训练数据中最小的一个训练样本的函数间隔。

    不过函数间隔有这样一个问题:**如果等比例的改变参数 ω\boldsymbol{\omega}bb,这时候超平面并没有发生改变,但是函数间隔却会发生改变。**比如将参数 ω\boldsymbol{\omega}bb 同时乘以 2,函数间隔也会变为之前的 2 倍。

    为了解决上面的问题,我们引入了几何间隔的概念。一个样本的几何间隔的表示如下:

    γ~(i)=ωTx(i)+bω \tilde{\gamma}^{(i)} = \frac{|\boldsymbol{\omega}^T \boldsymbol{x}^{(i)} + b|}{\Vert \boldsymbol{\omega} \Vert}

    可以看到,几何间隔表示的就是空间中的点 x\boldsymbol{x} 到超平面的距离。如何证明呢?其实 x\boldsymbol{x} 到超平面的距离其实等于 x\boldsymbol{x} 与超平面上某点 x0\boldsymbol{x}_{0} 连线向法向量 ω\boldsymbol{\omega} 的投影:

    KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ proj_{\boldsym…

    由于 γ^(i)=y(i)(ωTx(i)+b)\hat{\gamma}^{(i)} = y^{(i)}(\boldsymbol{\omega}^T \boldsymbol{x}^{(i)} + b) ,所以:
    γ~(i)=γ^(i)ω \tilde{\gamma}^{(i)} = \frac{\hat{\gamma}^{(i)}}{\Vert \boldsymbol{\omega} \Vert}

    也就是说,几何间隔就是将函数间隔对 ω\boldsymbol{\omega} 做了归一化。类似的,所有训练数据上的几何间隔就是训练数据中最小的一个训练样本的几何间隔:
    γ~=minγ~(i),i=1,2,&ThinSpace;,m \tilde{\gamma} = \min\tilde{\gamma}^{(i)}, \quad i=1,2, \cdots, m

    最大间隔分类器

    了解了间隔之后,SVM 要做的就是找到一个划分超平面,使得距离超平面最近的样本能有更大的间隔。间隔表示距离划分超平面最近的样本到划分超平面几何间隔的两倍。即间隔 γ\gamma 定义如下:
    γ=2γ~=2γ~ω \gamma = 2\tilde{\gamma} = 2\frac{\tilde{\gamma}}{\Vert \boldsymbol{\omega} \Vert}
    想要找到具有最大间隔的划分超平面,也就是找到满足下面公式中约束的参数 ω\boldsymbol{\omega}bb ,使得 γ\gamma 最大,即
    KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ & \max_{\bolds…

    为了求解方便,我们将全局函数间隔 γ^=1\hat{\gamma} = 1 (稍后解释下为什么可以这样做),这样目标函数就变为了:
    KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ & \max_{\bolds…

    从下图可以直观的看到间隔的含义,也就是两条虚线间隔边界之间的距离,虚线间隔边界的满足 y(ωTx+b)=1y(\boldsymbol{\omega}^T \boldsymbol{x} + b) = 1 , 在虚线间隔边界上的样本点就是支持向量支持向量的含义是说超平面的参数 ω\boldsymbol{\omega}bb 仅由支持向量决定,与其他样本无关。

    由于求 2ω\frac{2}{\Vert \boldsymbol{\omega}\Vert} 最大值等价于求 12ω2\frac{1}{2} \Vert \boldsymbol{\omega} \Vert ^{2} 最小值,因此目标函数可以进一步改写:
    KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ & \min_{\bolds…

    得到目标函数之后,回过头来解释下前面令全局函数间隔 γ^=1\hat{\gamma} = 1 的可行性。假设全局的函数间隔是在样本点 xjx^{j} 处取得的,即 γ^=yj(ωTxj+b)\hat{\gamma} = y^{j}(\boldsymbol{\omega}^T \boldsymbol{x}^{j} + b) ,那么目标函数为:
    KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ & \max_{\bolds…
    如果将超平面的参数 ω\boldsymbol{\omega}bb 乘以一个大于 0 的系数 kk,超平面没有发生变化,只是函数表示形式变为了 (kωTx+kb)=0(k \boldsymbol{\omega}^T \boldsymbol{x} + k b) = 0,这时候全局的函数间隔依然是在样本点 xjx^{j} 处取得,只是变为了原来的 kk 倍数,即 γ^=yj(kωTxj+kb)\hat{\gamma} = y^{j}(k \boldsymbol{\omega}^T \boldsymbol{x}^{j} + k b),那么这时候的目标函数为:
    KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ & \max_{\bolds…
    化简后与上面的目标函数是等价的,也就是说收缩函数间隔,对目标函数求解没有影响。

    原始问题与对偶问题

    前面已经得到了最大间隔分类器的目标函数,这是一个典型的带不等式约束的二次规划求解问题。这时我们可以通过一些优化的计算包来求解,不过借助拉格朗日 (Lagrange) 函数和对偶问题(dual problem), 我们可以将问题更加简化。

    首先,可以将目标函数进行变形,得到:
    KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ & \min_{\bolds…

    根据拉格朗日乘子法,对不等式的约束条件增加拉格朗日乘子 α\boldsymbol{\alpha} ,则该问题的拉格朗日函数为:
    L(ω,b,α)=12ω2+i=1mαi(1y(i)(ωTx(i)+b)) L(\boldsymbol{\omega}, b, \boldsymbol{\alpha}) = \frac{1}{2} \Vert \boldsymbol{\omega} \Vert^{2} + \sum_{i=1}^{m} \alpha_{i} (1 - y^{(i)}(\boldsymbol{\omega}^T \boldsymbol{x}^{(i)} + b))
    其中 $\alpha_{i} \ge 0 $。

    这样上面的目标函数(原始问题)的优化就等价于:
    KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ & \min_{\bolds…
    为什么能够等价呢?当原始问题的约束条件不满足时,即 1y(i)(ωTx(i)+b)&gt;01 - y^{(i)}(\boldsymbol{\omega}^T \boldsymbol{x}^{(i)} + b) &gt; 0 ,我们令 $\alpha_{i} = +\infty $,使得 $ \alpha_{i} (1 - y{(i)}(\boldsymbol{\omega}T \boldsymbol{x}^{(i)} + b) = +\infty $ ,这时 minω,bmaxαL(ω,b,α)\min\limits_{\boldsymbol{\omega}, b} \max\limits_{\boldsymbol{\alpha}} L(\boldsymbol{\omega}, b, \boldsymbol{\alpha}) 无解;当原始问题的约束条件满足时,即 1y(i)(ωTx(i)+b)01 - y^{(i)}(\boldsymbol{\omega}^T \boldsymbol{x}^{(i)} + b) \le 0, 由于 αi0\alpha_{i} \ge 0,则 $ \alpha_{i} (1 - y{(i)}(\boldsymbol{\omega}T \boldsymbol{x}^{(i)} + b) \le 0 $ ,这时 minω,bmaxαL(ω,b,α)=minω,b12ω2\min\limits_{\boldsymbol{\omega}, b} \max\limits_{\boldsymbol{\alpha}} L(\boldsymbol{\omega}, b, \boldsymbol{\alpha}) = \min\limits_{\boldsymbol{\omega}, b} \frac{1}{2} \Vert \boldsymbol{\omega} \Vert ^{2}

    进一步,我们可以得到原始问题的对偶问题:
    KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ & \max\limits_…
    默认情况下,对偶问题的最优解是原始问题的最优解的下界,即:
    maxαminω,bL(ω,b,α)minω,bmaxαL(ω,b,α) \max\limits_{\boldsymbol{\alpha}} \min_{\boldsymbol{\omega}, b} L(\boldsymbol{\omega}, b, \boldsymbol{\alpha}) \le \min\limits_{\boldsymbol{\omega}, b} \max_{\boldsymbol{\alpha}} L(\boldsymbol{\omega}, b, \boldsymbol{\alpha})

    这个性质叫做弱对偶性(weak duality),对于所有优化问题都成立,即使原始问题非凸。与弱对偶性相对应的有一个强对偶性(strong duality) ,如果满足强对偶性,对偶问题的最优解与原始问题的最优解相同。也就是说,在强对偶性成立的前提下,可以通过求解对偶问题的解来得到原始问题的解。

    那么什么条件下满足强对偶性呢?一种情况是如果满足 Slater 条件,对偶问题等价于原始问题。Slater 条件是说如果原始问题是凸优化问题, 且可行域中至少有一
    点使不等式约束严格成立
    (不等式约束严格成立是说要将不等式严格到不能取等号,在这里就是只能取小于号)。由于原始问题中 12ω2\frac{1}{2} \Vert \boldsymbol{\omega} \Vert^{2} 为凸函数,并且存在一些样本点使得 1y(i)(ωTx(i)+b)&lt;01 - y^{(i)}(\boldsymbol{\omega}^T \boldsymbol{x}^{(i)} + b) &lt; 0 ,所以满足强对偶性。需要说明的是,Slater 条件成立只是满足强对偶性的一种情况,并非是唯一的情况。

    在强对偶性满足的情况下,会有以下性质(KKT条件):
    KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ & 1. \quad 主问题…
    由于对偶问题公式中的内层对 ω\boldsymbol{\omega}bb 的优化属于无约束优化问题,所以可以通过令偏导等于 0 来求出 ω\boldsymbol{\omega}bb 的最优值。
    L(ω,b,α)ω=0ω=i=1mαiy(i)x(i)L(ω,b,α)b=0i=1mαiy(i)=0 \frac{\partial L(\boldsymbol{\omega}, b, \boldsymbol{\alpha})}{\partial \boldsymbol{\omega}} = 0 \Rightarrow \boldsymbol{\omega} = \sum_{i=1}^{m} \alpha_{i}y^{(i)}\boldsymbol{x}^{(i)} \\ \frac{\partial L(\boldsymbol{\omega}, b, \boldsymbol{\alpha})}{\partial b} = 0 \Rightarrow \sum_{i=1}^{m} \alpha_{i}y^{(i)} = 0

    这样,将上面的两个式子带入到 L(ω,b,α)L(\boldsymbol{\omega}, b, \boldsymbol{\alpha})
    L(ω,b,α)=i=1mαi12i=1mj=1mαiαjy(i)y(j)(x(i))Tx(j) L(\boldsymbol{\omega}, b, \boldsymbol{\alpha}) = \sum_{i=1}^{m} \alpha_{i} - \frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m} \alpha_{i}\alpha_{j}y^{(i)}y^{(j)}(\boldsymbol{x}^{(i)})^{T}\boldsymbol{x}^{(j)}

    对偶问题最后可以转为:
    KaTeX parse error: No such environment: alignat at position 8: \begin{̲a̲l̲i̲g̲n̲a̲t̲}̲{2} \max_{\…

    求解出 α\boldsymbol{\alpha} 之后,即可求出最优的 ω\boldsymbol{\omega}bb 即可得到线性支持向量机的表达形式:
    KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ f_{\boldsymbol…
    那如何求解最优的 bb 呢?我们可以根据距离超平面最近的正样本的函数间隔等于距离超平面最近的负样本的函数间隔来求出截距 bb
    b=maxi:y(i)=1wTx(i)+mini:y(i)=1wTx(i)2 b^{\ast} = - \frac{\max_{i:y^{(i)}=-1} {w^{\ast}}^T x^{(i)} + \min_{i:y^{(i)}=1} {w^{\ast}}^T x^{(i)}} {2}

    根据上面的两个式子以及 KKT 中的互补松弛条件可知,如果 αi=0\alpha_{i} = 0,则该样本不会对 $f_{\boldsymbol{\omega},b}(\boldsymbol{x}) $ 有任何影响;如果 αi&gt;0\alpha_{i} &gt; 0,那么 1y(i)(ωTx(i)+b)=01 - y^{(i)}(\boldsymbol{\omega}^T \boldsymbol{x}^{(i)} + b) = 0,即 y(i)(ωTx(i)+b)=1y^{(i)}(\boldsymbol{\omega}^T \boldsymbol{x}^{(i)} + b) = 1也就是说线性支持向量机中, αi&gt;0\alpha_{i} &gt; 0 的样本是支持向量,这些支持向量都落在了最大间隔边界上。

    从前面可以看到,只要从对偶问题中求解出 α\boldsymbol{\alpha} ,就能够求出我们需要的超平面,关于 α\boldsymbol{\alpha} 的求解可以有很多种算法,针对该问题有一种高效求解的算法:序列最小优化算法(Sequential minimal optimization, SMO)。关于该算法的细节,有兴趣的同学可以自己学习下。

    参考:

    1. 周志华.机器学习.第六章(支持向量机)
    2. 深入浅出ML之Kernel-Based家族
    3. 从零推导支持向量机(SVM)
    4. 支持向量机通俗导论(理解SVM的三层境界)
    5. 拉格朗日对偶性
    展开全文
  • VC 仿QQ的服务端和客户端源程序,源代码关键字:服务器绑定套接字函数、定义结构体变量、定义主机名字符串、指定套接字版本、初始化套接字库、创建套接字、定义地址结构变量、获得主机名字、从主机名获取主机地址、...
  • 1、使用旧版本QQ,不要升级(将QQ文件夹下4个更新相关的文件用同名空文本替换,我用的是英文版QQ,不记得那几个文件名字了,可以找google,baidu打听一下) 2、使用英文版QQ 3、使用WEB QQ 转载于:...

    个人经验,仅供参考:

    1、使用旧版本QQ,不要升级(将QQ文件夹下4个更新相关的文件用同名空文本替换,我用的是英文版QQ,不记得那几个文件名字了,可以找google,baidu打听一下)

    2、使用英文版QQ

    3、使用WEB QQ

    转载于:https://www.cnblogs.com/riverback-moon/archive/2010/11/03/1868410.html

    展开全文
  • 初学者不是很明白,用的是servlet+jsp+mysql希望大神指教, 需要显示点赞人的名字,还要有点赞的数量显示,太头疼了,大大大大神帮帮忙吧。![图片说明]...
  • 利用腾讯在线状态的html网址,得到指定QQ的图像,CSDN上有人说要用GDI+分析图像,我发现那 是大炮打蚊子。...enum EStatus //看名字应该知道啥意思吧? { EStatus_Null, EStatus_NoInternet, EStatus
  • 你也可以取别的名字,记住后缀名一定要是.bat,ok!你的QQ强制聊天工具就这样制作成功了! 双击它就能和任何陌生人聊天,包括由于骚扰把你加入黑名单的家伙。============就是下面的文字(这行不用复制)==
  •  * 程序功能:简单的签到程序,能够保存签到后的结果  * 作者:丁又专  * 时间:2014.03.02  * QQ:303727350  */ import java.io.File; import java.io.FileNotFoundException; import java.io....
  • 2012简单文章系统 1.2

    2021-03-25 10:45:59
    请修改数据库名字并修改admin文件夹内conn.asp数据库路径。 2012简单文章系统1.2更新说明: 对比以前版本,修正了二级目录不能正常使用的错误。 数据库兼容旧版本,直接覆盖文件就可以,当然覆盖前先备份旧数据库。 ...
  • Git简单命令

    2018-12-16 09:16:52
    我的名字和Email $ git config --global user.name “mxb” $ git config --global user.email "1151745765@qq.com" 一创建版本库及其相关操作 1.mkdir learngit 创建一个叫learngit的版本库 2.cd ...
  • 简单的快捷操作

    2019-08-17 19:10:27
    前提说明:该文章是笔者无聊之际所写,旨在娱乐自我的同时也想分享给大家一些电脑简单、“装逼”的快捷操作,也可令您的电脑桌面看起来更干净一些。 1、在D盘建一个文件夹,命名为quickstart或者你喜欢的名字 2、...
  • 有些朋友可能会发现,有些微信好友的名字里面带有一些小图标,就想QQ好友的名字里面带有表情一样。这是怎么加上去的呢?  其实很简单,只是输入法的表情符号而已。  1、在iPhone上找到“设置”-> 通用 -...
  • 最最简单的安卓定向浏览器开发实例,源码开放,极为简单,有wap手机版网站的仅需修改网址就可以使用,换个logo和名字,就等于有个手机版APP一样;当然了;只是最简单的;你的手机商城怎么样子,他就显示怎么样子,...
  • Android对现有的apk进行修改(汉化,修改QQ尾巴)

    千次阅读 多人点赞 2012-02-24 11:58:17
    我们可以用压缩软件把apk打开,对一些apk进行简单的修改,比如说替换掉里面的原有图片,换成自己喜欢的(ps:图片名字必须一样),对一些国外的软件进行汉化,然后在利用辅助软件对修改过的apk进行再次签名就OK了。...
  • 今个在爬qq音乐排行榜歌的时候遇到个难题,文件名里有非法字符造成程序错误,其实使用正则表达式很好解决,但是我学艺不精,怎么也表达不好,造成其他歌曲的名字少字符或是别的情况,其实只需要用到re.sub()的一个...
  • c语言实现qq刷屏

    2020-07-28 19:45:07
    今天看到一篇博客,很简单地实现了qq刷屏 正好在学c语言,先码住 来源https://blog.csdn.net/qq_43622870/article/details/105643739 但好像次数没法控制 #include<stdio.h> #include<Windows.h> int ...
  • 请修改数据库名字并修改 admin 文件夹内 conn.asp 数据库路径。 2012简单文章系统 1.2 更新说明: 对比以前版本,修正了二级目录不能正常使用的错误。 数据库兼容旧版本,直接覆盖文件就可以,当然覆盖前先备份...
  • Spring AOP的最简单实现

    2018-12-20 14:20:15
    上篇已经debug源码一步一步去了解了AOP是如何实现的,有兴趣的可以戳: ...下面给出一个Spring AOP的.xml文件模板,名字叫做aop.xml,之后的内容都在aop.xml上进行扩展: &lt;?xml version="1....
  • 简单实用博客

    2008-05-26 14:54:07
    ) <br>5,为了防止恶意利用邮件发送程序,请将javamail.jsp文件名更改,然后打开class.jsp,查找"javamail.jsp"并替换您更改的名字。 <br>6, 若需要皮肤,可以进http://www.kanglog.com下载。 <br>7,使用请...
  • Why Smart Pointer? 为什么需要智能指针?因为c++的内存管理一直是个...假如我们有如下person对象:每个person有自己的名字,并且可以告诉大家他叫什么名字 http://blog.csdn.net/qq_17242957/article/details/52404271
  • 简单的git push 命令: 新建一个空文件夹new 在文件夹内 打开git bash git clonehttps://git.weixin.qq.com/xxx/xxxxxxx.git (在克隆下来的文件内进行更改) cd/"已经克隆下的文件夹名字" git add . git ...
  • What Music简单的全网音乐播放器

    千次阅读 2018-06-26 23:23:50
    最近一直忙于工作和毕业的事情之间奔波,收货了很多东西...简单的介绍一下这个小项目吧,目前的功能:网易、QQ、酷狗音乐的热门排行榜、歌单以及搜索功能。 实例地址:music.bzqll.com 直接上图吧 排行榜 歌单...
  • 作为一名PHPer,了解一下C还是有必要的,只是做一个简单的了解,因为并没有做开发C的想法。 关于typedef的详细说明,网上搜过了很多帖子,这篇算是最详细的了:...
  • 一次简单的社工

    2019-09-26 21:06:39
     有名字,有QQ,有支付宝账号  可以,支付宝申请修改密码。会发现身份证号,但是只有首位和末尾,没问题,根据首为确定了五个省级单位  继续,查找QQ,发现空间没锁,在说说里发现了一个人与他交流提到了:回到*...
  • 一些简单的操作社工

    千次阅读 2020-02-26 14:03:46
    1.通过支付宝实名支付看看能不能找到名字(一个人最多10次) 2.通过REG007 用手机号查询你注册过的网站 3.手机号添加qq或者微信好友进行信息收集通过其他渠道(微博、贴吧进行信息的收集)如果收集到了姓名通过一些...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 391
精华内容 156
关键字:

qq名字简单