gda算法numpy代码复现
时间: 2023-05-17 10:00:57 浏览: 122
GDA算法即为高斯判别分析算法,是一种机器学习方法,旨在通过对样本数据的高斯分布进行分析,对数据进行分类。在代码实现方面,可以使用Python的numpy库来进行复现。
首先,我们需要构建一个符合高斯分布的数据集。假设我们要生成两个类别的数据,每个类别包含100个样本,每个样本有两个特征,可以使用如下代码:
import numpy as np
mean1 = np.array([0, 0])
mean2 = np.array([1.5, 1.5])
cov = np.array([[1, 0.5], [0.5, 1]])
data1 = np.random.multivariate_normal(mean1, cov, 100)
data2 = np.random.multivariate_normal(mean2, cov, 100)
将数据集分为训练集和测试集,并计算每个类别的先验概率、均值和协方差矩阵:
train_X = np.vstack((data1[:70], data2[:70]))
train_y = np.vstack((np.zeros((70, 1)), np.ones((70, 1))))
test_X = np.vstack((data1[70:], data2[70:]))
test_y = np.vstack((np.zeros((30, 1)), np.ones((30, 1))))
p1 = len(train_X[train_y == 0]) / len(train_X)
p2 = len(train_X[train_y == 1]) / len(train_X)
mean1 = np.mean(train_X[train_y == 0], axis=0)
mean2 = np.mean(train_X[train_y == 1], axis=0)
cov1 = np.cov(train_X[train_y == 0].T)
cov2 = np.cov(train_X[train_y == 1].T)
计算协方差矩阵在GDA算法中很重要,需要注意对每个类别单独计算。接下来,定义GDA分类器:
def gaussian(x, mean, cov):
d = len(mean)
dev = x - mean
return (1.0 / (np.sqrt((2 * np.pi) ** d * np.linalg.det(cov)))) * np.exp(-0.5 * np.dot(np.dot(dev.T, np.linalg.inv(cov)), dev))
def predict(x):
g1 = np.log(p1) + np.log(gaussian(x, mean1, cov1))
g2 = np.log(p2) + np.log(gaussian(x, mean2, cov2))
return int(g1 < g2)
对于一个测试集中的样本,输入到predict函数中即可以得到预测的类别。在测试集上计算分类正确率:
correct = 0
for i in range(test_X.shape[0]):
if predict(test_X[i]) == test_y[i]:
correct += 1
accuracy = correct / test_X.shape[0]
print('Test Accuracy:', accuracy)
GDA算法的代码实现也可以通过sklearn库中的GaussianNB类来实现,但通过自己的代码实现可以清晰地了解算法原理。
阅读全文