Yn symud ymlaen o Sympy, bydd y daflen lab yma yn rhoi trosolwg cryno ar nifer o lyfrgelloedd Python poblogaidd a all cael eu defnyddio i ddatrys nifer o broblemau gwahanol:
Ni fydd y daflen lab yma yn rhoi trosolwg manwl o bob llyfrgell ond y nod yw rhoi cyflwyniad cryno o bob un.
Fideo yn disgrifio'r llyfrgell.
Llyfrgell sylfaenol ar gyfer gwneud cyfrifiadau effeithlon yw hyn. Y bloc adeiladu yma yw'r numpy.array
a gall cael ei ddefnyddio ar gyfer triniaeth algebra llinol.
Gadewch i ni fewnforio numpy
a diffinio dau fatrics 3 wrth 3:
In [1]:
import numpy as np
A = np.array([[5, 1, -1], [-1, 2, 4], [1, 1, 1]])
B = np.array([[1, 2, 0], [-4, 2, 2], [1, 3, 1]])
Gallwn gael mynediad i $A_{02}$ er enghraifft:
In [2]:
A[0, 2]
Out[2]:
Neu rhes cyfan o $A$:
In [3]:
A[0]
Out[3]:
Neu golofn gyfan:
In [4]:
A[:,1]
Out[4]:
Gallwn gyflawni lluosi sgalar:
In [5]:
5 * A
Out[5]:
Gallwn godi'r matrics i bŵer uchel:
In [6]:
np.linalg.matrix_power(A, 5)
Out[6]:
Gallwn adio matricsau:
In [7]:
A + B
Out[7]:
A gallwn wneud pethau mwy cymhleth fel lluosi matricsau:
In [8]:
np.dot(A, B)
Out[8]:
A gallwch gael gwrthdro a determinant $A$:
In [9]:
np.linalg.inv(A), np.linalg.det(A)
Out[9]:
Mae hefyd gan Numpy nifer o ffwythiannau defnyddiol all fod yn ddefnyddiol hyd yn oed os nad ydyn yn gwneud algebra llinol. Er enghraifft gadewch i ni greu arae o 100 gwerth rhwng -2
ac 1
:
In [10]:
np.linspace(-2, 1, 10 ** 2)
Out[10]:
Fideo yn disgrifio'r llyfrgell.
Dyma'r llyfrgell fwyaf poblogaidd ar gyfer Python ar gyfer creu plotiau. Byddwn yn dangos hwn yn gyntaf trwy greu plot o'r ffwythiant:
$$ -x ^ 4 + 9x ^ 2 + 4 x - 12 $$Rydym yn gwneud hwn trwy greu set o werthoedd $x$ a chyfrifo'r set gyfatebol o werthoedd $f(x)$:
In [11]:
def f(x):
return - x ** 4 + 9 * x ** 2 + 4 * x - 12
xs = np.linspace(-4, 5, 10 ** 3) # Creu 1000 o bwyntiau
ys = [f(x) for x in xs]
Nawr rydym yn barod i fewnforio a defnyddio matplotlib:
In [12]:
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure()
plt.plot(xs, ys)
plt.xlabel("$x$")
plt.ylabel("$y$")
plt.show()
Nodwch fod y gorchymyn %matplotlib inline
yn orchymyn arbennig i Jupyter sy'n sicrhâi y arddangosir plotiau yn y notebook hon.
Gallwn arbed y ddelwedd yma i ffeil i'w ddefnyddio rhywle arall:
In [13]:
plt.figure()
plt.plot(xs, ys)
plt.xlabel("$x$")
plt.ylabel("$y$")
plt.savefig("plot.pdf") # arbrofwch gyda `.png`, `.jpg` ayyb...
Nodwch gallwn greu nifer o wahanol fathau o blotiau, er enghraifft dyma histogram o 1000 haprif a generadwyd gan numpy:
In [14]:
np.random.seed(0) # Gosod hedyn
values = np.random.normal(size=10 ** 3)
plt.figure()
plt.hist(values, bins=20)
plt.xlabel("$Gwerth$")
plt.ylabel("Amledd")
plt.show()
Fideo yn disgrifio'r llyfrgell.
Llyfrgell yw Scipy sy'n casglu nifer o alluoedd gwahanol. Un peth gall e wneud yw canfod gwreiddiau trwy ddefnyddio technegau brasamcan rhifiadol:
In [15]:
from scipy import optimize
In [16]:
optimize.root(f, x0=0)
Out[16]:
In [17]:
f(3)
Out[17]:
Gall hefyd minimeiddio ffwythiannau (gyda mwy nag un newidyn):
In [18]:
def g(x):
"""Tybiwn fod g yn ffwythiant o 2 newidyn a bod x yn fector"""
return np.cos(x[1]) / (1 + x[0])
In [19]:
optimize.minimize(g, x0=[0, 0])
Out[19]:
Gallwn hefyd ffitio ffwythiant i ddata, fan hyn byddwn yn creu data sy'n dilyn cromlin, ychwanegu bach o sŵn, a cheisio adfer y ffwythiant:
In [20]:
def ffwyth(x, a, b):
return a * x ** 2 + b
xs = np.linspace(0, 10, 50)
gwerth_a, gwerth_b = 1 / 2, 70
np.random.seed(0)
ys = [ffwyth(x, a=gwerth_a, b=gwerth_b) + 2 * np.random.random() for x in xs]
Edrychwn ar y data:
In [21]:
plt.figure()
plt.scatter(xs, ys)
plt.show()
In [22]:
popt, pcov = optimize.curve_fit(ffwyth, xs, ys)
Adferwn ni'r gwerthoedd o a
a b
:
In [23]:
popt
Out[23]:
In [24]:
ys_ffitiwyd = [ffwyth(x, *popt) for x in xs]
plt.scatter(xs, ys, label="Data gwreiddiol")
plt.plot(xs, ys_ffitiwyd, label="Data a ffitiwyd", color="red")
plt.show()
Fideo yn disgrifio'r llyfrgell.
Mae Networkx yn delio gyda gwrthrychau o theori graff. Gallwn greu graff mewn nifer o ffyrdd gwahanol, un o'r symlaf yw pasio set o ymylon. Fan hyn rydym yn mewnforio'r llyfrgell a chreu gwrthrych graff:
In [25]:
import networkx as nx
edges = [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3)]
G = nx.Graph(edges)
G
Out[25]:
Mae'n bosib cael matrics cyfagosrwydd y graff:
In [26]:
M = nx.to_numpy_array(G)
M
Out[26]:
Mae hefyd yn bosib tynnu llun y graff:
In [27]:
plt.figure()
nx.draw(G)
Gallwch gyfrifo lliwio graff:
In [28]:
lliwio = nx.greedy_color(G)
lliwio
Out[28]:
A gwelwn taw rhif cromatig y graff yw 3:
In [29]:
len(set(lliwio.values()))
Out[29]:
Fideo yn disgrifio'r llyfrgell.
Pandas yw brif lyfrgell Python ar gyfer trin data. Fel enghraifft byddwn yn ystyried set data at affêrau caru ar y slei: affairs.csv
(download). Mae'r data yma o'r papur ymchwil canlynol:
Fair, Ray C. "A theory of extramarital affairs." Journal of Political Economy 86.1 (1978): 45-61.
Mae pdf ar gael fan hyn: https://fairmodel.econ.yale.edu/rayfair/pdf/1978A200.PDF
Gadewch i ni fewnforio pandas a darllen y set data:
In [30]:
import pandas as pd
df = pd.read_csv("affairs.csv")
Gallwn weld pen y set data:
In [31]:
df.head()
Out[31]:
O'r papur gallwn ddarllen y newidynnau:
sex
: Rhyw a adroddwyd yr unigolyn;age
: Oedran yr unigolyn;ym
: Nifer o flynyddoedd yn briod;child
: Os oes gan yr unigolyn plentyn;religious
: Pa mor grefyddol yw'r unigolyn (5
: "iawn", 1
: "dim");education
: Lefel addysg (9
: ysgol gradd, 20
: PhD neu MD);occupation
: Swydd yn seiliedig ar raddfa o'r enw "Hollingshead classification";rate
: Mesur yr unigolyn o'i briodas (5
: "hapus iawn", 1
: "anhapus iawn").Gallwn gael trosolwg gloi o'r data gan ddefnyddio'r dull describe()
:
In [32]:
df.describe()
Out[32]:
Gallwn hefyd sleisio'r data mewn ffyrdd penodol, er enghraifft sut y mae'r rhif cymedrig o affêrau yn perthyn i fesur y briodas ac os yw'r unigolyn yn wryw neu’n fenyw?
In [33]:
df.groupby(["sex", "rate"])["nbaffairs"].mean()
Out[33]:
Gallwn hefyd sleisio'r data gyda llaw, er enghraifft os hoffwn y data ar gyfer pobl wryw yn unig:
In [34]:
df[df["sex"] == "male"]
Out[34]:
Gallwn gyfuno hwn gyda matplotlib er mwyn cael plot y rhif cymedrig o affêrau ar sail mesur priodas a rhyw:
In [35]:
plt.figure()
for sex in ["male", "female"]:
plt.scatter(range(1, 5 + 1), df[df["sex"] == sex].groupby("rate")["nbaffairs"].mean(), label=sex)
plt.legend()
plt.xlabel("rate")
plt.ylabel("mean nbaffairs")
plt.show()
Fideo yn disgrifio'r llyfrgell.
Mae'r llyfrgell scikit learn yn llyfrgell boblogaidd ar gyfer dysgu peiriannau. Er enghraifft, gadewch i ni hyfforddi model a fydd yn rhagfynegi os bydd rhywun yn cael affêr gan ddefnyddio'r data uchod.
Yn gyntaf byddwn yn creu newidyn newydd o'r enw male
a hefyd newid y newidyn child
i fod yn boolean a storio'r data yma mewn ffrâm data newydd o'r enw X
a fyddwn yn defnyddio i ragfynegi newidyn newydd arall o'r enw cheat
(wedi'i storio yn y
):
In [36]:
df["bool_child"] = df["child"] == "yes"
df["male"] = df["sex"] == "male"
X = df[["age", "ym", "religious", "education", "rate", "occupation", "bool_child", "male"]]
y = df["nbaffairs"] > 0
Nawr i fewnforio'r dosbarthydd penodol bydd yr algorithm yn defnyddio:
In [37]:
from sklearn.ensemble import RandomForestClassifier
In [38]:
seed = 3
clf = RandomForestClassifier(random_state=seed)
clf.fit(X, y)
Out[38]:
In [39]:
for feature, importance in zip(X.columns, clf.feature_importances_):
print(feature, round(importance, 5))
Y briodwedd fwyaf pwysig fan hyn yw oedran yr unigolyn. Gadewch i ni ddefnyddio ein model a hyfforddwn i ragfynegi os bydd rhyw unigolyn yn debygol o gael affêr dros ei fywyd:
In [40]:
oedrannau = range(35, 100)
tebygolrwydd_o_cael_affer = []
for oed in oedrannau:
ym = oed - 24
vince_knight = [[oed, ym, 1, 20, 5, 3, True, True]]
tebygolrwydd_o_cael_affer.append(clf.predict_proba(vince_knight)[0][0])
plt.figure()
plt.plot(oedrannau, tebygolrwydd_o_cael_affer)
plt.xlabel("Oedran Vince")
plt.ylabel("Tebygolrwydd Vince o cael affêr")
plt.ylim(0, 1)
plt.show()
Dyma drosolwg cryno o'r mathau o bethau gall pob llyfrgell eu gwneud, yn ddibynnau ar beth hoffwch wneud gwnewch yn siŵr o'u harchwilio'n llawn ac mae nifer o lyfrgelloedd arall yn yr ecosystem Python.