机器学习:线性判别分析

介绍

在本实验中,你将实现线性判别分析。实验之前需要上传图片:LDA_figure.png至默认路径。

评分标准如下:

1 计算每类均值

在该部分实验中,为实现线性判别分析,首先需要计算每类样本的均值。

# 引入所需要的库文件
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os

%matplotlib inline
# 创建仿真数据集
X = np.array([[4,2], [2,4], [2,3], [3,6], [4,4], [9,10], [6,8], [9,5], [8,7], [10,8]])
y = np.hstack((np.zeros(5), np.ones(5)))
X= X.T
#可视化
plt.figure()

colors = ["red", "blue"]
classes = ["class 1", "class 2"]

for color, i in zip(colors, [0, 1]):
    plt.scatter(
        X[0, y == i],  X[1, y == i], alpha=0.8, color=color, label=classes[i]
    )
plt.legend(loc="best", shadow=False, scatterpoints=1)
plt.title("Simulation data of 2 classes")

plt.grid(linestyle='--')
plt.show()

1 计算每类均值

在该部分实验中,为实现线性判别分析,首先需要计算每类样本的均值。

**要点 1:** 计算每类样本的均值,并合并为矩阵:[u_0,u_1]。 如果结果为

[[3 8.4][3.8 7.6]]则计算通过。

# ====================== 在这里填入代码 ======================= 
def ClassMean(X, y):
    X0 = X[:,y==0]
    X1 = X[:,y==1]
    # 计算每类样本的均值
    mean0 = np.mean(X0, axis=1)
    mean1 = np.mean(X1, axis=1)
    # 合并每类均值为一个矩阵
    class_means = np.vstack((mean0, mean1)).T
    return class_means
# ============================================================= 
class_means=ClassMean(X, y)
print('类均值矩阵:\n',class_means)
# print(class_means)

**要点 2:** 计算类内散度矩阵,公式如下

S_W=\sum_0+\sum_1

其中\sum_0\sum_1为两类样本的协方差矩阵。 如果结果为[[13.2 −1.2][−1.2  22]]则计算通过。

# ====================== 在这里填入代码 ======================= 
def ScatterWithin(X, y):
    X0 = X[:, y == 0]
    X1 = X[:, y == 1]
    m0 = np.mean(X0, axis=1).reshape(-1, 1)
    m1 = np.mean(X1, axis=1).reshape(-1, 1)
    y0 = (X0 - m0) @ (X0 - m0).T
    y1 = (X1 - m1) @ (X1 - m1).T
    Sw = y0 + y1
    return Sw
# ============================================================= 
Sw=ScatterWithin(X, y)
print('类内散度矩阵:\n',Sw)

**要点 3:** 计算类间散度矩阵,公式如下

S_b=(u_0-u_1)(u_0-u_1)^T

其中u_0u_1为两类样本的均值向量。 如果结果为[[29.16 20.52]20.52 14.44]]则计算通过。

# ====================== 在这里填入代码 ======================= 
def ScatterBetween(X, y):
    m0 = np.mean(X[:, y == 0], axis=1).reshape(-1, 1)
    m1 = np.mean(X[:, y == 1], axis=1).reshape(-1, 1)
    Sb = (m0 - m1) @ (m0 - m1).T
    return Sb
# ============================================================= 
Sb=ScatterBetween(X, y)
print('类间散度矩阵:\n',Sb)

**要点 4:** 实现线性判别分析,计算投影向量w和投影后数据Z。 如果w结果为

[0.9

10.42]

Z结果为[4.47,3.49,3.07,5.23,5.3,12.35,8.79,10.27,10.19,12.43]则计算通过。

# ====================== 在这里填入代码 ======================= 
def LDA(X, y):
    Sw = ScatterWithin(X, y)
    Sb = ScatterBetween(X, y)
    eig_vals, eig_vecs = np.linalg.eig(np.linalg.inv(Sw) @ Sb)
    w = eig_vecs[:, np.argmax(eig_vals)]
    Z = X.T @ w
    return w, Z
# ============================================================= 
w,Z=LDA(X, y)
print('投影向量:\n',np.around(w,decimals=2))
print('投影后数据:\n',np.around(Z,decimals=2))

**要点 5:** 可视化投影结果.

w,Z=LDA(X,y)
plt.figure()
colors = ["red", "blue"]
classes = ["class 1", "class 2"]
projections=["class 1 projections","class 2 projections"]
for color, i in zip(colors, [0, 1]):
    plt.scatter(X[0,y==i], X[1,y == i], alpha=0.8, color=color, label=classes[i])
    plt.scatter(Z[y == i],Z[y==i]*w[1]/w[0], alpha=0.8, color=color, marker='^',label=projections[i])
    
plt.plot([0, w[0]*12], [0, w[1]*12], color='green', label='Projection vector')
plt.legend(loc="best", shadow=False, scatterpoints=1)
plt.title("LDA of 2 classes")
plt.grid(linestyle="--")
plt.show()

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值