Scikit Learn Perceptron处理1D向量阈值恒为0、收敛异常问题
感知机仿真实验相关问题咨询
我正在开展仿真实验,设置真实总体为两类正态分布数据,二者均值均为0、标准差均为4000,计划使用感知机(Perceptron)研究样本量与过拟合程度的关联。实验过程中发现,即便每类仅抽取10个样本(直观判断该场景下分类阈值不应为0),感知机总会在6次迭代后收敛,且分类阈值始终为0。现咨询三个问题:
- 为何分类阈值始终固定为0?
- 除了下方代码中的实现方式,是否存在更合理的阈值输出方法?
- 我选用感知机是希望采用结构最简单的分类器,是否有更简单易用的分类器可供选择?
备注:在完全相同的调用方式下,逻辑回归(Logistic Regression)可以输出非0的分类阈值。
实验实现代码
import numpy as np mu, sigma = 0, 4000 # 均值和标准差 pop_size=int(1e4) p1 = (np.random.normal(mu, sigma, pop_size)) p2 = (np.random.normal(mu, sigma, pop_size)) # 每组抽取n个样本并绘制在同一张图中 def sample_pop(n): s1 = np.random.choice(p1, size=n, replace=False) s2 = np.random.choice(p2, size=n, replace=False) plt.subplot(211) count, bins, ignored = plt.hist(p1, 50, density=False, color='green', range=[-15000, 15000], histtype='bar', ec='black') plt.ylabel("反抗联盟样本量") ymax=plt.gca().get_ylim() plt.plot(s1,[ymax]*n,'o',color='green') plt.subplot(212) count, bins, ignored = plt.hist(p2, 50, density=False, color = "red", range=[-15000, 15000], histtype='bar', ec='black') plt.xlabel("纤原体浓度(原力水平)") plt.ylabel("黑暗阵营样本量") ymax=plt.gca().get_ylim()[1] plt.plot(s2,[ymax]*n,'x',color='red') plt.show() return s1,s2 n=10 s1,s2=sample_pop(n) from sklearn.linear_model import Perceptron clf = Perceptron() s_all=np.hstack((s1,s2)).reshape(-1, 1) y=np.hstack( ( [0]*len(s1), [1]*len(s2) ) ) clf.fit(s_all, y) def plot1D(X, y, model,show=True): # 改编自公开机器学习可视化工具代码 # 网格步长,调小可提高可视化精度 h = 0.2 # 绘制决策边界,为网格内每个点分配对应分类颜色 x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = -.1,.1 xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1), np.arange(y_min, y_max, 0.1)) # 预测得到全区间分类结果 Z = model.predict(np.arange(x_min, x_max, 0.1).reshape(-1, 1)) dZ=np.diff(Z) print(Z[np.where(abs(dZ)>0)[0]]) # 打印输出分类阈值 # 可视化绘制 if show: plt.figure(figsize=(6,6)) plt.contourf(xx, yy, np.vstack((Z,Z)), alpha=0.4) plt.scatter(X[:, 0], np.array( [-.05]*len(X) ), c=y, alpha=0.8, edgecolor="k") plt.ylim(-.1,0) plt.gca().get_yaxis().set_ticks([]) # 隐藏y轴刻度 plt.xlabel('纤原体浓度(原力水平)') if show: plt.show() plot1D(s_all,y,clf) from sklearn.metrics import accuracy_score acc=accuracy_score(y, clf.predict(s_all)) acc clf.n_iter_
补充参考图

内容的提问来源于stack exchange,提问作者statHacker
相关产品推荐
相关产品推荐

