python实现LDA降维,不适用上课sklearn库
时间: 2023-07-25 12:32:25 浏览: 93
实现LDA降维的过程一般分为以下几步:
1. 计算类内散度矩阵Sw和类间散度矩阵Sb;
2. 计算Sw的逆矩阵Sw_inv;
3. 计算矩阵Sw_inv*Sb的特征值和特征向量;
4. 选取最大的k个特征值所对应的特征向量组成投影矩阵W;
5. 对样本进行降维,即将样本点乘以投影矩阵W。
下面是一个简单的Python实现示例:
```python
import numpy as np
def lda(X, y, k):
"""
X: 数据集,每一行表示一个样本,每一列表示一个特征
y: 标签
k: 降维后的维数
"""
# 将样本按类别分组
groups = {}
for i in range(len(X)):
label = y[i]
if label not in groups:
groups[label] = []
groups[label].append(X[i])
# 计算类内散度矩阵Sw
Sw = np.zeros((X.shape[1], X.shape[1]))
for label, data in groups.items():
data = np.array(data)
mean = np.mean(data, axis=0)
for x in data:
x = x.reshape((-1, 1))
mean = mean.reshape((-1, 1))
Sw += (x - mean).dot((x - mean).T)
# 计算类间散度矩阵Sb
overall_mean = np.mean(X, axis=0)
Sb = np.zeros((X.shape[1], X.shape[1]))
for label, data in groups.items():
data = np.array(data)
mean = np.mean(data, axis=0)
mean = mean.reshape((-1, 1))
overall_mean = overall_mean.reshape((-1, 1))
Sb += len(data) * (mean - overall_mean).dot((mean - overall_mean).T)
# 计算Sw的逆矩阵Sw_inv
Sw_inv = np.linalg.inv(Sw)
# 计算矩阵Sw_inv*Sb的特征值和特征向量
eigvals, eigvecs = np.linalg.eig(Sw_inv.dot(Sb))
# 选取最大的k个特征值所对应的特征向量组成投影矩阵W
idx = np.argsort(-eigvals)
W = eigvecs[:, idx[:k]]
# 对样本进行降维
X_lda = X.dot(W)
return X_lda
```
这个函数的输入是数据集X、标签y和降维后的维数k,输出是降维后的样本矩阵X_lda。其中,计算类内散度矩阵Sw和类间散度矩阵Sb的过程比较复杂,需要分别对每个类别的样本求均值,然后计算类内散度矩阵和类间散度矩阵。计算Sw的逆矩阵Sw_inv也比较耗时,因此在实际应用中可能需要对Sw进行正则化处理。
阅读全文