type
status
date
slug
summary
tags
category
icon
password
一、线性判别函数
前置理论学习
本部分学习了周志华老师《机器学习》的3.4 线性判别分析。
线性判别分析的基本思想是将数据集投影到一条直线上,使得同类样本的投影点尽可能接近,不同类样本的投影点尽可能疏远。
按此原理训练完成之后,将新样本投影到该直线上,根据投影点的位置来确定新样本点的类别。LDA的优化目标就是使投影后的类内距离小,类间距离大。
设直线的表达式为,此处为样本向量(列向量),为投影后的样本点。
设两类样本的中心点分别为, ,则他们在直线上的投影应为, ;若将所有的样本点都投影到直线上,则两类样本的协方差分别为,
协方差可以反映多维样本分布的离散程度(一维样本使用方差) 协方差越大(对于负相关来说是绝对值越大),表示数据的分布越分散。
欲使同类样例的投影点尽可能接近,可以让同类样本点的协方差矩阵尽可能小,即尽可能小;欲使异类样例的投影点尽可能远离,可以让类中心之间的距离尽可能大,即尽可能大,则可以得到欲最大化的目标:
定义类内散度矩阵
类间散度矩阵
则我们就可以将上述的优化目标重写为:
通过求解广义特征值问题,得到最优投影方向: 这个解使得目标函数J(w)达到最大值。
实践
- 问题分析
使用
np.unique(y)
得知y只有0和1两种取值,因此本实验要求实现的是使用线性判别函数做二分类。- 读入数据
- 实现LDA类
- 分类结果可视化
- main函数
- 结果
训练集准确率: 0.9718

二、最大似然估计
前置理论学习
似然函数:
概率是在已知参数的情况下,发生观测结果可能性大小
似然性则是从观测结果出发,分布函数的参数为的可能性大小
最大似然函数:
基本思想时对于给定的观测数据,找到参数使得L的值为最大,即
求解最大值是通过求梯度为0来解得
对于连续性随机变量,其均值和方差的最大似然估计量为:
实践
- 读入数据
- 编写程序,对类 1 和类 2 中的三个特征x_i分别求解最大似然估计的均值和方差
类1:
均值:
x1 -0.0709
x2 -0.6047
x3 -0.9110
dtype: float64
方差:
x1 0.906177
x2 4.200715
x3 4.541949
dtype: float64
类2
均值: x1.1 -0.11260
x2.1 0.42990
x3.1 0.00372
dtype: float64
方差:
x1.1 0.053926
x2.1 0.045970
x3.1 0.007266
dtype: float64
- 编写程序,处理二维数据的情形。对类 1 和类 2 中任意两个特征的组合分别求解最大似然估计的均值和方差(每个类有3种可能)
类1
特征组合 (0, 1):
均值: [-0.0709 -0.6047]
协方差矩阵:
[[0.90617729 0.56778177]
[0.56778177 4.20071481]]
特征组合 (0, 2):
均值: [-0.0709 -0.911 ]
协方差矩阵:
[[0.90617729 0.3940801 ]
[0.3940801 4.541949 ]]
特征组合 (1, 2):
均值: [-0.6047 -0.911 ]
协方差矩阵:
[[4.20071481 0.7337023 ]
[0.7337023 4.541949 ]]
类2
特征组合 (0, 1):
均值: [-0.1126 0.4299]
协方差矩阵:
[[ 0.05392584 -0.01465126]
[-0.01465126 0.04597009]]
特征组合 (0, 2):
均值: [-0.1126 0.00372]
协方差矩阵:
[[ 0.05392584 -0.00517993]
[-0.00517993 0.00726551]]
特征组合 (1, 2):
均值: [0.4299 0.00372]
协方差矩阵:
[[0.04597009 0.00850987]
[0.00850987 0.00726551]]
- 编写程序,处理三维数据的情形。对类 1 和类 2 中三个特征求解最大似然估计的均值和方差。
类1:
均值:
x1 -0.0709
x2 -0.6047
x3 -0.9110
dtype: float64
协方差矩阵:
[[0.90617729 0.56778177 0.3940801 ]
[0.56778177 4.20071481 0.7337023 ]
[0.3940801 0.7337023 4.541949 ]]
类2:
均值:
x1.1 -0.11260
x2.1 0.42990
x3.1 0.00372
dtype: float64
协方差矩阵:
[[ 0.05392584 -0.01465126 -0.00517993]
[-0.01465126 0.04597009 0.00850987]
[-0.00517993 0.00850987 0.00726551]]
- 假设该三维高斯模型是可分离的,即,编写程序估计类 1 和类 2 中的均值和协方差矩阵中的参数。
类1
均值:
x1 -0.0709
x2 -0.6047
x3 -0.9110
dtype: float64
协方差矩阵:
[[0.90617729 0. 0. ]
[0. 4.20071481 0. ]
[0. 0. 4.541949 ]]
类2
均值:
x1.1 -0.11260
x2.1 0.42990
x3.1 0.00372
dtype: float64
协方差矩阵:
[[0.05392584 0. 0. ]
[0. 0.04597009 0. ]
[0. 0. 0.00726551]]
- 比较前 4 种方法计算出来的每一个特征的均值的异同,并加以解释。
单变量的最大似然估计直接对每个特征独立计算均值
二维数据MLE,需要求每对特征的联合均值
三维数据MLE,需要求全部(三维)特征的联合均值
可分离MLE也是对每个特征独立计算均值
但无论是哪种方法,计算均值的公式均为,所以每个特征的均值完全相同
- 比较前 4 种方法计算出来的每一个特征的方差的异同,并加以解释。
单变量MLE只考虑单个特征的方差
二维MLE包含特征对之间的协方差
三维MLE包含所有特征的完整协方差矩阵
可分离MLE的协方差矩阵对角线元素与单变量相同,非对角线为0
这主要区别在于是否要考虑特征间的相关性,单变量和可分离MLE方法忽略特征相关性,而二维三维方法保留了特征间的协方差信息,所有的对角线元素计算方法结果相同
三、非参数估计
前置理论学习
在之前的学习中,我们总是假设概率密度函数的参数形式已知,并在此条件下处理有监督学习过程。而在现实世界中,我们给出的概率密度函数很少符合实际情况,非参数化方法可以处理任意的概率分布而不必假设密度的参数形式已知。
既然实际没有给出概率密度函数,那我们可以从训练样本中来估计类条件概率密度
概率密度的估计
对于一个极小的区域,向量落在区域内的概率为
为落在中的随机变量的数目,满足二项式分布
根据上面两个式子可以推导出(为区域中样本的确切数量)
Parzen窗
用窗函数(window function)估计概率密度的方法就是Parzen窗法
指的是根据某一个确定的体积函数,即确定,来逐渐收缩一个给定的初始区间。
k近邻方法
指的是确定,这烟花体积必须逐渐生长直至最后能包含进的个相邻点
实践
Parzen窗
使用表 2-3中的数据或者使用 exp2_3.xlsx 中的数据进行Parzen窗估计和设计分类器。窗函数为一个球形的高斯函数如公式 2-1所示:
- 编写程序,使用 Parzen 窗估计方法对任意一个的测试样本点x进行分类。对分类器的训练则使用表2-2中的三维数据。令h = 1,分类样本点为 (0.5, 1.0, 0.0)T, (0.31, 1.51, -0.50)T, (-0.3, 0.44, -0.1)T 。
结果:
Parzen窗分类结果(h=1):
样本点 1: [0.5 1. 0. ]
类别概率密度: 类1=0.1259, 类2=0.4711, 类3=0.3980
预测类别: 类2
样本点 2: [ 0.31 1.51 -0.5 ]
类别概率密度: 类1=0.1534, 类2=0.4828, 类3=0.2260
预测类别: 类2
样本点 3: [-0.3 0.44 -0.1 ]
类别概率密度: 类1=0.1399, 类2=0.3783, 类3=0.1823
预测类别: 类2
k近邻方法
对表 2-3表格中的数据使用k-近邻方法进行概率密度估计:
- 编写程序,对于一维的情况,当有 n 个数据样本点时,进行k-近邻概率密度估计。对表格中的类1的特征,用程序画出当k=1,3,5 时的概率密度估计结果。

- 编写程序,对于二维的情况,当有 n 个数据样本点时,进行k-近邻概率密度估计。对表格中的类2的特征(x2, x3)T,用程序画出当 k=2,4,6 时的概率密度估计结果。

- 编写程序,对表格中的3个类别的三维特征,使用k-近邻概率密度估计方法。并且对下列点处的概率密度进行估计:(−0.52,0.92,0.92)T,(0.24,0.88,4.2)T,(-0.91,0.72, -0.41)T。
三维k近邻密度估计结果(k=5):
测试点 1: [-0.52 0.92 0.92]
类1密度: 0.002668318641806267,
类2密度: 0.03304159635170967
类3密度: 0.02202491201922557
预测类别: 类2
测试点 2: [0.24 0.88 4.2 ]
类1密度: 0.0009595721553856204,
类2密度: 0.0014526158389256152
类3密度: 0.002463011790092871
预测类别: 类3
测试点 3: [-0.91 0.72 -0.41]
类1密度: 0.0019150394229232078,
类2密度: 0.038940001775203584
类3密度: 0.008501964843000545
预测类别: 类2
四、KNN实战
需要用学过的 KNN 方法来构建一个分类器,判断一个样本所属的类别
(一)数据预处理
数据集存放在 exp2_4.txt 中,共有 1000 条数据,其中,前三列是样本数据,最后一列是样本标签。
- 将 e2.txt 中的数据处理为模型对应数据格式
- 是否需要对特征值进行归一化处理? 目的是?
需要归一化处理,此处采用了最小归一化处理
通过观察我们可以发现x1、x2、x3三个特征的范围差距很大,使用归一化可以消除特征量纲差异,以避免大数值特征主导距离计算,提升模型的收敛速度和准确率。
(二)数据可视化分析
将预处理好的数据以散点图的形式进行可视化(使用不同颜色区分类别),通过直观感觉总结规律,感受 KNN 模型思想与人类经验的相似之处。

(三)构建 KNN 模型并测试
- 输出测试集各样本的预测标签和真实标签,并计算模型准确率。
由于数据集的划分会导致结果具有一定随机性,某一次结果如下:
3 0.9567
4 0.9633
5 0.9667
6 0.9600
7 0.9567
8 0.9633
9 0.9633
- 选择哪种距离更好?欧氏还是马氏?
70%-30%
euclidean距离结果:
k=3: 0.9567
k=4: 0.9600
k=5: 0.9533
k=6: 0.9500
k=7: 0.9500
k=8: 0.9533
k=9: 0.9500
manhattan距离结果:
k=3: 0.9633
k=4: 0.9567
k=5: 0.9600
k=6: 0.9600
k=7: 0.9533
k=8: 0.9633
k=9: 0.9667
80%-20%
euclidean距离结果:
k=3: 0.9500
k=4: 0.9500
k=5: 0.9600
k=6: 0.9550
k=7: 0.9600
k=8: 0.9600
k=9: 0.9600
manhattan距离结果:
k=3: 0.9500
k=4: 0.9500
k=5: 0.9450
k=6: 0.9500
k=7: 0.9500
k=8: 0.9550
k=9: 0.9500
欧氏距离,马氏距离结果波动较大
- 改变数据集的划分(如 70%-30%,80%-20%)以及 k 的值,观察模型准确率随之的变化情况。
随着k值增大,准确率会增大,增大到某个值后保持稳定
测试集占比越多,准确率会越高(80%-20%准确率高于70%-30%)
(四)使用模型构建可用系统
利用构建好的 KNN 模型实现系统,输入为新的数据的三个特征,输出为预测的类别。
生成的随机特征值: [0.98996023 0.32235384 0.80987445]
预测结果: smallDoses
- Author:Rainnn
- URL:https://blog.rainnn.top//article/1d3eefba-b209-80ae-965e-ec0cb5e84edb
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!