# 3.2 线性判别函数

## 3.2.1 线性判别函数

### 两类问题的判别函数

假设x是二维模式样本$$x=(x\_1\ x\_2)^T$$，模式的平面图如下：

![img](/files/kZOxJNPwpjuXpcV5XYou)

此时，分属于$$\omega\_1$$和$$\omega\_2$$两类的模式可以用一个直线方程进行划分：

$$
d(x) = w\_1x\_1 + w\_2x\_2 + w\_3 = 0
$$

其中，$$x\_1$$、$$x\_2$$称为<mark style="color:orange;">**坐标变量**</mark>，$$w\_1$$、$$w\_2$$、$$w\_3$$称为<mark style="color:orange;">**参数方程**</mark>，则将一个位置模式带入，有：

* 若$$d(x)>0$$，则$$x\in \omega\_1$$
* 若$$d(x)<0$$，则$$x\in \omega\_2$$

此处的$$d(x)=0$$就称为<mark style="color:orange;">**判别函数**</mark>

### 用判别函数进行分类的两个因素

* **判别函数的**<mark style="color:purple;">**几何性质**</mark>
  * 线性的
  * 非线性的
* **判别函数的**<mark style="color:purple;">**系数**</mark>：使用给定的模式样本确定判别函数的系数

### n维线性判别函数

一个n维线性判别函数可以写为：

$$
d(x)=w\_1x\_1 + w\_2x\_2 + \cdots + w\_nx\_n + w\_{n+1} = w\_0^Tx + w\_{n+1}
$$

其中，$$\boldsymbol{w}\_0=(w\_1,w\_2,\dots,w\_n)^T$$称为<mark style="color:orange;">**权向量**</mark>

此外，$$d(x)$$还可以写为：

$$
d(x)=w^Tx
$$

其中，$$\boldsymbol{x}=(x\_1,x\_2,\dots,x\_n,1)$$称为<mark style="color:orange;">**增广模式向量**</mark>，$$\boldsymbol{w}*0=(w\_1,w\_2,\dots,w\_n,w*{n+1})^T$$称为<mark style="color:orange;">**增广权向量**</mark>

## 3.2.2 线性判别函数的三种形式

### 一、$$\omega\_i\backslash\overline{\omega\_i}$$两分法

每条判别函数只区分是否属于某一类

![image-20230928113317386](/files/1tUt10Tq9Yz1E02POzCx)

上图中，白色区域为分类失败区域

* 将M分类问题分为M个单独的分类问题
* 需要M条线
* 不一定能够找到判别函数区分开其它所有类别

### 二、$$\omega\_i\backslash\overline{\omega\_j}$$两分法

每一条线分开两种类别

![image-20230928134949845](/files/SiX8FtCg2cfNa6mJCFh9)

### 三、类别1转化为类别2

可以通过以下方式将方式1的判别函数转化为方式2的：

$$
d\_{12}(x) = d\_1(x) - d\_2(x) = 0 \ d\_{13}(x) = d\_1(x) - d\_3(x) = 0 \ d\_{23}(x) = d\_2(x) - d\_3(x) = 0
$$

### 四、小结

* **线性可分**：模式分类若可以用任一<mark style="color:purple;">**线性函数**</mark>划分，则称这些模式是<mark style="color:orange;">**线性可分**</mark>的
* 一旦线性函数的系数$$w\_k$$被确定，则此函数就可以作为分类的基础
* 两种分类法的比较
  * 对于M分类，法一需要M个判别函数，法二需要$$\frac{M(M-1)}{2}$$个判别函数，因此当模式较多时，法二需要更多的判别函数
  * 但是对于法一而言，并不是每一种情况都是线性可分的，因此法二对模式是线性可分的概率比法一大

## 绘图代码

```python
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-5, 10, 100)

y1 = x
y2 = -x + 5
y3 = np.ones_like(x)

plt.plot(x, y1, label='$d_1(x)=-x_1+x_2 = 0$')
plt.plot(x, y2, label='$d_2(x)=x_1+x_2-5 = 0$')
plt.plot(x, y3, label='$d_3(x)=-x_2+1 = 0$')

plt.axhline(y=0, color='black', linestyle='--', linewidth=0.8)
plt.xlabel('$x_1$')
plt.ylabel('$x_2$')
plt.axvline(x=0, color='black', linestyle='--', linewidth=0.8)

plt.fill_between(x, y2, np.maximum(y1, y3), where=(x <= 2.5), color='blue', alpha=0.2)
plt.fill_between(x, y1, np.maximum(y2, y3), where=(x >= 2.5), color='orange', alpha=0.2)
plt.fill([-5, 1, 4, 10], [-5, 1, 1, -5], color='green', alpha=0.2)

plt.annotate('$\\omega_1$\n$d_1(x)>0$\n$d_2(x)<0$\n$d_3(x)<0$',
             xy=(-4, 6), xytext=(-4, 4), fontsize=12, color='black')
plt.annotate('$\\omega_2$\n$d_2(x)>0$\n$d_1(x)<0$\n$d_3(x)<0$',
             xy=(7, 6), xytext=(7, 3), fontsize=12, color='black')
plt.annotate('$\\omega_3$\n$d_3(x)>0$\n$d_1(x)<0$\n$d_2(x)<0$',
             xy=(-1, -4), xytext=(1, -4), fontsize=12, color='black')

plt.xlim(-5, 10)
plt.ylim(-5, 10)

plt.legend(loc='lower right')

plt.show()
```

```python
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-5, 10, 100)
y = np.linspace(-5, 10, 100)

y1 = x
y2 = -x + 5
x1 = np.full_like(y, 2)

plt.plot(x, y1, label='$d_{23}(x)=-x_1+x_2 = 0$')
plt.plot(x, y2, label='$d_{12}(x)=x_1+x_2-5 = 0$')
plt.plot(x1, y, label='$d_{13}(x)=-x_1+2 = 0$')

plt.axhline(y=0, color='black', linestyle='--', linewidth=0.8)
plt.xlabel('$x_1$')
plt.ylabel('$x_2$')
plt.axvline(x=0, color='black', linestyle='--', linewidth=0.8)

plt.fill_between(x, np.maximum(y1, y2), 10 * np.ones_like(x), color='blue', alpha=0.2)
plt.fill_between(x, y2, -5 * np.ones_like(x), where=(x <= 2), color='orange', alpha=0.2)
plt.fill_between(x, y1, -5 * np.ones_like(x), where=(x > 1.9), color='green', alpha=0.2)

plt.annotate('$\\omega_1$\n$d_{12}(x)>0$\n$d_{13}(x)>0$',
             xy=(-3, 2), xytext=(-3, 2), fontsize=12, color='black')
plt.annotate('$\\omega_2$\n$d_{32}(x)>0$\n$d_{12}(x)>0$',
             xy=(1, 6), xytext=(1, 5), fontsize=12, color='black')
plt.annotate('$\\omega_3$\n$d_{32}(x)>0$\n$d_{13}(x)>0$',
             xy=(6, 1), xytext=(6, 1), fontsize=12, color='black')

plt.xlim(-5, 10)
plt.ylim(-5, 10)
plt.grid(True)

plt.legend(loc='lower right')

plt.show()
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://aye10032.gitbook.io/prml-note/di-san-zhang-pan-bie-shi-fen-lei-qi/3.2-xian-xing-pan-bie-han-shu.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
