不使用sklearn实现线性判别分析
时间: 2023-08-12 15:31:22 浏览: 55
下面是一个使用numpy实现线性判别分析(LDA)的示例代码:
```python
import numpy as np
from sklearn.datasets import load_iris
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
# 计算每个类别的均值向量
mean_vectors = []
for cl in range(3):
mean_vectors.append(np.mean(X[y==cl], axis=0))
# 计算类内散布矩阵
S_W = np.zeros((4,4))
for cl, mv in zip(range(3), mean_vectors):
class_sc_mat = np.zeros((4,4))
for row in X[y == cl]:
row, mv = row.reshape(4,1), mv.reshape(4,1)
class_sc_mat += (row-mv).dot((row-mv).T)
S_W += class_sc_mat
# 计算类间散布矩阵
overall_mean = np.mean(X, axis=0)
S_B = np.zeros((4,4))
for i, mean_vec in enumerate(mean_vectors):
n = X[y==i,:].shape[0]
mean_vec = mean_vec.reshape(4,1)
overall_mean = overall_mean.reshape(4,1)
S_B += n * (mean_vec - overall_mean).dot((mean_vec - overall_mean).T)
# 计算特征值和特征向量
eigen_vals, eigen_vecs = np.linalg.eig(np.linalg.inv(S_W).dot(S_B))
# 对特征值进行排序
eigen_pairs = [(np.abs(eigen_vals[i]), eigen_vecs[:,i]) for i in range(len(eigen_vals))]
eigen_pairs = sorted(eigen_pairs, key=lambda k: k[0], reverse=True)
# 取前两个特征向量
w = np.hstack((eigen_pairs[0][1].reshape(4,1), eigen_pairs[1][1].reshape(4,1)))
# 将数据投影到新的特征空间
X_lda = X.dot(w)
# 输出结果
print(X_lda)
```
在这个示例中,我们加载了鸢尾花数据集,并计算了类内散布矩阵和类间散布矩阵。然后,我们计算了特征值和特征向量,并对特征值进行排序。我们取前两个特征向量,并将数据投影到新的特征空间。最后,我们输出降维后的结果。