高斯判别分析GDA推导与代码实现
高斯判别分析GDA推导与代码实现
生成学习
处理分类问题,我们可以使用逻辑回归、Softmax。这两种方法都属于“判别学习”,也就是给定
GDA属于另一种方法——生成学习。在判别学习中,我们并不关注
高斯判别分析
作出的假设
首先假设
(尽管可以直接用协方差定义多元变量的高斯分布,但是这里采用另一种方法,在特殊的情况下得到等式而不需要完全理解协方差矩阵。)
然后假设给定
又
我们定义矩阵
同样,我们也假设
但是实际上GDA并没有假设
最大似然估计
在判别学习中,我们以
不同于逻辑回归,我们可以直接用导数为
计算
令上式为
计算
一些无关紧要的常数用
其中
则
令上式为
计算
下面用到了两个
; 。
同样地令上式为
注意到,按照我们的假设,
(以下仅是我个人的猜测)在GDA的实现中,我们并没有关注
代码实现
直接计算这几个参数的代码不需要解释:
Copym, n = xs.shape
# Calculate mu
self.mu = np.zeros((2, n))
classes_size = np.zeros(2)
for i in range(m):
self.mu[ys[i]] += xs[i]
classes_size[ys[i]] += 1
self.mu /= np.transpose([classes_size])
# Calculate Sigma
self.sigma = np.zeros((n, n))
for i in range(m):
temp_array = xs[i] - self.mu[ys[i]]
self.sigma += np.dot(temp_array.reshape(n, 1), temp_array.reshape(1, n))
self.sigma /= m
# Calculate phi
self.phi = np.sum(ys) / m
最后我们发现计算概率需要计算
最后我们对
但是实际上比较
(奇异矩阵的处理参考 https://blog.csdn.net/qq_30091945/article/details/81508055 ,对其中的 Gaussian 函数有修改)
最后是实现的一个类:
Copyclass GaussianDiscriminantAnalysis:
def __init__(self):
self.mu = None
self.phi = None
self.sigma = None
def fit(self, xs, ys, **others):
m, n = xs.shape
# Calculate mu
self.mu = np.zeros((2, n))
classes_size = np.zeros(2)
for i in range(m):
self.mu[ys[i]] += xs[i]
classes_size[ys[i]] += 1
self.mu /= np.transpose([classes_size])
# Calculate Sigma
self.sigma = np.zeros((n, n))
for i in range(m):
temp_array = xs[i] - self.mu[ys[i]]
self.sigma += np.dot(temp_array.reshape(n, 1), temp_array.reshape(1, n))
self.sigma /= m
# Calculate phi
self.phi = np.sum(ys) / m
def evaluate(self, x, mean, cov):
dim = np.shape(cov)[0]
# cov的行列式为零时的措施
cov_inv = np.linalg.inv(cov + np.eye(dim) * 0.001)
xdiff = (x - mean).reshape((1, dim))
# 概率密度
prob = np.exp(-0.5 * xdiff.dot(cov_inv).dot(xdiff.T))[0][0]
return prob
def predict(self, xs):
predict = []
for x in xs:
evaluate_0 = self.evaluate(x, self.mu[0], self.sigma) * (1 - self.phi)
evaluate_1 = self.evaluate(x, self.mu[1], self.sigma) * self.phi
if evaluate_0 > evaluate_1:
predict.append(0)
else:
predict.append(1)
return predict
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2021-02-27 「SOL」谢特(LOJ)