支持向量機SVM


 

關於 SVM 的博客目錄鏈接,其中前1,2 兩篇為約束優化的基礎,3,4,5 三篇主要是 SVM 的建模與求解, 6 是從經驗風險最小化的方式去考慮 SVM。

1. 約束優化方法之拉格朗日乘子法與KKT條件

2. 格朗日對偶

3. 支持向量機SVM

4. SVM 核方法 

5. Sequential Minimal Optimization (SMO) 算法

6. 支持向量機之Hinge Loss 解釋

Introduction

支持向量機(Support Vector Machine,SVM)是定義在特征空間中的最大間隔線性分類器,對於非線性可分的數據,SVM引入核方法(kernel trick)使它實質上成為非線性分類器。SVM 有兩種解釋

  • 求解間隔最大的分類平面,這種情況可以轉化為一個求解凸二次規划的問題,一般轉換為對偶問題求解;
  • Hinge Loss,通過經驗風險最小化,采取 Hinge Loss 來求得損失函數,最終對損失函數求極值即可。

本文主要講解的是二次規划轉對偶求解的方式,Hinge Loss解釋參考支持向量機之Hinge Loss 解釋,下面步入正題,首先引入線性可分的概念。

線性可分

給定N個數據的集合 $\left \{ (x_i,y_i)\right \}_{i=1}^N $, 其中 $x_i \in \mathbb{R}^n$ 為樣本點, $y_i \in \mathbb{R}$為類標簽, 每個 $(x_i,y_i)$ 的組合為一個訓練樣例,線性可分意味着即存在一個超平面 $w \cdot x +b= 0$,可以將這兩類數據分開,使得超平面一邊的數據點所對應的標簽 $y$ 全是+1 ,另一邊對應的標簽 $y$ 全為-1。需要注意,當訓練數據線性可分時,存在無窮多超平面可以將兩類數據正確分開,SVM 的思想是利用幾何間隔最大來求解最優分類超平面,這個解是唯一的。

最大化幾何間隔

一般來說,訓練樣本距離分類超平面的遠近可以表示分類預測的確信程度,下圖中點 C 的類別為 -1 確信程度要明顯高於點 A 。 1

該確信程度可以用樣本到超平面的距離來表示,該距離便是常說的幾何距離(點到直線的距離)。樣本點 $x_i$  到分類平面 $w \cdot x_i +b= 0$ 的幾何距離如下所示:                 

\[\gamma_i = \frac{|w \cdot x_i +b|}{||w||}\]

分子要取絕對值,分母為 $L_2$ 范數: $||w|| = \sqrt{w_1^2 + w_2^2+...+w_n^2}$,訓練樣例中若 $w \cdot x_i +b> 0$  ,則對應的標簽為 $y_i = 1$ , 反之,若 $w \cdot x_i +b< 0$ ,則有 $y_i =-1$ ,所以將幾何間隔寫作如下形式:

\[\gamma_i = y_i \left (\frac{w }{||w||}x_i +\frac{b }{||w||}\right )\]

對於整個個訓練集的幾何距離,可表示為所有N個訓練樣本中的最小的幾何距離:

\[ \gamma = \min_{i = 1...N} \gamma_i\]

有了訓練數據的幾何間隔,根據最大間隔超平面思想,可以得到以下約束最優化問題:

\begin{aligned}
&\max_{w,b}\gamma \\
&s.t. \ \ y_i\left ( \frac{w}{||w||}\cdot x_i + \frac{b}{||w||} \right ) \ge \gamma, \ \ i = 1,2,...,N
\end{aligned}

約束條件的意思是使得訓練集合中所有樣本的幾何間隔至少要大於最小的幾何間隔 $\gamma$. 這里在引入一個邏輯概念,叫做函數間隔,樣本 $(x_i,y_i)$ 的函數間隔如下:

\[\gamma_i = y_i \left (w \cdot x_i+b \right )\]

進而可得整個數據集的函數間隔為:

\[\widehat{\gamma} = \min_{i=1...N} \widehat{\gamma}_i\]

與幾何間隔的關系分別由以下兩個公式給出: 

\[\gamma_i = \frac{\widehat{\gamma}_i}{||w||}, \ \  \gamma = \frac{\widehat{\gamma} }{||w||}\]

根據以上函數間隔,可以使用函數間隔代替幾何間隔來對 SVM 目標函數進一步化簡:

\begin{aligned}
&\max_{w,b} \frac{\widehat{\gamma }}{||w||} \\
&s.t. \ \ y_i\left ( w\cdot x_i + b \right ) \ge \widehat{\gamma }, \ \ i = 1,2,...,N
\end{aligned}

這里之所以引入函數間隔,是因為其可以自由縮放大小的,比如對於分類超平面 $w \cdot x +b= 0$ , 若左右同時擴大 $\lambda$ 倍,$\lambda w \cdot x +\lambda b= 0$ ,分類平面不會發生任何改變,但是對於點 $x_i$ 的函數間隔為:

\[\lambda \gamma_i = y_i \lambda \left (w \cdot x_i+b \right )\]

在函數間隔也擴大了 $\lambda$ 倍的情況下,分類超平面沒與幾何間隔卻沒變,所以並不會對我們的優化函數產生一絲影響,因為優化目標是最小化幾何間的,也就是說縮放分類超平面參數不會對最終的結果產生影響,所以可以令數據集的函數間隔 $\widehat{\gamma }$. 最終只需極大化:

\begin{aligned}
&\max_{w,b} \frac{ 1 }{||w||} \\
&s.t. \ \ y_i\left ( w\cdot x_i + b \right ) \ge 1, \ \ i = 1,2,...,N
\end{aligned}

以上極大不等式約束問題等價於以下極小凸二次規問題:

\begin{aligned}
&\min_{w,b} \frac{ 1 }{2}||w||^2 \\
&s.t. \ \ y_i\left ( w\cdot x_i + b \right ) \ge 1, \ \ i = 1,2,...,N
\end{aligned}

綜上,提煉出線性可分情況下 SVM 的學習算法,算法1.1

輸入:線性可分數據集 $\left \{ (x_i,y_i)\right \}_{i=1}^N$ .

  (1)構造約束最優化問題:

\begin{aligned}
&\min_{w,b} \frac{ 1 }{2}||w||^2 \\
&s.t. \ \ y_i\left ( w\cdot x_i + b \right ) \ge 1, \ \ i = 1,2,...,N
\end{aligned}

  (2)求解得到$w^*,b^*$,分類超平面即為 $w^* \cdot x+b^* = 0$

  (3)對於新的觀測數據 $x$  ,  根據 $f(x) = sign(w^* \cdot  x+b^*)$ 判斷其類別 $y$ 即可.

線性可分 SVM 中到分類超平面的距離為 $\frac{1}{||w||}$,因為之前我們在不影響結果的情況下,人為設定函數間隔$\widehat{\gamma}=1$,也就是說離超平面最近的點函數間隔為 1,這些點也就是之后要提到的支持向量。

轉化為對偶問題

本小節主要講解如何求解算法1.1中的不等式約束二次規划問題,二次規划是一個凸優化問題,求解該問題需要許多最優化算法的知識,之前寫過兩篇文章,算是 SVM 的基礎,只要這兩篇搞懂,SVM 就是浮雲,本節許多結論不去細說,均來自這兩篇文章,有看不明白的地方可以認真讀讀這兩篇文章:

這里將引入對偶問題來進行求解,關於對於偶問題與 KKT 條件在這里真的非常重要,而且在SVM中引入對偶的好處為:

  • 對偶問題必為凸優化問題.;
  • 對偶問題是原始問題的下界,當滿足一定條件,兩者等價;
  • 引入對偶問題之后,可以自然而然的引入核函數。

現在回到之前的優化目標,也即原始問題

\begin{aligned}
&\min_{w,b} \frac{ 1 }{2}||w||^2   \\
&s.t. \ \ – (y_i ( w\cdot x_i + b ) –1)\le 0, \ \ i = 1,2,...,N
\end{aligned}

這里把不等式約束優化寫成了常見的 $g(x) \le 0$ 的形式,接下來首先構造拉格朗日函數:

\[L(w,b,a) = \frac{1}{2} ||w||^2 - \sum_{i=1}^Na_i(y_i(w \cdot x_i+b) - 1)\]

接下來需要轉換為對偶問題求解,首先根據拉格朗日函數寫出一個原始問題,拉格朗日函數滿足如下性質:

