Գծային բաժանման մասին խնդիր

Որոշ ժամանակ առաջ մի խնդիր կար լուծելու: Ասում էր ունենք $x=[x_1^{(t)},x_2^{(t)}]\in \mathbb{R}$, որտեղ դրական և բացասական մակնշված տվյալները ունեն էլիպտիկ բաշխում (տես պատկերը): Նշվածներից ո՞ր ֆիչր վեկտրները $\phi(x)$ կերաշխավորեն ${(\phi(x^{(t)},y^{(t)}),t=1,\dotsc,n)}$ գծային բաժանելիությունը:

Sample distribution

Տրված են հետևյալ տարբերակները՝

  • $\phi(x)=[x_1,x_2]^T$
  • $\phi(x)=[x_1,x_2,x_1x_2]^T$
  • $\phi(x)=[x_1,x_2,x_1^2+x_2^2]^T$
  • $\phi(x)=[x_1,x_2,x_1^2+2x_2^2]^T$
  • $\phi(x)=[x_1,x_2,x_1x_2,x_1^2,x_2^2]^T$

Փֆֆֆֆ մտածեցի ես հիմա արագ պիթոնով կգծեմ ու պատասխանը ակնհայտ կլինի: Ու այդտեղ սկսվեցին արկածները:

Արագ տվյալների գեներացիա պատկերի 1-ի նմանակմամբ.

x, y = np.random.normal(0, 2, (2, 500))

data = pd.DataFrame({"x": x, "y": y})

data["class"] = np.where(pow(data["x"], 2) + pow(data["y"], 2) < 3, 1, 0)

plt.scatter(data[data["class"] == 0]["x"], data[data["class"] == 0]["y"])
plt.scatter(data[data["class"] == 1]["x"], data[data["class"] == 1]["y"])
plt.xlim(-7, 7)
plt.ylim(-7, 7)

Իհարկե կարելի էր առանց DataFrame-ի անել, բայց խնդիրը ծանր չի, հետևաբար էական չի:

Generated Data

Կատարենք վերը նշված տրանսֆորմացիաները մի փոքրն աղավաղելով սյունակի անունները հետագայում մեր կյանքը հեշտացնելու համար.

data["x*y"] = data["x"] * data["y"]
data["$x^2+y^2$"] = data["x"] * data["x"] + data["y"] * data["y"]
data["$x^2+2y^2$"] = data["x"] * data["x"] + 2 * data["y"] * data["y"]

Արագ գծենք 3-չափ տարածությունում.

for i in data:
    if i in ("x", "y", "class"):
        continue

    fig = plt.figure(figsize=(6, 3))

    ax = fig.add_subplot(1, 2, 1, projection="3d")
    ax.scatter(data["x"], data["y"], data[i], c=data["class"], cmap="Paired")
    plt.xlabel("x")
    plt.ylabel("y")
    ax.view_init(30, 60)

    plt.title(i)

    ax = fig.add_subplot(1, 2, 2, projection="3d")
    ax.scatter(data["x"], data["y"], data[i], c=data["class"], cmap="Paired")
    plt.xlabel("x")
    plt.ylabel("y")
    ax.view_init(0, 45)

    plt.title(i)
  

x * y x^2+y^2 x^2+2y^2 y^2 x^2

Առաջինը մաթեմատիկայում հայտնի թամբն ա, ակնհայտորեն գծային բաժանելիության մասին խոսք չի կարող լինել: Երկրորդը և երրորդը ըստ էության նույն բանն են մեր դեպքում և գծային բաժանելին են: Վերջին երկու զույգն էլ 3չափ տարածությունում մի պատկերում չեն նկարագրվում :Պ:

Մտածեցի, որ հարցը լուծված ա և ստուգեցի պատասխանի հետ ու պարզվեց, որ սխալ եմ: Իսկ ճիշտ պատասխանը հինգերորդն էր: Սկզբում զարմացա, հետո սկսեցի մանրամասն կարդալ ու պարզվեց բաց եմ թողել մի կրիտիկական բառ, այն է

ունենք $x=[x_1^{(t)},x_2^{(t)}]\in \mathbb{R}$, որտեղ դրական և բացասական մակնշված տվյալները ունեն էլիպտիկ բաշխում

Ֆեյփալմ մը ըզ մեր երեսին:

Բավականին զայրացած ինքս ինձ վրա, որ կրկին շտապել եմ ու կարևոր մանրամասն բաց թողել գնացի քնելու՝ արդեն ուշ գիշեր էր: Արդեն երբ պառկել էի, հասկացա, թե ինչու իմ պատասխանները չէին կարող ճիշտ լինել, քանի որ էլիպտիկ բաշխման դեպքում կետերի մի մասը կարտահոսեին մակերևույթւոմ վերև, և խոսել բաժանման մասին անհնար կլիներ: Որոշեցի տեսնել այդ երևույթը համապտասխան փոփոխություններ մտցնելով կոդի մեջ և քնեցի:

Հաջորդ երեկոյան ուղադիր դիտելով Պատկեր 1ը նկատեցի պտտված էլիպսը ավելացրեցի համապատասխան տրանսֆորմացիան.

theta = 45
data["class"] = np.where(
    pow((np.cos(theta) * data["x"] + np.sin(theta) * data["y"]), 2) / 2
    + pow((-1 * np.sin(theta) * data["x"] + np.cos(theta) * data["y"]), 2) / 0.3
    < 3.4,
    1,
    0,
)
plt.scatter(data[data["class"] == 0]["x"], data[data["class"] == 0]["y"])
plt.scatter(data[data["class"] == 1]["x"], data[data["class"] == 1]["y"])
plt.xlim(-7, 7)
plt.ylim(-7, 7)

* Այո՛, սա փնթի կոդ ա

Ստանում ենք սա.

Generated Data Ellipse

Ու անցնելով գրաֆիկին տեսնում ենք կետերի արտահոսք դեպը վեր, դեպի պատեր:

x^2+y^2 x^2+2y^2

Իսկապես էլիպտիկ որոշման եզրը կարող է տրվել

$\theta\cdot[x_1,x_2,x_1x_2,x_1^2,x_2^2]^T+\theta_0 = 0$

Եթե ճիշտ կարդայի պահանջը բացառման սկզբունքով պարզ կլիներ, որ ճիշտ պատասխանը վերջինն էր: