Linear Separation
Գծային բաժանման մասին խնդիր⌗
Որոշ ժամանակ առաջ մի խնդիր կար լուծելու: Ասում էր ունենք $x=[x_1^{(t)},x_2^{(t)}]\in \mathbb{R}$, որտեղ դրական և բացասական մակնշված տվյալները ունեն էլիպտիկ բաշխում (տես պատկերը): Նշվածներից ո՞ր ֆիչր վեկտրները $\phi(x)$ կերաշխավորեն ${(\phi(x^{(t)},y^{(t)}),t=1,\dotsc,n)}$ գծային բաժանելիությունը:
Տրված են հետևյալ տարբերակները՝
- $\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-ի անել, բայց խնդիրը ծանր չի, հետևաբար էական չի:
Կատարենք վերը նշված տրանսֆորմացիաները մի փոքրն աղավաղելով սյունակի անունները հետագայում մեր կյանքը հեշտացնելու համար.
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)
Առաջինը մաթեմատիկայում հայտնի թամբն ա, ակնհայտորեն գծային բաժանելիության մասին խոսք չի կարող լինել: Երկրորդը և երրորդը ըստ էության նույն բանն են մեր դեպքում և գծային բաժանելին են: Վերջին երկու զույգն էլ 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)* Այո՛, սա փնթի կոդ ա
Ստանում ենք սա.
Ու անցնելով գրաֆիկին տեսնում ենք կետերի արտահոսք դեպը վեր, դեպի պատեր:
Իսկապես էլիպտիկ որոշման եզրը կարող է տրվել
$\theta\cdot[x_1,x_2,x_1x_2,x_1^2,x_2^2]^T+\theta_0 = 0$
Եթե ճիշտ կարդայի պահանջը բացառման սկզբունքով պարզ կլիներ, որ ճիշտ պատասխանը վերջինն էր: