You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_

补充参考图

1000次不同样本量n的抽样下,使用逻辑回归得到的准确率分布(感知机结果与之相近)

内容的提问来源于stack exchange,提问作者statHacker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:24:23