HTML

Az élet kódjai

Csináld maga. Senki nem csinálja meg helyetted.

Friss topikok

A nagy elválasztó

2020.01.05. 23:24 Travis.CG

A következő tanuló algoritmusunkat megérteni egyszerű, implementálni viszont igen nehéz. Eddig akárhány online kurzust néztem a témában, a legtöbb algoritmust, amit tanítottak, házi feladatban feladták, hogy programozzuk le egy egyszerűsített formában. Kivéve ezt. Még a Caltech-es tanár is azt javasolta, hogy használjunk kész könyvtárat.

A módszer angol neve support vector machine, magyarul a tartó vektor gép elnevezést találtam, ami nagyon szerencsétlen, én szívesebben használnám a vektorral segítő gép elnevezést, ami szintén nem szép, ezért inkább maradnék az angol elnevezés mellett.

De milyen vektorokról van szó és mit tartanak? Semmit, de segítenek, hogy az adatainkat elválasszuk. Az elválasztó elem pedig két dimenziós adatok esetén egy vonal, három dimenzió esetén egy sík, további dimenzióknál hipersík. Jellemzője még ennek az elválasztásnak, hogy mindkét adathalmaztól egyenlő távolságra helyezkedik el. Ezek a távolságok a mi vektoraink, ezek segítik, hogy jó elválasztó elemet találjunk.

A leghíresebb implementáció a libsvm. Mások is leprogramozták, de a magasabb nyelven elérhető változatok döntő többsége ezen a könyvtáron alapul. Ez egyrészt jó, mert bármilyen nyelvet is választunk, az eredmény jó eséllyel ugyan az lesz.

Mostani példámban továbbra is a két ráktípus expressziós profilját használom, de egy kis egyszerűsítéssel. A support vector machine jól kezel magas dimenzió számú adatokat, még akkor is, ha a dimeziók száma magasabb, mint a tréning adatok száma. Ezeket az adatokat viszont nehéz ábrázolni, ezért én csináltam egy differenciál expresszós analízist, és kiválasztottam két gént, amelyek expressziós változása nagyon magas, és csak ezekre futtatom a tanuló algoritmust. A két gén az ENSG00000189064.8 és ENSG00000178363.4.

A korábban elkészített táblázatunkból tehát csak két oszlopra lesz szükség. Az én esetemben ezek indexe 22442 és 43184.

twogene = list()
X = list()
Y = list()
for i in range(len(data)):
  row = list()
  row.append(data[i][22442]) #ENSG00000178363.4
  row.append(data[i][43184]) #ENSG00000189064.8
  X.append(data[i][22442])
  Y.append(data[i][43184])
  twogene.append(row)

Amennyiben a sci-kit learn csomagot használjuk, a tanítás pont ugyan úgy megy, mint a korábban bemutatott módszerek esetén:

from sklearn import svm
mysvm = svm.SVC(kernel = "linear")
mysvm.fit(twogene, class)

 A kernel paraméter segítségével finomhangolhatjuk a módszert. Az elválasztásnak ugyanis nem kell szükségszerűen lineárisnak lennie. Ami miatt a példa mégis ezt használja, hogy később ezt ki tudjam rajzolni. A rajzoló kód nagyban támaszkodik az egyik sci-kit learn példakódra, a hasonlóság nem a véletlen műve.

plt.figure(figsize = (13,8))
plt.scatter(X, Y, c = category)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()

xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = mysvm.decision_function(xy).reshape(XX.shape)

ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
linestyles=['--', '-', '--'])
ax.scatter(mysvm.support_vectors_[:, 0], mysvm.support_vectors_[:, 1], s=100, linewidth=1, facecolors='none', edgecolors='k')

plt.show()

Amennyiben a fenti kód hiba nélkül fut le, a következő eredményt kapjuk. Feketével a tüdő adenokarcinóma, sárgával a tüdő laphámrák mintákat láthatjuk. A koordináta a két gén normalizált expressziójának nagysága. A bekarikázott értékek a tartó vektoraink, ami alapján az elválasztó egyenest meghatározzuk.

svm.png

Amint látjuk, az elválasztás nem a legszerencsésebb, két gén helyett egy expressziója is elég lenne, hogy jó eséllyel elválasszuk a tumor típusokat. Ez az általam választott példa szerencsétlensége, nem a módszeré.

Szólj hozzá!

Címkék: machine learning

A bejegyzés trackback címe:

https://cybernetic.blog.hu/api/trackback/id/tr7214697936

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása