lab3
This commit is contained in:
parent
c86d4ca749
commit
19eaa28e47
BIN
Ataskaita lab3.docx
Normal file
BIN
Ataskaita lab3.docx
Normal file
Binary file not shown.
212
lab3_1.py
Normal file
212
lab3_1.py
Normal file
@ -0,0 +1,212 @@
|
||||
import pandas as pd
|
||||
import matplotlib.pyplot as plt
|
||||
import matplotlib.patches as mpatches
|
||||
from sklearn.linear_model import LinearRegression
|
||||
import numpy as np
|
||||
|
||||
# Warning, this is not great code. Just something hacked together for the report.
|
||||
|
||||
def create_dataset(sunspots, n = 2):
|
||||
P = []
|
||||
T = []
|
||||
for i in range(len(sunspots) - n):
|
||||
P.append(np.array(sunspots["activity"][i:(i+n)]))
|
||||
T.append(sunspots["activity"][i+n])
|
||||
return P, T
|
||||
|
||||
# 1. & 2.
|
||||
sunspots = pd.read_csv("sunspot.txt", delimiter='\t', header=None, names=["year", "activity"])
|
||||
|
||||
# 4.
|
||||
if False:
|
||||
plt.plot(sunspots['year'], sunspots["activity"])
|
||||
plt.xlabel("Metai")
|
||||
plt.ylabel("Aktyvumas")
|
||||
plt.title(f"Saulės aktyvumas tarp {min(sunspots['year'])} ir {max(sunspots['year'])} metų")
|
||||
plt.show()
|
||||
|
||||
# 5.
|
||||
P, T = create_dataset(sunspots)
|
||||
|
||||
# 6.
|
||||
def draw_scatterplot(Xs, Ys, marker = 'o'):
|
||||
ax = plt.subplot(projection='3d')
|
||||
X_coords = []
|
||||
Y_coords = []
|
||||
Z_coords = []
|
||||
for i in range(len(Xs)):
|
||||
X_coords.append(Xs[i][0])
|
||||
Y_coords.append(Xs[i][1])
|
||||
Z_coords.append(Ys[i])
|
||||
|
||||
ax.scatter(X_coords, Y_coords, Z_coords, marker=marker)
|
||||
ax.set_xlabel('Užpraitų metų aktyvumas')
|
||||
ax.set_ylabel('Praitų metų aktyvumas')
|
||||
ax.set_zlabel('Šių metų aktyvumas')
|
||||
ax.set_title('Šių metų aktyvumo priklausomybė nuo praėjusių metų')
|
||||
|
||||
return ax
|
||||
|
||||
if False:
|
||||
draw_scatterplot(P, T)
|
||||
plt.show()
|
||||
|
||||
# 7.
|
||||
assert len(P) > 200
|
||||
Pu = P[:200]
|
||||
Tu = T[:200]
|
||||
|
||||
# 8.
|
||||
model = LinearRegression().fit(Pu, Tu)
|
||||
|
||||
# 9.
|
||||
print(f"intercept: {model.intercept_}")
|
||||
print(f"coefficients: {model.coef_}")
|
||||
|
||||
if False:
|
||||
w1 = model.coef_[0]
|
||||
w2 = model.coef_[1]
|
||||
b = model.intercept_
|
||||
|
||||
x1 = max(p[0] for p in P)
|
||||
x2 = max(p[1] for p in P)
|
||||
ax = draw_scatterplot(P, T)
|
||||
ax.plot([0, x1], [0, x2], 'r', zs=[b, x1*w1 + x2*w2 + b])
|
||||
plt.show()
|
||||
|
||||
# 10.
|
||||
if False:
|
||||
draw_scatterplot(Pu, model.predict(Pu))
|
||||
draw_scatterplot(Pu, Tu)
|
||||
|
||||
plt.legend(handles=[
|
||||
mpatches.Patch(color='blue', label='Tikrasis'),
|
||||
mpatches.Patch(color='orange', label='Numatytas')
|
||||
])
|
||||
plt.show()
|
||||
|
||||
# 11.
|
||||
if False:
|
||||
e = np.array(Tu) - model.predict(Pu)
|
||||
draw_scatterplot(Pu, e)
|
||||
plt.show()
|
||||
|
||||
# 12.
|
||||
if False:
|
||||
e = np.array(Tu) - model.predict(Pu)
|
||||
plt.hist(e, bins=40)
|
||||
plt.xlabel("Klaida")
|
||||
plt.ylabel("Dažnis")
|
||||
plt.show()
|
||||
|
||||
# 13.
|
||||
e = np.array(Tu) - model.predict(Pu)
|
||||
print("MSE (train)", np.sum(e**2) / len(e))
|
||||
print("MAD (train)", np.median(np.abs(e)))
|
||||
|
||||
e = np.array(T[200:]) - model.predict(P[200:])
|
||||
print("MSE (test)", np.sum(e**2) / len(e))
|
||||
print("MAD (test)", np.median(np.abs(e)))
|
||||
|
||||
# 14. & 15. & 16.
|
||||
class AdaptiveLinearNeuron(object):
|
||||
def __init__(self, rate = 0.01, max_niter = 10, mse_goal = -1):
|
||||
self.rate = rate
|
||||
self.max_niter = max_niter
|
||||
self.mse_goal = mse_goal
|
||||
|
||||
def fit(self, X, y):
|
||||
"""Fit training data
|
||||
X : Training vectors, X.shape : [#samples, #features]
|
||||
y : Target values, y.shape : [#samples]
|
||||
"""
|
||||
|
||||
# weights
|
||||
self.weight = np.zeros(1 + X.shape[1])
|
||||
|
||||
# Number of misclassifications
|
||||
self.errors = []
|
||||
|
||||
# Cost function
|
||||
self.cost = []
|
||||
|
||||
for i in range(self.max_niter):
|
||||
output = self.net_input(X)
|
||||
errors = y - output
|
||||
self.weight[1:] += self.rate * X.T.dot(errors)
|
||||
self.weight[0] += self.rate * errors.sum()
|
||||
cost = (errors**2).sum() / 2.0
|
||||
self.cost.append(cost)
|
||||
|
||||
mse = np.average(errors**2)
|
||||
if self.mse_goal != -1 and mse < self.mse_goal: break
|
||||
return self
|
||||
|
||||
def net_input(self, X):
|
||||
"""Calculate net input"""
|
||||
return np.dot(X, self.weight[1:]) + self.weight[0]
|
||||
|
||||
def activation(self, X):
|
||||
"""Compute linear activation"""
|
||||
return self.net_input(X)
|
||||
|
||||
def predict(self, X):
|
||||
"""Return class label after unit step"""
|
||||
return np.where(self.activation(X) >= 0.0, 1, -1)
|
||||
|
||||
|
||||
# print("---------------")
|
||||
# for lr in [5e-5, 1e-5, 5e-6, 1e-6, 5e-7, 1e-7, 5e-8, 1e-8, 5e-9, 1e-9]:
|
||||
# aln = AdaptiveLinearNeuron(lr, 100000, 300).fit(np.array(Pu), np.array(Tu))
|
||||
|
||||
# print(lr, aln.cost[-1], len(aln.cost))
|
||||
|
||||
print("---------------")
|
||||
aln = AdaptiveLinearNeuron(0.000001, 1000, 280).fit(np.array(Pu), np.array(Tu))
|
||||
if False:
|
||||
plt.plot(aln.cost, marker='o')
|
||||
plt.xlabel('Epochs')
|
||||
plt.ylabel('Sum-squared-error')
|
||||
plt.title('Adaptive Linear Neuron - Learning rate 0.000001')
|
||||
plt.show()
|
||||
|
||||
# 17.
|
||||
print("iterations", len(aln.cost))
|
||||
print("b", aln.weight[0])
|
||||
print("w1", aln.weight[1])
|
||||
print("w2", aln.weight[2])
|
||||
|
||||
# 18.
|
||||
# * Taip konverguoja, nes pasiekiama užsibrėžta MSE riba
|
||||
# * b ~ 0.17, w1 ~ -0.58, w2 ~ 1.46
|
||||
|
||||
# 19.
|
||||
# Didinti 'lr' nelabai galima, nes tada pradės nekonverguoti ir įvyks slankaus kablelio klaidos
|
||||
# Mažinant 'lr' tiesiog prailgina mokymosi ilgiai tiesiškai
|
||||
|
||||
# 20.
|
||||
print("------ Didinimas ---------")
|
||||
for n in [2, 4, 6, 8, 10]:
|
||||
print(f"====== n = {n}")
|
||||
P, T = create_dataset(sunspots, n)
|
||||
assert len(P) > 200
|
||||
Pu = np.array(P[:200])
|
||||
Tu = np.array(T[:200])
|
||||
|
||||
# aln = AdaptiveLinearNeuron(1e-7, 1000).fit(Pu, Tu)
|
||||
# plt.plot(aln.cost, marker='o')
|
||||
# plt.xlabel('Epochs')
|
||||
# plt.ylabel('Sum-squared-error')
|
||||
# plt.title('Adaptive Linear Neuron - Learning rate 0.000001')
|
||||
# plt.show()
|
||||
# print(f"cost (n={n}) ", aln.cost[-1])
|
||||
# print(f"iterations (n={n}) ", len(aln.cost))
|
||||
|
||||
model = LinearRegression().fit(Pu, Tu)
|
||||
e = Tu - model.predict(Pu)
|
||||
print("MSE (train)", np.average(e**2))
|
||||
print("MAD (train)", np.median(np.abs(e)))
|
||||
|
||||
e = np.array(T[200:]) - model.predict(P[200:])
|
||||
print("MSE (test)", np.average(e**2))
|
||||
print("MAD (test)", np.median(np.abs(e)))
|
49
lab3_2.py
Normal file
49
lab3_2.py
Normal file
@ -0,0 +1,49 @@
|
||||
import pandas as pd
|
||||
import matplotlib.pyplot as plt
|
||||
import tensorflow as tf
|
||||
from sklearn.model_selection import cross_val_score
|
||||
|
||||
def load_data():
|
||||
apples = pd.read_csv("apple_quality_clean.csv")
|
||||
|
||||
|
||||
return apples.drop(columns=["Quality"]), apples["Quality"]
|
||||
|
||||
X, Y = load_data()
|
||||
# Convert values from a 0..1 range to a (-1)..1 range
|
||||
# Conclusion: makes no difference
|
||||
#X = X.map(lambda x: x*2 - 1)
|
||||
|
||||
tf.keras.utils.set_random_seed(42)
|
||||
|
||||
model = tf.keras.models.Sequential([
|
||||
tf.keras.layers.Dense(1, activation='relu')
|
||||
])
|
||||
|
||||
model.build(input_shape=[None,len(X.columns)])
|
||||
|
||||
model.compile(
|
||||
optimizer=tf.keras.optimizers.Adam(learning_rate=0.01),
|
||||
loss='binary_crossentropy',
|
||||
metrics=['accuracy'],
|
||||
)
|
||||
|
||||
history = model.fit(
|
||||
X,
|
||||
Y,
|
||||
batch_size=len(X),
|
||||
epochs=200,
|
||||
shuffle=True,
|
||||
validation_split=0.2
|
||||
)
|
||||
|
||||
# print("10-fold cross validation score:", cross_val_score(model, X, Y, cv=10))
|
||||
|
||||
# print("Accuracy", history.history['acc'][-1])
|
||||
# print(model.score)
|
||||
|
||||
plt.plot(history.history['accuracy'])
|
||||
plt.plot(history.history['val_accuracy'])
|
||||
plt.xlabel('Iterations')
|
||||
plt.ylabel('accuracy')
|
||||
plt.show()
|
315
sunspot.txt
Normal file
315
sunspot.txt
Normal file
@ -0,0 +1,315 @@
|
||||
1700 5
|
||||
1701 11
|
||||
1702 16
|
||||
1703 23
|
||||
1704 36
|
||||
1705 58
|
||||
1706 29
|
||||
1707 20
|
||||
1708 10
|
||||
1709 8
|
||||
1710 3
|
||||
1711 0
|
||||
1712 0
|
||||
1713 2
|
||||
1714 11
|
||||
1715 27
|
||||
1716 47
|
||||
1717 63
|
||||
1718 60
|
||||
1719 39
|
||||
1720 28
|
||||
1721 26
|
||||
1722 22
|
||||
1723 11
|
||||
1724 21
|
||||
1725 40
|
||||
1726 78
|
||||
1727 122
|
||||
1728 103
|
||||
1729 73
|
||||
1730 47
|
||||
1731 35
|
||||
1732 11
|
||||
1733 5
|
||||
1734 16
|
||||
1735 34
|
||||
1736 70
|
||||
1737 81
|
||||
1738 111
|
||||
1739 101
|
||||
1740 73
|
||||
1741 40
|
||||
1742 20
|
||||
1743 16
|
||||
1744 5
|
||||
1745 11
|
||||
1746 22
|
||||
1747 40
|
||||
1748 60
|
||||
1749 81
|
||||
1750 83
|
||||
1751 48
|
||||
1752 48
|
||||
1753 31
|
||||
1754 12
|
||||
1755 10
|
||||
1756 10
|
||||
1757 32
|
||||
1758 48
|
||||
1759 54
|
||||
1760 63
|
||||
1761 86
|
||||
1762 61
|
||||
1763 45
|
||||
1764 36
|
||||
1765 21
|
||||
1766 11
|
||||
1767 38
|
||||
1768 70
|
||||
1769 106
|
||||
1770 101
|
||||
1771 82
|
||||
1772 67
|
||||
1773 35
|
||||
1774 31
|
||||
1775 7
|
||||
1776 20
|
||||
1777 93
|
||||
1778 154
|
||||
1779 126
|
||||
1780 85
|
||||
1781 68
|
||||
1782 39
|
||||
1783 23
|
||||
1784 10
|
||||
1785 24
|
||||
1786 83
|
||||
1787 132
|
||||
1788 131
|
||||
1789 118
|
||||
1790 90
|
||||
1791 67
|
||||
1792 60
|
||||
1793 47
|
||||
1794 41
|
||||
1795 21
|
||||
1796 16
|
||||
1797 6
|
||||
1798 4
|
||||
1799 7
|
||||
1800 15
|
||||
1801 34
|
||||
1802 45
|
||||
1803 43
|
||||
1804 48
|
||||
1805 42
|
||||
1806 28
|
||||
1807 10
|
||||
1808 8
|
||||
1809 3
|
||||
1810 0
|
||||
1811 1
|
||||
1812 5
|
||||
1813 12
|
||||
1814 14
|
||||
1815 35
|
||||
1816 46
|
||||
1817 41
|
||||
1818 30
|
||||
1819 24
|
||||
1820 16
|
||||
1821 7
|
||||
1822 4
|
||||
1823 2
|
||||
1824 9
|
||||
1825 17
|
||||
1826 36
|
||||
1827 50
|
||||
1828 64
|
||||
1829 67
|
||||
1830 71
|
||||
1831 48
|
||||
1832 28
|
||||
1833 9
|
||||
1834 13
|
||||
1835 57
|
||||
1836 122
|
||||
1837 138
|
||||
1838 103
|
||||
1839 86
|
||||
1840 65
|
||||
1841 37
|
||||
1842 24
|
||||
1843 11
|
||||
1844 15
|
||||
1845 40
|
||||
1846 62
|
||||
1847 99
|
||||
1848 125
|
||||
1849 96
|
||||
1850 67
|
||||
1851 65
|
||||
1852 54
|
||||
1853 39
|
||||
1854 21
|
||||
1855 7
|
||||
1856 4
|
||||
1857 23
|
||||
1858 55
|
||||
1859 94
|
||||
1860 96
|
||||
1861 77
|
||||
1862 59
|
||||
1863 44
|
||||
1864 47
|
||||
1865 31
|
||||
1866 16
|
||||
1867 7
|
||||
1868 38
|
||||
1869 74
|
||||
1870 139
|
||||
1871 111
|
||||
1872 102
|
||||
1873 66
|
||||
1874 45
|
||||
1875 17
|
||||
1876 11
|
||||
1877 12
|
||||
1878 3
|
||||
1879 6
|
||||
1880 32
|
||||
1881 54
|
||||
1882 60
|
||||
1883 64
|
||||
1884 64
|
||||
1885 52
|
||||
1886 25
|
||||
1887 13
|
||||
1888 7
|
||||
1889 6
|
||||
1890 7
|
||||
1891 36
|
||||
1892 73
|
||||
1893 85
|
||||
1894 78
|
||||
1895 64
|
||||
1896 42
|
||||
1897 26
|
||||
1898 27
|
||||
1899 12
|
||||
1900 10
|
||||
1901 3
|
||||
1902 5
|
||||
1903 24
|
||||
1904 42
|
||||
1905 64
|
||||
1906 54
|
||||
1907 62
|
||||
1908 49
|
||||
1909 44
|
||||
1910 19
|
||||
1911 6
|
||||
1912 4
|
||||
1913 1
|
||||
1914 10
|
||||
1915 47
|
||||
1916 57
|
||||
1917 104
|
||||
1918 81
|
||||
1919 64
|
||||
1920 38
|
||||
1921 26
|
||||
1922 14
|
||||
1923 6
|
||||
1924 17
|
||||
1925 44
|
||||
1926 64
|
||||
1927 69
|
||||
1928 78
|
||||
1929 65
|
||||
1930 36
|
||||
1931 21
|
||||
1932 11
|
||||
1933 6
|
||||
1934 9
|
||||
1935 36
|
||||
1936 80
|
||||
1937 114
|
||||
1938 110
|
||||
1939 89
|
||||
1940 68
|
||||
1941 48
|
||||
1942 31
|
||||
1943 16
|
||||
1944 10
|
||||
1945 33
|
||||
1946 93
|
||||
1947 152
|
||||
1948 136
|
||||
1949 135
|
||||
1950 84
|
||||
1951 69
|
||||
1952 32
|
||||
1953 14
|
||||
1954 4
|
||||
1955 38
|
||||
1956 142
|
||||
1957 190
|
||||
1958 185
|
||||
1959 159
|
||||
1960 112
|
||||
1961 54
|
||||
1962 38
|
||||
1963 28
|
||||
1964 10
|
||||
1965 15
|
||||
1966 47
|
||||
1967 94
|
||||
1968 106
|
||||
1969 106
|
||||
1970 105
|
||||
1971 67
|
||||
1972 69
|
||||
1973 38
|
||||
1974 35
|
||||
1975 16
|
||||
1976 13
|
||||
1977 28
|
||||
1978 93
|
||||
1979 155
|
||||
1980 155
|
||||
1981 141
|
||||
1982 116
|
||||
1983 67
|
||||
1984 46
|
||||
1985 18
|
||||
1986 13
|
||||
1987 29
|
||||
1988 100
|
||||
1989 158
|
||||
1990 143
|
||||
1991 146
|
||||
1992 94
|
||||
1993 55
|
||||
1994 30
|
||||
1995 18
|
||||
1996 9
|
||||
1997 22
|
||||
1998 64
|
||||
1999 93
|
||||
2000 119
|
||||
2001 111
|
||||
2002 104
|
||||
2003 64
|
||||
2004 40
|
||||
2005 30
|
||||
2006 15
|
||||
2007 7
|
||||
2008 3
|
||||
2009 4
|
||||
2010 16
|
||||
2011 57
|
||||
2012 58
|
||||
2013 65
|
||||
2014 79
|
Loading…
Reference in New Issue
Block a user