\[ \max_{w,b}L(w,b,a) = \frac{1}{2}||w||^2\]

因為滿足約束時,拉格朗日函數的第二項是為 0 的,因此 SVM 的求解的原始問題的最優解 $p^*$ 為 :

\[p^* = \min_{a_i \ge 0} \max_{w,b}L(w,b,a)\]

對偶問題及其最優解 $d^*$ 為:

\[d^* =  \max_{w,b} \min_{a_i \ge 0}L(w,b,a) \]

由於對偶問題為原始問題的下界,即 $p^* \ge d^*$,而且原始問題是滿足 Salter 條件,也就是說:存在 $w^*,b^*,a^*$ 分別是原始問題與對偶問題的解, 且滿足:

\[p^* = d^* = L(w^*,b^*,a^*)\]

由於滿足 Salter 條件(即滿足強對偶),可知每對滿足原始問題與對偶問題的解都滿足 KKT 條件,即:

\begin{aligned}
&\nabla_wL(w^*,b^*,a^*) =w^* -\sum_{i=1}^Na_i^*y_ix_i =0 \\
&\nabla_bL(w^*,b^*,a^*) =-\sum_{i=1}^N a_i^*y_i =0 \\
&a_i^*(y_i(w^* \cdot x +b^*) -1) = 0 \\
&y_i(w^* \cdot x +b^*) -1 \ge 0 \\
&a_i \ge 0 , \ i = 1,2,...,N
\end{aligned}

這里至少存在一個 $a^*_j >0$,使得 $y_j(w \cdot x_j +b)-1 = 0$ ,這便是支持向量,然后根據 KKT 條件,可得:

\begin{aligned}
w^* &= \sum_{i=1} ^N a_i^* y_ix_i \\
b^* &= y_j - \sum_{i=1}^N a_i^* y_i(x_i \cdot x_j) \\
\end{aligned}

最后來理清思路,對於原始問題,首先構造容易求解的對偶問題,由於原始問題滿足 Slater 條件,可知強對偶性成立且原始問題與對偶問題有共同的最優解,根據強對偶性可知每對原始問題與對偶問題的最優解是滿足 KKT 條件的,求得對偶問題的解 $a^*$ 之后根據 KKT 條件便可得到 $w^*,b^*$, 而且對偶問題的解即為原始問題的解,要先從對偶問題下手:

\[\max_{w,b} \min_{a_i \ge 0}L(w,b,a)\]

1)min部分 :假定 $a$ 為定值,求解 $L(w,b,a)$ 關於 $w,b$ 的極小值,直接對 $w,b$ 求偏導即可:

\begin{aligned}
\frac{\partial L(w,b,a)}{\partial w} &= 0 \Rightarrow w - \sum_{i=1}^N a_iy_ix_i = 0 \\
\frac{\partial L(w,b,a)}{\partial b} &= 0 \Rightarrow  - \sum_{i=1}^N a_iy_i = 0
\end{aligned}

注意上式相當於產生一個約束條件 $\sum_i a_i y_i = 0$ ,將以上結果帶入 $L(w,b,a) $ 會有:112)max部分$\min$ 部分得到解之后,現在求關於 $a$ 的極大即可, 即現在的待優化函數 變為:

\begin{aligned}
&\max_{a_i \ge 0} \ -\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^Na_i a_jy_iy_j (x_i \cdot x_j) + \sum _{i=1}^Na_i\\
& \ s.t. \ \ \ \sum_{i=1}^N a_iy_i = 0
\end{aligned}

現在大功告成,只要求解對偶問題得到 $a^*$ ,然后根據 KKT 條件得到 $w^* ,b^*$ ,就可以完美的解得原始問題的最優解了,經過以上幾步,便得到了最終的線性可分支持向量機學習算法,算法1.2:

輸入:線性可分數據集 $\left \{ (x_i,y_i) \right \}_{i=1}^N$

  (1)構造約束最優化問題:

\begin{aligned}
&\max_{a_i \ge 0} \ -\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^Na_i a_jy_iy_j (x_i \cdot x_j) + \sum _{i=1}^Na_i\\
& \ s.t. \ \ \ \sum_{i=1}^N a_iy_i = 0
\end{aligned}

  (2)求解得到 $a^*= (a^*_1,a^*_2,…,a^*_N)^T$,求解一般采用SMO算法;  

  (3)根據之前的KKT 條件, $a^*$ 求得 $w^*,b^*$ ,首先選擇 $a^*_j > 0$ 的支持向量 $(x_j,y_j)$;

\begin{aligned}
w^* &= \sum_{i=1} ^N a_i^* y_ix_i \\
b^* &= y_j - \sum_{i=1}^N a_i^* y_i(x_i \cdot x_j) \\
\end{aligned}

  (4)求得超平面 $w^* \cdot x +b^* = 0$, 對於新的觀測數據 $x$ ,  根據 $f(x) = sign(w^* \cdot x +b^*)$ 判斷其類別 $y$.

這里順便明確給出支持向量的定義:根據KKT條件  $a_i^*(y_i(w^* \cdot x_i +b^*) -1) = 0$

  • $a_i^* >0$ 的樣本點 $(x_i,y_i)$ 即為間隔邊界上的支持向量,且 $y_i(w^* \cdot x_i + b^*) -1 = 0$ ;
  • 對於非支持向量,即 $y_i(w^* \cdot x_i+b^*) -1 >0$ ,一定有 $a_i = 0$.

至此,關於線性可分情況下的二分類 SVM 全部推到完成,但是有一個問題:當數據中存在一些異常值(outlier),去除這些 outlier 后數據是線性可分的,這種情況下要引入關於異常值的處理。

outlier 的處理

給定數據集 $\left \{ (x_i,y_i) \right \}_{i=1}^N$ ,當樣本數據大部分為線性可分的,存在少量異常值使得數據線性不可分,或者導致分離超平面被擠壓,可以通過一些方法仍然按照線性可分的方式處理,異常值的情況如下圖所示:

1 

以上情況意味着某些樣本點的函數間隔並不滿足大於 1 的要求。為了解決這個問題,為每個樣本引入一個松弛變量 $\xi _i  \ge 0$  , 使得函數間隔可以小於 1 ,即滿足 $y_i(w \cdot x_i +b) \ge 1 – \xi_i$ ,這里顯然 $\xi _i$ 不能任意大,因為那會導致任意樣本點都滿足要求,所以要把優化目標改成如下的形式:

\begin{aligned}
&\min_{w,b,\xi}\ \ \frac{1}{2}||w||^2 + C\sum_{i=1}^N \xi_i \\
&s.t. \ \ \ \ -y_i(w \cdot x_i + b) -\xi_i + 1\le 0, \ \ i = 1,2,...,N \\
&\ \ \ \ \ \  \ \ \ \ -\xi_i \le 0 ,\ \ i = 1,2,...,N
\end{aligned}

這里 $C >0$ 叫做懲罰參數,上述的不等式約束記做 $g(x) \le 0$ 的形式,同樣通過對偶的形式求解,首先構造拉格朗日函數:
\[L(w,b,\xi,a,\gamma) = \frac{1}{2}||w||^2 + C\sum_{i=1}^N \xi_i -\sum_{i=1}^N a_i(y_i(w \cdot x_i + b) - 1+ \xi_i) - \sum_{i=1}^N \gamma_i\xi_i\]

拉格朗日函數中的乘子 $a_i \ge 0$, 且  $\gamma_i \ge 0$ ,很明顯的有:

\[ \max_{w,b,\xi}L(w,b,\xi,a,\gamma) = \frac{1}{2}||w||^2 + C\sum_{i=1}^N \xi_i\]

因此原始問題轉化為:

\[ \min_{a,\gamma} \max_{w,b,\xi}L(w,b,\xi,a,\gamma) \]

對於上述問題應用對偶可得:

\[ \max_{a,\gamma} \min_{w,b,\xi} L(w,b,\xi,a,\gamma)\]

接下來求解對偶問題,對於極小部分的參數 $w,b,\xi_i$ 求導:

\begin{aligned}
&\nabla_wL(w,b,\xi,a,\gamma) = 0 \Rightarrow  w - \sum_{i=1}^Na_iy_ix_i = 0 \\
&\nabla_bL(w,b,\xi,a,\gamma) = 0 \Rightarrow  - \sum_{i=1}^Na_iy_i = 0 \\
&\nabla_{\xi}L(w,b,\xi,a,\gamma) = 0 \Rightarrow  C - a_i -\gamma_i = 0
\end{aligned}

將以上結果帶入對偶問題,極小部分便得到一個關於 $a$ 的函數:

\begin{aligned}
&\max_a \ \   -\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N a_ia_jy_iy_j(x_i \cdot x_j) + \sum_{i=1}^Na_i \\
&s.t. \ \ \ \ \  0 \le a_i \le C , \ i = 1,2,…,N\\
&  \ \ \ \ \ \ \ \ \ \sum_{i=1}^Na_iy_i = 0,\  i = 1,2,…,N
\end{aligned}

注意這里根據 $C – a_i – \gamma_i = 0$ 與 $\gamma_i \ge 0$ 消去了 $\gamma_i$ ,同樣由於原始問題滿足 Slater 條件,因此存在 $w^*, b^* ,\xi_i^*$ 為原始問題的解,$\gamma^* ,a^*$ 為對偶問題的解,且強對偶條件成立,並且每對解均滿足 KKT 條件:

\begin{align}
&\nabla_wL(w,b,\xi,a,\gamma) = 0 \Rightarrow  w - \sum_{i=1}^Na_iy_ix_i = 0 \\
&\nabla_bL(w,b,\xi,a,\gamma) = 0 \Rightarrow  - \sum_{i=1}^Na_iy_i = 0 \\
&\nabla_{\xi}L(w,b,\xi,a,\gamma) = 0 \Rightarrow  C - a_i -\gamma_i = 0 \\
&a_i^* (y_i(w^* \cdot x_i + b^*) -1 + \xi_i^*) = 0\\
&y_i(w^* \cdot x_i + b^*) -1 + \xi_i^* \ge 0\\
& \gamma_i^* \xi_i^* = 0\\
&a_i^* \ge 0 \\
&\xi_i^* \ge 0\\
&\gamma_i^* \ge 0\\
\end{align}

根據 KKT 條件,求得 $a^*$ 后,便可帶入求解 $w^*$ 與 $b^*$,首先由  KKT 條件 (1) 可得:

\[w^* = \sum_{i=1}^Na_i^*y_ix_i\]

根據 KKT 條件(3) (4) (6) (9)可知若 $\gamma_j^* >0$,則 $\xi_j^* = 0$ ,且存在 $0 < a_j^*< C$ ,使得:

\[y_j(w^* \cdot x_j + b^*) –1 = 0\]

因此便可求得 $b^*$ :

\[b^* = y_j – \sum_{i=1}^N y_ia_i^*(x_i \cdot x_j) \]

至此,可以總結出帶有異常值的線性可分 SVM 的算法1.3:

輸入:線性可分數據集 $\left \{ (x_i,y_i) \right \}_{i=1}^N$,數據集中伴有異常值

  (1)構造約束最優化問題:

\begin{aligned}
&\min_a \ \   \frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N a_ia_jy_iy_j(x_i \cdot x_j) - \sum_{i=1}^Na_i \\
&s.t. \ \ \ \ \  0 \le a_i \le C , \ i = 1,2,…,N\\
&  \ \ \ \ \ \ \ \ \ \sum_{i=1}^Na_iy_i = 0,\  i = 1,2,…,N
\end{aligned}

  (2)求解得到 $a^* = (a^*_1,a^*_2,…,a^*_N)$ ,求解一般采用SMO算法; 

  (3)根據 $a^* $ 得到 $w^*,b^*$ ,選擇滿足 $0 < a^*_j < C$ 的分量

\begin{aligned}
&w^* = \sum_{i=1}^Na_i^*y_ix_i\\
&b^* = y_j - \sum_{i=1}^N y_ia_i^*(x_i \cdot x_j)
\end{aligned}

  (4)求得超平面 $w^* \cdot x + b = 0 $, 對於新的觀測數據 $x$ ,  根據 $f(x) = sign(w^* \cdot x+b^*)$ 判斷其類別即可

下圖中實線為分離超平面,虛線為間隔邊界,且有間隔邊界與分離超平面的函數距離為1,幾何距離為 $1/||w||$。在線性不可分的情況下,求借得到 $a^* = (a^*_1,a^*_2,…,a^*_N)$ 的分量 $a_i^*$ 對應的樣本實例 $(x_i,y_i)$ 中的 $x_i$ 稱為支持向量,這時的支持向量要比線性可分復雜一些,如下圖的點,以下支持向量點到間隔邊界的幾何距離均已標注出為 $\xi_i/||w||$。這個幾何距離是這樣計算的,點 $x_i$ 到分離超平面的函數距離為 $y_i(w\cdot x_i+b) = 1- \xi_i$, 而分離超平面與間隔邊界的函數距離為 1 ,所以點 $x_i$  到間隔邊界的距離為 $1-(1- \xi_i)$ ,幾何距離只需除以 $||w||$ 即可得到結果。

1

可見這時候的支持向量或者分布在間隔邊界上,或者在間隔邊界與超平面之間,或者在分離超平面誤分的一側。 根據 KKT 條件可以得出一些很有意思的結論,當 $\gamma_i > 0 $ 時,根據 KKT 條件 (3) 可得 $C - a_i = \gamma_i >0$,即$ a_i <C$,又由於 $\gamma_i \xi_i = 0$可得 $\xi = 0$ ,根據 KKT 條件 (4) 可得 $a_i(y_i(w \cdot x +b) -1) = 0$ ,所以當 $0<a_i<C$ 時,可得$y_i(w \cdot x +b) =1$,這時樣本便為支持向量,且落在間隔邊界上;當 $a_i =0$ 時可得 $\xi_i = 0$ ,這時便為分類正確的且落在間隔邊界之后的點,至於$a_i = C$ 的情況,根據 $\xi_i$ 的不同取值,可分為不同的情況,總結起來便有:

當 $0 < a_i^* < C$ :

     $\xi_i = 0$      這是 $x_i$  為支持向量,且恰好落在間隔邊界上

若 $a_i^* = C$

     當 $0 < \xi_i < 1$ 時, 則分類正確 ,$x_i$ 落在間隔邊界與分離超平面之間 

     當  $\xi_i = 1$ 時,則 $x_i$ 在分離超平面上

     當 $\xi_i > 1$ 時 , 則 $x_i$ 位於分離超平面誤分的一側

至此,帶有異常值的非線性可分的情況也解決了,但是還需要注意的是數據集是完全非線性可分的。這時便需要引入核方法了。核方法並不是 SVM 的專利,其可以解決一系列機器學習問題。

至於 K 分類問題 (K>2) ,最簡單的方式便是 one-vs-all 的方法,如下圖所示,該方法共訓練 K 個分類器,對於待分類樣本點,分別使用這 K 個分類器進行分類,對於樣本 $x$ 分類的計算如下: $f(x)=sign(w \cdot x + b)$,若只有一個 +1 出現,則其為樣本對應類別 k ;但實際情況下構造的決策函數總是有誤差的,此時輸出不只一個 +1 (不只一類聲稱它屬於自己),或者沒有一個輸出為 +1 (即沒有一個類聲稱它屬於自己),這時比較則比較 $w \cdot x + b$ 輸出值,最大者對應類別為樣本 x 的類別 k 。

或者采用 LIBSVM 中 one-vs-one 的方法,其做法是在任意兩類樣本之間設計一個SVM,因此 k 個類別的樣本就需要設計 $k(k-1)/2$ 個SVM。當對一個未知樣本 進行分類時,最后得票最多的類別即為該未知樣本的類別。比如說 A,B,C 四類。在訓練的時候針對 (A,B) (A,C) (B,C) 所對應的樣本作為訓練集,然后得到六個模型,在測試的時候,對應的分別對三個模型進行測試,然后采取投票形式得到最后的結果,如下圖所示:

 再就是直接使用 Hinge Loss 進行多分類了,參考文章開頭給出的連接即可。

 

參考:

統計學習方法

約束優化方法之拉格朗日乘子法與KKT條件

拉格朗日對偶       這兩篇為個人博客中關於SVM的基礎

http://www.cnblogs.com/v-July-v/archive/2012/06/01/2539022.html  july

http://blog.pluskid.org/?page_id=683  pluskid

http://www.cnblogs.com/jerrylead/archive/2011/03/13/1982639.html jerrylead


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM