效果
数据来自iris数据集,数据集下载地址:
链接: https://pan.baidu.com/s/1DMp8paakuOgfWSX8YCGfsA 提取码: fmwx
数学原理
记某件事件发生为1,不发生为0,则有:
显然服从两点分布,其概率密度函数为:
那么事件发生的几率为:
为了映射到R范围,我们log一下:
假设在因素x的影响下呈线性分布(也可以假设其它,最终还是可以变换到线性的形式进行求解,此略),则有:
解得:
为了计算参数theta,我们把p代入概率密度函数f,并做极大似然估计:
也就是要求取在theta为何值时,lnL取最大值,以下采用梯度上升算法:
(注意:一般我们会先给theta一个初始值,比如置0或置1)
下面是计算过程:
用程序模拟此过程即可。
代码
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd;
#读取数据
data = pd.read_csv("iris.data", header=None)
data[4] = pd.Categorical(data[4]).codes;
data = data[data[4] != 2].to_numpy();
#函数
def cal(x, y, times = 1):
row, col = x.shape;
t = np.ones((row + 1, col))
t[1:3] = x;
theta = np.ones((1, row + 1))[0,:];
#学习率
alpha = 0.1;
#梯度上升(迭代1万次)
for n in range(10000):
delta = 0;
for i in range(col):
e_part = 1 / (1 + np.exp(- theta.dot(t[:, i])));
delta += (y[i] - e_part) * t[:, i];
theta += alpha * (delta)
return theta;
#画图
theta = (cal(data[:,0:2].T, data[:,4]));
plt.scatter(data[:,0], data[:,1], c = data[:, 4])
x1 = np.linspace(4.1,7, 2);
y1 = (- theta[0] - theta[1] * x1) / theta[2];
plt.plot(x1,y1)
plt.xlim(4,7.5);
plt.ylim(0,6);
plt.legend(np.arange(1,52,1))
plt.show()