机器学习-线性判别分析

1,介绍

线性判别分析(LDA):将数据投影到一条直线上,同类的点尽可能接近,异类点尽可能远离。

如下图:


直观的可以感觉有图分类比左图好。

2,瑞利商与广益瑞利商

瑞利商函数如下:


其有一个性质为即它的最大值等于矩阵AA最大的特征值,而最小值等于矩阵AA的最小的特征值,即:


而LDA中,我们假设

向量均值的表达式为:


协方差矩阵为:


欲使同类点尽可能进,则协方差须尽可能小,异类点尽可能远,则类中心距离尽可能大,可得:


由矩阵性质可知,在非零情况下,矩阵跟自己的转置相乘必为正定矩阵。可以令:



则上式重写为:


我们再令,,代入可得:


进而,我们相当于求矩阵的最大特征值,而对应的w就是其对应的特征向量。二类问题,我们可以确定的方向恒为,我们假设:,将其代入获得,从而获取

数据:

Idx,density,ratio_sugar,label
1,0.697,0.46,1
2,0.774,0.376,1
3,0.634,0.264,1
4,0.608,0.318,1
5,0.556,0.215,1
6,0.403,0.237,1
7,0.481,0.149,1
8,0.437,0.211,1
9,0.666,0.091,0
10,0.243,0.267,1
11,0.245,0.057,0
12,0.343,0.099,0
13,0.639,0.161,0
14,0.657,0.198,0
15,0.36,0.37,1
16,0.593,0.042,0
17,0.719,0.103,0

python代码:

import matplotlib.pyplot as plt
import numpy as np
import csv
import pandas as pd

def LoadDataSet():
    watermelon = pd.read_csv('watermelon_3a.csv', usecols=['density', 'ratio_sugar', 'label'])
    return watermelon


def calulateW(df):
    df1=df[df.label==1]                     #取label=1的数据(正类)
    df2=df[df.label==0]                     #取label=0的数据(负类)
    X1=df1.values[:,0:2]                    #取正类
    X0=df2.values[:,0:2]                    #取负类r
    mean1=np.array([np.mean(X1[:,0]),np.mean(X1[:,1])])  #取正类均值
    mean0=np.array([np.mean(X0[:,0]),np.mean(X0[:,1])])  #取负类均值
    m1=np.shape(X1)[0]
    sw=np.zeros(shape=(2,2))
    for i in range(m1):
        xsmean=np.mat(X1[i,:]-mean1)      #求正类的(x-u0)
        sw+=xsmean.transpose()*xsmean    #求正类的(x-u0)*(x-u0)^T
    m0=np.shape(X0)[0]
    for i in range(m0):
        xsmean=np.mat(X0[i,:]-mean0)      #求负类的(x-u1)
        sw+=xsmean.transpose()*xsmean    #求负类的(x-u1)*(x-u1)^T
    w=(mean0-mean1)*(np.mat(sw).I)
    return w

def plot(df,w):
    dataMat = np.array(df[['density', 'ratio_sugar']].values[:, :])
    labelMat = np.mat(df['label'].values[:]).transpose()
    m = np.shape(dataMat)[0]
    xcord1 = []
    ycord1 = []
    xcord2 = []
    ycord2 = []
    for i in range(m):
        if labelMat[i] == 1:
            xcord1.append(dataMat[i, 0])
            ycord1.append(dataMat[i, 1])
        else:
            xcord2.append(dataMat[i, 0])
            ycord2.append(dataMat[i, 1])
    plt.figure(1)
    ax = plt.subplot(111)
    ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
    ax.scatter(xcord2, ycord2, s=30, c='green')
    x = np.arange(-0.2, 1.0, 0.1)
    y = np.array((-w[0, 0] * x) / w[0, 1])
    plt.sca(ax)
    plt.plot(x, y)
    plt.xlabel('density')
    plt.ylabel('ratio_sugar')
    plt.title('LDA')
    plt.show()

if __name__ == '__main__':
    df = LoadDataSet()
    w = calulateW(df)
    plot(df,w)

获得的分类图形如下:


### 线性判别分析 (LDA) 的原理 线性判别分析(Linear Discriminant Analysis, LDA)是一种经典的监督学习方法,主要用于降维和分类任务。其核心目标是在保持类别可分性的前提下,尽可能减少数据维度[^2]。 #### 数学基础 LDA通过最大化类间方差与最小化类内方差来实现最佳投影方向的选择。具体来说,假设有一个 $d$ 维空间中的样本集 $\{x_i\}$,其中每个样本属于某个已知的类别标签 $y_i \in C_k$ ($k=1,\dots,K$ 表示共有 $K$ 类),则可以通过以下优化问题定义: $$ J(w) = \frac{w^T S_b w}{w^T S_w w} $$ 这里: - $S_b$: 类间散度矩阵,表示不同类别之间的差异程度; - $S_w$: 类内散度矩阵,表示同一类别内部样本间的差异程度。 最终的目标是最优权重向量 $w*$ 能够使得上述比率最大化的解法[^4]。 #### 应用场景 作为一种有效的特征提取工具,LDA广泛应用于多个领域,特别是在需要降低高维数据复杂度并保留重要信息的情况下尤为有用。以下是几个典型的应用实例: 1. **人脸识别**: 利用 Fisherfaces 方法改进传统的 Eigenfaces 技术,在面部图像处理方面取得了显著效果。 2. **文本挖掘**: 对于大规模文档集合而言,利用主题建模之外还可以借助 LDA 来发现潜在语义结构从而辅助聚类或者检索操作[^1]. 3. **生物医学工程**: 在基因表达数据分析过程中经常遇到超高维度的情况,此时采用 LDA 不仅能够有效筛选关键变量而且有助于提高诊断准确性. ```python from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA import numpy as np # 构造模拟数据 X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) y = np.array([0, 0, 0, 1, 1, 1]) lda_model = LDA() X_r2 = lda_model.fit(X, y).transform(X) print("Transformed Data:\n", X_r2) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值