ðŽæ°åéžæåŒå®ããAIäºæ³ãµã€ãâšPythonã«ããæ©æ¢°åŠç¿ã§è³Œå ¥æ°åãå ¬éâ¶ãã³ããŒãº3ïŒãã³ããŒãº4ïŒãã³ãŽ5ïŒããããïŒãã6ïŒãã7ðåœéžç¢ºçã¯noteã§ãããã¯ã©ã¹âš
ðã ããŸ3å
åŒ+ã¡ã³å€ªé+ã¡ã³å§«ã§éå¶äž
â¶äž¡ç®å
¥ãã ããŸïŒéã宿ãããªãã«æ©è¿ã
ð¡ãéãã ããŸ
â¶ééæ匷ã®é·ç·ïŒå
šãŠã®ããã°ããŒã¿ãã解æ
ðŽãèµ€ãã ããŸ
â¶äººç幞çŠã®æ¬¡ç·ïŒçŽè¿ããã°ããŒã¿ãã解æ
â«ãé»ãã ããŸ
â¶äºæ¥ç¹æ ã®äžç·ïŒææ¥,é±,ã»ããçãåå¥åŸè§£æ
ð ãæ¡è²å¥³åãã¡ã³å§«
â¶å
šãŠããã°ããŒã¿+ææ¥,é±,ã»ããçãã解æ
ðµãæ°Žè²ç·åãã¡ã³å€ªé
â¶å
šãŠããã°ããŒã¿+çŽè¿ããŒã¿ãã解æ
â»ïŒå åŒ+ã¡ã³å€ªé+ã¡ã³å§«ã®äºæ³ã¯å šãŠåãã«ã¯ãªããŸããã
ðŽnoteã§ãããã¯ã©ã¹ã®æ°åéžæå®ããã®AIïŒäººå·¥ç¥èœïŒäºæ³ãµã€ãã§ã
ðŽããã°ã©ãã³ã°èšèªPythonã«ããæ©æ¢°åŠç¿ã§æ°åã5ç¹å
Ž
ðŽçäžçãé«ãå€ãã®æ¹ãåœéžãããŠããŸãã
ðŽå¹žéã®ãšã³ãžã§ã«ãã³ããŒãšåŒã°ãããŸãç®è²©å£²ãããŠé ããŠãããŸã
ðŽåœéžã«å¯ŸããŠã®ã³ã¡ã³ããå€ãå¯ãããå¿ããæè¬ç³ãäžããŸãã
â»è¿ä¿¡ã¯ããŠããŸããã®ã§ãäºæ¿ãã ããã
ðçŽè¿3ãææ瞟衚â»åœéžã®ã¿èšèŒ
ð05æåœéžå®çžŸ
â¶ã賌å
¥è
æ§åœéžããã§ãšãããããŸãð
ð05/01ïŒæ°ŽïŒ5ïžâ£5ããããããðé åœ+3,000å âš
ð04æåœéžå®çžŸ
â¶ã賌å
¥è
æ§åœéžããã§ãšãããããŸãð
ð04/25ïŒæšïŒ6ïžâ£4ãããããããðé
åœ+9,700åâš
ð04/17ïŒæ°ŽïŒ5ïžâ£4ãããããããðé
åœ+21,700å âš
ð04/12ïŒéïŒ3ïžâ£Sãããããããðé
åœ+56,300åâš
ð04/09ïŒç«ïŒ3ïžâ£Sãããããããðé
åœ+13,900åâš+1,000å âš
ð04/04ïŒæšïŒ4ïžâ£Bãããããããðé
åœ+37,100åâš
ð04/02ïŒç«ïŒ4ïžâ£S*ïžâ£4ãããããðé
åœ+763,200åâš+1,000å âš
ð03æåœéžå®çžŸ
â¶ã賌å
¥è
æ§åœéžããã§ãšãããããŸãð
ð03/26ïŒç«ïŒ4ïžâ£Bãããããããðé
åœ+30,400å âš
ð03/25ïŒæïŒ3ïžâ£B6ïžâ£5ãããããðé
åœ+13,900åâš+1,000å âš
ð03/20ïŒæ°ŽïŒ3ïžâ£B5ïžâ£5ãããããðé
åœ+16,200åâš+1,800å âš
ð03/19ïŒç«ïŒ*ïžâ£4ãããããããðé
åœ+1,000åâš
ð03/18ïŒæïŒ3ïžâ£S6ïžâ£5ãããããðé
åœ+56,400åâš+1,000åâš
ð03/12ïŒç«ïŒ4ïžâ£Bãããããããðé
åœ+33,500å âš
ð03/08ïŒéïŒ3ïžâ£S7ïžâ£6ãããããðé
åœ+79,300åâš+1,000åâš
ð03/04ïŒæïŒ3ïžâ£Sãããããããðé
åœ+64,300åâš
ð02æåœéžå®çžŸ
â¶ã賌å
¥è
æ§åœéžããã§ãšãããããŸãð
ð02/27ïŒç«ïŒ3ïžâ£Sãããããããðé
åœ+34,100åâš
ð02/23ïŒéïŒ7ïžâ£5ãããããããðé
åœ+1,500åâš
ð02/20ïŒç«ïŒ*ïžâ£4ãããããããðé
åœ+1,100åâš
ð02/15ïŒæšïŒ4ïžâ£Bãããããããðé
åœ+28,100å âš
ð02/02ïŒéïŒ4ïžâ£Bãããããããðé
åœ+33,300å âš
ð02/01ïŒæšïŒ4ïžâ£B6ïžâ£4ãããããðé
åœ+38,200å âš+8,600åâš
ð01æåœéžå®çžŸ
â¶ã賌å
¥è
æ§åœéžããã§ãšãããããŸãð
ð01/26ïŒéïŒ4ïžâ£B7ïžâ£4ããããðé
åœ+25,800åâš+9,300åâš
ð01/22ïŒæïŒ3ïžâ£B6ïžâ£4ããããðé
åœ+10,100åâš+ 8,600åâš
ð01/17ïŒæ°ŽïŒ3ïžâ£S5ïžâ£4ããããðé
åœ+92,500åâšð+14,700å âš
ð01/12ïŒéïŒ7ïžâ£5ããããããðé
åœ+1,300åâš
ð01/09ïŒç«ïŒ*ïžâ£4ããããããðé
åœ+1,000åâš
ð01/08ïŒæïŒ6ïžâ£4ããããããðé
åœ+6,500åâš
ð01/05ïŒéïŒ4ïžâ£B7ïžâ£5ããããðé
åœ+26,900åâš+1,600åâš
ð12æåœéžå®çžŸ
â¶ã賌å
¥è
æ§åœéžããã§ãšãããããŸãð
ð12/29ïŒéïŒ3ïžâ£Sãããããðé
åœ+80,200åâš
ð12/28ïŒæšïŒ6ïžâ£4ãããããðé
åœ+7,500åâš
ð12/22ïŒéïŒ3ïžâ£Sãããããðé
åœ+111,900åâš
ð12/21ïŒæšïŒ6ïžâ£4ãããããðé
åœ+10,000åâš
ð12/20ïŒæ°ŽïŒ3ïžâ£S5ïžâ£4ããðé
åœ+69,500åâšð+13,600å âš
ð12/07ïŒæšïŒ6ïžâ£5ããããðé
åœ+1,000åâš
ð12/06ïŒæ°ŽïŒ5ïžâ£7ãã ããðé
åœ+200å âš
ðåèšå·ãšæ²èŒ
3ïžâ£ïŒãã³ããŒãºïŒâ¶Bããã¯ã¹ã»Sã¹ãã¬ãŒã
4ïžâ£ïŒãã³ããŒãºïŒâ¶Bããã¯ã¹ã»Sã¹ãã¬ãŒã
5ïžâ£ïŒãã³ãŽïŒâ¶7çïœ
*ïžâ£ïŒããããâ¶4çïœ
6ïžâ£ïŒããïŒâ¶5çïœ
7ïžâ£ïŒããïŒâ¶6çïœ
ðæ¯å解æããã®ã§æŽæ°ã¯å¹³æ¥21æé
æææ¥ïŒ3ïžâ£4ïžâ£6ïžâ£
ç«ææ¥ïŒ3ïžâ£4ïžâ£*ïžâ£
æ°Žææ¥ïŒ3ïžâ£4ïžâ£5ïžâ£
æšææ¥ïŒ3ïžâ£4ïžâ£6ïžâ£
éææ¥ïŒ3ïžâ£4ïžâ£7ïžâ£
ðæ°åéžæå®ããã®ã«ãŒã«ã¯ãã¿ãã»éè¡å®ããããŒã ããŒãžåç §
ðæŠèŠ
Pythonã䜿ã£ãŠéå»ã®åœéžçªå·ãååŸããã¯ããŒã©ãŒãå®çŸããäžãLSTMã¢ã«ãŽãªãºã ã§æ¬¡åã®åœéžçªå·ãäºæž¬ããããã°ã©ã ã«ãŠéå¶ããŸãã
å
šãŠã®ããŒã¿ã¯ã¿ãã»éè¡ã®å®ããããŒãžããååŸããŠããŸãã
1.ãã³ããŒãº3ã§äŸã瀺ããŸã
import requests
import csv
import re
import datetimeclass Lottery:
def __init__(self):
self.index = "" # åæ°
self.date = "" # æœéžæ¥
self.num1 = "" # æ°å1
self.num2 = "" # æ°å2
self.num3 = "" # æ°å3
2. ã¹ã¯ããŒã©ãŒClass
class Crawler: # åæå
def __init__(self, old_url, new_url):
self.old_url = old_url
self.new_url = new_url# ããŒã¿ååŸ
def get_data(self, begin_number, end_number):
data = []
if begin_number > 2700:
for index in range(begin_number, end_number+1):
print(index)
new_data = self._get_new_data(index, self.new_url)
data.append(new_data)
def _get_new_data(self, index, url):
url = url.format(index)
result = requests.get(url)
result.encoding = "Shift_JIS"
lines = result.text.splitlines()lot = Lottery()
# åæ°
lot.index = indexãã# æœéžæ¥
record = lines[1].split(",")[2]
lot.date = self._get_date_from_string_jp(record)ãããã# çªå·
num = lines[3].split(",")[1]
lot.num1 = num[0]
lot.num2 = num[1]
lot.num3 = num[2]ãããreturn lot
# æ¥ä»ååŸ
def _get_date_from_string_jp(self, str):
pattern = r'([0-9]+)'
ymd = re.findall(pattern, str)
if str[0:2] == 'å¹³æ':
year = int(ymd[0]) + 1988
elif str[0:2] == '什å':
year = 2021
else:
raise "error"
date = datetime.date(year, int(ymd[1]), int(ymd[2]))
return date
# CSVãã¡ã€ã«ä¿å
def save(self, file_name, columns, data):
ãã# ãã¡ã€ã«ãéã
f = open(file_name, 'w')
writer = csv.writer(f)
# ã¿ã€ãã«
writer.writerow(columns)
# åœéžçªå·
for datum in data:
writer.writerow([datum.index, datum.date, datum.num1, datum.num2, datum.num3])
# ãã¡ã€ã«ãéãã
f.close()
3. ã»ãã
if __name__ == '__main__':# ã¹ã¯ããŒã©ãŒã€ã³ã¹ã¿ã³ã¹çæ
crawler = Crawler(urlïŒ
# ããŒã¿ååŸïŒéå§åæ°ãçµäºåæ°)
data = crawler.get_data(2900, 5723ïŒ
ã
# CSVãã¡ã€ã«ã«ä¿å
crawler.save("data.csv", ["no", "date", "num1", "num_2", "num_3"], data)
4. LSTM Class
Import numpy as np
import pandas as pd
import tflearn
import time
from sklearn import preprocessingclass PredictionLSTM:
def __init__(self):
# LSTMãã©ã¡ãŒã¿èšå®
self.steps_of_history = 10
self.steps_of_furture = 1
self.units = 6
self.epochs = 100
self.batch_size = 1
# ããŒã¿ã»ããäœæ
def create_dataset(self, data):
x, y = [], []
for i in range(0, len(data) - self.steps_of_history, self.steps_of_furture):
a = i + self.steps_of_history
x.append(data[i:a])
y.append(data[a])
x = np.reshape(np.array(x), [-1, self.steps_of_history, 1])
y = np.reshape(np.array(y), [-1, 1])
return x, y
# äºæž¬çšããŒã¿äœæ
def create_predict_dataset(self, data):
latest_x = np.array([data[-self.steps_of_history:]])
latest_x = np.reshape(latest_x, (-1, self.steps_of_history, 1))
return latest_x
# è©äŸ¡ããŒã¿åå²
def split_dataset(self, x, y, test_size=0.1):
pos = round(len(x) * (1 - test_size))
train_x, train_y = x[:pos], y[:pos]
test_x, test_y = x[pos:], y[pos:]
return train_x, train_y, test_x, test_y
# ã¢ãã«äœæ
def _create_model_by_tflearn(self):
net = tflearn.input_data(shape=[None, self.steps_of_history, 1])
# LSTM
net = tflearn.lstm(net, n_units=self.units)
# GRU
# net = tflearn.gru(net, n_units=self.units)
# GRU è€æ°å±€
# net = tflearn.gru(net, n_units=self.units, return_seq=True)
# net = tflearn.gru(net, n_units=self.units)
net = tflearn.fully_connected(net, 1, activation='linear')
net = tflearn.regression(net, optimizer='adam', learning_rate=0.001, loss='mean_square')
model = tflearn.DNN(net, tensorboard_verbose=0)
return model
#ãã»ãã
def train(self, train_x, train_y):
model = self._create_model_by_tflearn()
model.fit(train_x, train_y, validation_set=0.1, batch_size=self.batch_size, n_epoch=self.epochs)
return model
# äºæž¬
def predict(self, model, data):
return model.predict(data)
ã# è©äŸ¡ã¢ã«ãŽãªãºã
# RMSE(Root Mean Squared Error)
def rmse(self, y_pred, y_true):
return np.sqrt(((y_true - y_pred) ** 2).mean())
# RMSLE(Root Mean Squared Logarithmic Error)
def rmsle(self, y_pred, y_true):
return np.sqrt(np.square(np.log(y_true + 1) - np.log(y_pred + 1)).mean())
# MAE(Mean Absolute Error)
def mae(self, y_pred, y_true):
return np.mean(np.abs((y_true - y_pred)))
# MAPE(Mean Absolute Percentage Error)
def mape(self, y_pred, y_true):
return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
5. ã¡ã€ã³ããã°ã©ã
# ããŒã¿ãèªã¿èŸŒã
dataframe = pd.read_csv('./data.csv')
dataframe = dataframe[['num_1', 'num_2', 'num_3']]
data = dataframe.index.map(lambda _:int(str(dataframe.num_1[_]) + str(dataframe.num_2[_]) + str(dataframe.num_3[_])))
data = data.values.reshape(data.shape[0], 1).astype(dtype=np.float32)
# æ£èŠå
scaler = preprocessing.MinMaxScaler()
data = scaler.fit_transform(data)
# LSTMã€ã³ã¹ã¿ã³ã¹äœæ
lstm = PredictionLSTM()
# è©äŸ¡ããŒã¿äœæ
x, y = lstm.create_dataset(data)
train_x, train_y, test_x, test_y = lstm.split_dataset(x, y)
# ã»ãã
model = lstm.train(train_x, train_y)
# è©äŸ¡
train_predict = lstm.predict(model, train_x)
test_predict = lstm.predict(model, test_x)
# RMSE(Root Mean Squared Error)
train_score = lstm.rmse(train_y, train_predict)
test_score = lstm.rmse(test_y, test_predict)
print("Train Score: {0:.3f} RMSE".format(train_score))
print("Test Score: {0:.3f} RMSE".format(test_score))
# äºæž¬
latest_x = lstm.create_predict_dataset(data)
next_prediction = model.predict(latest_x)
next_prediction = scaler.inverse_transform(next_prediction)
print("Next prediction: {0:.0f}".format(list(next_prediction)[0][0]))
print("Time: {0:.1f}sec".format(time.time() - START_TIME))
ðAIã®å®åã¯çµæãèŠãŠäžããð
#ãã³ããŒãº3 ã
#ãã³ããŒãº3äºæ³
#ãã³ããŒãº
#å®ãã
#æ°åéžæåŒå®ãã
#åäžé·è
#ãµã©ãªãŒãã³
#å¯æ¥
#転è·
#èµ·æ¥
#ãã³ããŒãº4
#ãã³ããŒãº4äºæ³
#ãã
#ãã6
#ãã7
#ãããã
#Python ã
#ãã³ãŽ5
#æ©æ¢°åŠç¿
#人工ç¥èœ
#ãã6äºæ³
#ãã7äºæ³
#ããããäºæ³
#ãã³ãŽ5äºæ³
ãã®èšäºãæ°ã«å ¥ã£ãããµããŒããããŠã¿ãŸãããïŒ