import re
from bs4 import BeautifulSoup
import MeCab
from sklearn.feature_extraction.text import CountVectorizer
# 1. HTMLタグを削除し、不要なスペースを除去する関数
def clean_text(text):
# BeautifulSoupを使ってHTMLタグを削除
text = BeautifulSoup(text, "html.parser").get_text()
# 正規表現を使って不要なスペースを削除
text = re.sub(r'\s+', ' ', text).strip()
return text
# 2. MeCabを用いて日本語テキストを単語に分割
def tokenize_with_mecab(text):
mecab = MeCab.Tagger('-Owakati')
# MeCabで形態素解析し、単語に分割された文字列を返す
tokenized_text = mecab.parse(text).strip()
return tokenized_text
# 3. 正規化 (すべて小文字に変換)
def normalize_text(text):
return text.lower()
# 4. CountVectorizerを使ってベクトル化
def vectorize_text(tokenized_texts):
vectorizer = CountVectorizer()
# 文字列のリストを受け取り、ベクトル化
vectorized = vectorizer.fit_transform(tokenized_texts)
return vectorized, vectorizer.get_feature_names_out()
# 実際のテキスト処理
raw_text = "<p>こんにちは、これはテストのHTMLタグを含んだテキストです。</p>"
# テキストのクレンジング
cleaned_text = clean_text(raw_text)
print("Cleaned Text:", cleaned_text)
# MeCabで形態素解析 (単語に分割)
tokenized_text = tokenize_with_mecab(cleaned_text)
print("Tokenized Text:", tokenized_text)
# 小文字に正規化
normalized_text = normalize_text(tokenized_text)
print("Normalized Text:", normalized_text)
# ベクトル化
vectorized_text, feature_names = vectorize_text([normalized_text])
print("Vectorized Text:\n", vectorized_text.toarray())
print("Feature Names:", feature_names)
import numpy as np
import matplotlib.pyplot as plt
# 逆文書頻度 (IDF) を計算する関数
def calculate_idf(N, Nt):
return np.log(N / Nt)
# 文書全体の数 (N)
N = 1000
# 索引語が含まれる文書の数 (Nt) の範囲
Nt_values = np.arange(1, 101) # 1から100までの文書数
# 各Ntに対するIDF値を計算
idf_values = calculate_idf(N, Nt_values)
# グラフの描画
plt.figure(figsize=(8, 6))
plt.plot(Nt_values, idf_values, marker='o')
plt.title('IDF vs. Number of Documents (Nt)')
plt.xlabel('Nt (Number of Documents containing the term)')
plt.ylabel('IDF (Inverse Document Frequency)')
plt.grid(True)
plt.show()
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# サンプル文書のベクトル化(埋め込みの模倣)
documents = {
"文書1": np.array([0.1, 0.3, 0.7]),
"文書2": np.array([0.2, 0.1, 0.3]),
"文書3": np.array([0.6, 0.3, 0.4])
}
# 質問文のベクトル化(埋め込みの模倣)
query = np.array([0.2, 0.4, 0.9])
# コサイン類似度を計算する関数
def calculate_similarity(query_vector, document_vectors):
similarities = {}
for doc, vector in document_vectors.items():
similarity = cosine_similarity([query_vector], [vector])[0][0]
similarities[doc] = similarity
return similarities
# 質問文と各文書の類似度を計算
similarities = calculate_similarity(query, documents)
# 結果を表示
print("質問文と各文書のコサイン類似度:")
for doc, similarity in similarities.items():
print(f"{doc}: {similarity:.4f}")
# 最も類似度の高い文書を取得
best_match = max(similarities, key=similarities.get)
print(f"最も類似度が高い文書: {best_match}")
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics.pairwise import cosine_similarity
# サンプルの評価行列 (ユーザー × アイテム)
ratings_matrix = np.array([
[5, 3, 0, 1],
[4, 0, 0, 1],
[1, 1, 0, 5],
[1, 0, 0, 4],
[0, 1, 5, 4],
])
# ユーザー間のコサイン類似度を計算
user_similarity = cosine_similarity(ratings_matrix)
# アイテム間のコサイン類似度を計算
item_similarity = cosine_similarity(ratings_matrix.T)
# 評価行列の可視化
plt.figure(figsize=(10, 6))
sns.heatmap(ratings_matrix, annot=True, cmap="coolwarm", cbar=True, linewidths=0.5)
plt.title("Ratings Matrix (Users × Items)")
plt.xlabel("Items")
plt.ylabel("Users")
plt.show()
# ユーザー間の類似度の可視化
plt.figure(figsize=(8, 6))
sns.heatmap(user_similarity, annot=True, cmap="Blues", cbar=True, linewidths=0.5)
plt.title("User Similarity (Cosine Similarity)")
plt.xlabel("Users")
plt.ylabel("Users")
plt.show()
# アイテム間の類似度の可視化
plt.figure(figsize=(8, 6))
sns.heatmap(item_similarity, annot=True, cmap="Greens", cbar=True, linewidths=0.5)
plt.title("Item Similarity (Cosine Similarity)")
plt.xlabel("Items")
plt.ylabel("Items")
plt.show()
import numpy as np
import pandas as pd
# 評価値行列 R を作成する
# 未評価のアイテムは 0 とする
ratings_data = {
"user1": [5, 3, 0, 1], # user1の評価
"user2": [4, 0, 0, 1], # user2の評価
"user3": [1, 1, 0, 5], # user3の評価
"user4": [1, 0, 0, 4], # user4の評価
"user5": [0, 1, 5, 4], # user5の評価
}
# 行列として扱うため、DataFrameを使用
items = ['item1', 'item2', 'item3', 'item4'] # アイテム
ratings_matrix = pd.DataFrame(ratings_data, index=items).T
# 評価値行列 R を表示
print("評価値行列 R:")
print(ratings_matrix)
# 欠損値(未評価)は0として扱う
R = ratings_matrix.values
# 評価値行列の概要を表示
print("\n評価値行列 R (numpy array):")
print(R)
# 行と列のラベル(ユーザーとアイテム)を使った表記
for i, user in enumerate(ratings_matrix.index):
for j, item in enumerate(ratings_matrix.columns):
print(f"r_{i+1},{j+1} (user {user} の {item} に対する評価): {R[i, j]}")
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
import matplotlib.pyplot as plt
# ユーザーAとユーザーBの評価ベクトル(例: 1,2,3,4,5 と 5,4,3,2,1)
A = np.array([1, 2, 3, 4, 5])
B = np.array([5, 4, 3, 2, 1])
# 中心化(各評価値から平均値を引く)
A_mean = A.mean()
B_mean = B.mean()
A_centered = A - A_mean
B_centered = B - B_mean
# 中心化後のベクトル表示
print("中心化後のA:", A_centered)
print("中心化後のB:", B_centered)
# 中心化後のコサイン類似度の計算
similarity = cosine_similarity([A_centered], [B_centered])[0][0]
print("中心化後のコサイン類似度:", similarity)
# 中心化前後のベクトルを視覚化
fig, ax = plt.subplots(1, 2, figsize=(10, 4))
# 中心化前のベクトルプロット
ax[0].plot(A, label='User A', marker='o')
ax[0].plot(B, label='User B', marker='o')
ax[0].set_title('Original Vectors')
ax[0].legend()
# 中心化後のベクトルプロット
ax[1].plot(A_centered, label='User A (centered)', marker='o')
ax[1].plot(B_centered, label='User B (centered)', marker='o')
ax[1].set_title('Centered Vectors')
ax[1].legend()
plt.show()
import numpy as np
import matplotlib.pyplot as plt
# Generate sample data for a simple linear relationship: y = 2x + 1
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
# Initialize parameters (weights w1 and bias w0)
w1 = np.random.randn(1)
w0 = np.random.randn(1)
learning_rate = 0.01
iterations = 1000
# Prediction function f(x) = w0 + w1 * x
def predict(X, w0, w1):
return w0 + w1 * X
# Loss function: Mean Squared Error (MSE)
def compute_loss(y, y_pred):
return np.mean((y - y_pred) ** 2)
# Gradient Descent to update weights
loss_history = []
for i in range(iterations):
# Compute the predictions
y_pred = predict(X, w0, w1)
# Compute the residuals
residuals = y_pred - y
# Compute gradients (partial derivatives)
dw1 = 2 * np.mean(residuals * X)
dw0 = 2 * np.mean(residuals)
# Update parameters
w1 -= learning_rate * dw1
w0 -= learning_rate * dw0
# Compute the loss and store it
loss = compute_loss(y, y_pred)
loss_history.append(loss)
# Plot the loss function over iterations
plt.plot(loss_history)
plt.title("Loss Function Over Iterations")
plt.xlabel("Iteration")
plt.ylabel("Loss (Mean Squared Error)")
plt.show()
# Plot the original data and the final model
plt.scatter(X, y, color='blue', label="Original data")
plt.plot(X, predict(X, w0, w1), color='red', label="Fitted line")
plt.title("Linear Regression Fit")
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.show()
# Display final parameters
print(f"Final weight (w1): {w1}")
print(f"Final bias (w0): {w0}")
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
# Load and preprocess the dataset (CIFAR-10 for image classification)
(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
# Normalize pixel values to be between 0 and 1
train_images, test_images = train_images / 255.0, test_images / 255.0
# Define the CNN model
model = models.Sequential()
# Convolutional layer 1
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
# Convolutional layer 2
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
# Convolutional layer 3
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
# Flatten the data for the fully connected layer
model.add(layers.Flatten())
# Fully connected layer
model.add(layers.Dense(64, activation='relu'))
# Output layer with Softmax for classification
model.add(layers.Dense(10, activation='softmax'))
# Compile the model
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# Train the CNN model
history = model.fit(train_images, train_labels, epochs=10,
validation_data=(test_images, test_labels))
# Plot training and validation accuracy
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0, 1])
plt.legend(loc='lower right')
plt.show()
# Evaluate the model on the test set
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f"Test accuracy: {test_acc}")
import numpy as np
import matplotlib.pyplot as plt
# Generate some sample data: y = 2x + 1 with some noise
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 2 * X + 1 + np.random.randn(100, 1) * 0.1
# Initialize the parameters (weight and bias)
a = np.random.randn(1)
b = np.random.randn(1)
learning_rate = 0.01
iterations = 1000
# Function to compute the predicted value
def predict(X, a, b):
return a * X + b
# Function to compute the loss (Mean Squared Error)
def compute_loss(y_true, y_pred):
return np.mean((y_true - y_pred) ** 2)
# Gradient descent function to update the parameters
loss_history = []
for i in range(iterations):
# Compute the predicted values
y_pred = predict(X, a, b)
# Compute the residuals (error)
residuals = y_pred - y
# Compute gradients for weight (a) and bias (b)
da = 2 * np.mean(residuals * X)
db = 2 * np.mean(residuals)
# Update parameters
a -= learning_rate * da
b -= learning_rate * db
# Compute and store the loss
loss = compute_loss(y, y_pred)
loss_history.append(loss)
# Plot the loss function over iterations
plt.plot(loss_history)
plt.title("Loss Function Over Iterations (Gradient Descent)")
plt.xlabel("Iteration")
plt.ylabel("Loss (Mean Squared Error)")
plt.show()
# Plot the original data and the fitted line
plt.scatter(X, y, color='blue', label='Original data')
plt.plot(X, predict(X, a, b), color='red', label='Fitted line')
plt.title("Linear Regression Fit")
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.show()
# Display final parameters (weight and bias)
print(f"Final weight (a): {a}")
print(f"Final bias (b): {b}")
import numpy as np
# Sigmoid activation function and its derivative
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return x * (1 - x)
# Forward pass
def forward(X, weights1, weights2):
z1 = np.dot(X, weights1) # Hidden layer input
a1 = sigmoid(z1) # Hidden layer activation
z2 = np.dot(a1, weights2) # Output layer input
a2 = sigmoid(z2) # Output layer activation
return a1, a2
# Backpropagation
def backward(X, y, a1, a2, weights1, weights2, learning_rate):
# Compute output layer error
output_error = a2 - y
output_delta = output_error * sigmoid_derivative(a2)
# Compute hidden layer error
hidden_error = np.dot(output_delta, weights2.T)
hidden_delta = hidden_error * sigmoid_derivative(a1)
# Update weights
weights2 -= np.dot(a1.T, output_delta) * learning_rate
weights1 -= np.dot(X.T, hidden_delta) * learning_rate
return weights1, weights2
# Training the neural network
def train(X, y, weights1, weights2, epochs, learning_rate):
for epoch in range(epochs):
# Forward pass
a1, a2 = forward(X, weights1, weights2)
# Backward pass
weights1, weights2 = backward(X, y, a1, a2, weights1, weights2, learning_rate)
# Compute and print loss at every 100 epochs
if epoch % 100 == 0:
loss = np.mean(np.square(y - a2))
print(f"Epoch {epoch}, Loss: {loss}")
return weights1, weights2
# Example dataset (XOR problem)
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) # Input features
y = np.array([[0], [1], [1], [0]]) # Target labels
# Initialize weights randomly
np.random.seed(42)
weights1 = np.random.rand(2, 3) # Weights between input and hidden layer (2x3 matrix)
weights2 = np.random.rand(3, 1) # Weights between hidden and output layer (3x1 matrix)
# Training parameters
learning_rate = 0.1
epochs = 1000
# Train the neural network
weights1, weights2 = train(X, y, weights1, weights2, epochs, learning_rate)
# Test the neural network after training
_, a2 = forward(X, weights1, weights2)
print("Predicted outputs after training:")
print(a2)
import numpy as np
# Softmax function implementation
def softmax(logits):
exp_logits = np.exp(logits)
return exp_logits / np.sum(exp_logits, axis=0)
# Example: Simulate transformer output logits for 10,000 tokens
np.random.seed(42)
vocab_size = 10000
logits = np.random.rand(vocab_size) # Logits from the final layer before softmax
# Apply softmax to convert logits to probabilities
probabilities = softmax(logits)
# Select the token with the highest probability
predicted_token = np.argmax(probabilities)
# Print the results
print(f"Predicted token index: {predicted_token}")
print(f"Probability of the predicted token: {probabilities[predicted_token]:.4f}")
# Visualizing the top 10 most probable tokens
top_indices = np.argsort(probabilities)[-10:][::-1]
print("\nTop 10 token indices and their probabilities:")
for idx in top_indices:
print(f"Token index: {idx}, Probability: {probabilities[idx]:.4f}")
from sklearn.feature_extraction.text import CountVectorizer
import numpy as np
# Sample text
text = "Mount Fuji looks beautiful in spring."
# Tokenization: Splitting text into words (tokens)
vectorizer = CountVectorizer()
tokenized = vectorizer.fit_transform([text])
# Get token (word) to ID mapping
token_to_id = vectorizer.vocabulary_
# Example output: tokenized words and their IDs
print("Tokenized words and their IDs:")
for word, idx in token_to_id.items():
print(f"'{word}': {idx}")
# Simulate word embeddings by generating random vectors for each token
embedding_dim = 300 # Example dimension for word embeddings
embedding_matrix = {word: np.random.rand(embedding_dim) for word in token_to_id}
# Get the embedding for each token
print("\nWord embeddings (simulated):")
for word, idx in token_to_id.items():
print(f"Embedding for '{word}' (first 5 dimensions): {embedding_matrix[word][:5]}")
import numpy as np
import matplotlib.pyplot as plt
# Define a function to generate positional encodings
def positional_encoding(max_len, d_model):
# Initialize a matrix of zeros with shape (max_len, d_model)
PE = np.zeros((max_len, d_model))
# Calculate positional encodings
for pos in range(max_len):
for i in range(0, d_model, 2):
PE[pos, i] = np.sin(pos / (10000 ** (i / d_model)))
if i + 1 < d_model:
PE[pos, i + 1] = np.cos(pos / (10000 ** (i / d_model)))
return PE
# Parameters
max_len = 10 # Maximum length of the input sequence
d_model = 6 # Dimension of the model (embedding dimension)
# Generate positional encodings
PE = positional_encoding(max_len, d_model)
# Visualize the positional encoding
plt.figure(figsize=(10, 6))
plt.title("Positional Encoding")
plt.pcolormesh(PE, cmap='viridis')
plt.xlabel('Embedding Dimension')
plt.ylabel('Token Position')
plt.colorbar()
plt.show()
# Print the positional encodings for each token position
print("Positional Encodings:")
print(PE)
import numpy as np
import matplotlib.pyplot as plt
# Function to generate positional encodings
def positional_encoding(max_len, d_model):
PE = np.zeros((max_len, d_model))
for pos in range(max_len):
for i in range(0, d_model, 2):
PE[pos, i] = np.sin(pos / (10000 ** (i / d_model)))
if i + 1 < d_model:
PE[pos, i + 1] = np.cos(pos / (10000 ** ((i) / d_model)))
return PE
# Parameters
max_len = 10 # Maximum length of input sequence
d_model = 6 # Dimension of the embedding
# Generate positional encodings
PE = positional_encoding(max_len, d_model)
# Display positional encoding
print("Positional Encoding matrix:")
print(PE)
# Visualize the positional encodings
plt.figure(figsize=(10, 6))
plt.pcolormesh(PE, cmap='viridis')
plt.xlabel('Embedding Dimension')
plt.ylabel('Token Position')
plt.title('Positional Encoding')
plt.colorbar()
plt.show()
import re
from bs4 import BeautifulSoup
import spacy
from sklearn.feature_extraction.text import CountVectorizer
# 1. クレンジング: HTMLタグの除去とスペース削除
def clean_text(html_text):
# BeautifulSoupを使ってHTMLタグを除去
soup = BeautifulSoup(html_text, "lxml")
text = soup.get_text()
# 正規表現で余分なスペースを削除
text = re.sub(r'\s+', ' ', text).strip()
return text
# 2. 単語分割: spaCyを使って日本語の形態素解析
def tokenize(text):
nlp = spacy.blank("ja")
nlp.add_pipe("sudachipy_tokenizer")
doc = nlp(text)
tokens = [token.text.lower() for token in doc] # 小文字化して単語リストを返す
return tokens
# 3. 正規化: 小文字に統一 (上記 tokenize 関数内で実行済み)
# 4. ベクトル化: CountVectorizerを使ってOne-hot encodingのようにベクトル化
def vectorize(tokens):
vectorizer = CountVectorizer(tokenizer=lambda x: x, lowercase=False)
X = vectorizer.fit_transform([tokens]) # 1文に対してのベクトル化
return X.toarray(), vectorizer.get_feature_names_out()
# テスト用のHTMLテキスト
html_text = """
<html><body>
<h1>タイトル</h1>
<p>これはテストの文章です。<br>彼は犬に追われていた。</p>
</body></html>
"""
# データ処理の流れ
cleaned_text = clean_text(html_text)
tokens = tokenize(cleaned_text)
vectorized_data, feature_names = vectorize(tokens)
# 結果を表示
print("クレンジング後のテキスト:", cleaned_text)
print("単語分割後のトークン:", tokens)
print("ベクトル化結果:", vectorized_data)
print("ベクトル化に対応する単語リスト:", feature_names)
import numpy as np
# Matrix Factorization using Stochastic Gradient Descent (SGD)
class MatrixFactorization:
def __init__(self, R, K, alpha, beta, iterations):
"""
R: User-Item Rating Matrix
K: Number of latent dimensions
alpha: Learning rate
beta: Regularization parameter
iterations: Number of iterations
"""
self.R = R
self.num_users, self.num_items = R.shape
self.K = K
self.alpha = alpha
self.beta = beta
self.iterations = iterations
def train(self):
# Initialize latent factor matrices P and Q (with random values)
self.P = np.random.normal(scale=1./self.K, size=(self.num_users, self.K))
self.Q = np.random.normal(scale=1./self.K, size=(self.num_items, self.K))
# Training process with Stochastic Gradient Descent
self.b_u = np.zeros(self.num_users) # User bias
self.b_i = np.zeros(self.num_items) # Item bias
self.b = np.mean(self.R[np.where(self.R != 0)]) # Global bias
# List of training losses to monitor convergence
self.training_process = []
# Iterate over each step
for i in range(self.iterations):
for u in range(self.num_users):
for i in range(self.num_items):
if self.R[u, i] > 0: # Only process non-zero ratings
error = self.R[u, i] - self.predict(u, i)
# Update biases and latent factors using gradient descent
self.b_u[u] += self.alpha * (error - self.beta * self.b_u[u])
self.b_i[i] += self.alpha * (error - self.beta * self.b_i[i])
self.P[u, :] += self.alpha * (error * self.Q[i, :] - self.beta * self.P[u, :])
self.Q[i, :] += self.alpha * (error * self.P[u, :] - self.beta * self.Q[i, :])
# Compute the training loss
loss = self.mse()
self.training_process.append((i, loss))
if (i+1) % 10 == 0:
print(f"Iteration: {i+1}; Error: {loss}")
def predict(self, u, i):
"""Predict the rating of user u for item i"""
return self.b + self.b_u[u] + self.b_i[i] + self.P[u, :].dot(self.Q[i, :].T)
def mse(self):
"""Mean Squared Error of predictions"""
xs, ys = self.R.nonzero()
predicted = self.full_matrix()
error = 0
for x, y in zip(xs, ys):
error += (self.R[x, y] - predicted[x, y]) ** 2
return np.sqrt(error / len(xs))
def full_matrix(self):
"""Compute the full matrix with predictions for all user-item pairs"""
return self.b + self.b_u[:, np.newaxis] + self.b_i[np.newaxis:, ] + self.P.dot(self.Q.T)
# User-Item Rating Matrix (0 represents missing ratings)
R = np.array([[5, 3, 0, 1],
[4, 0, 0, 1],
[1, 1, 0, 5],
[1, 0, 0, 4],
[0, 1, 5, 4]])
# Hyperparameters
K = 2 # Number of latent dimensions
alpha = 0.01 # Learning rate
beta = 0.01 # Regularization parameter
iterations = 100 # Number of iterations
# Initialize and train Matrix Factorization model
mf = MatrixFactorization(R, K, alpha, beta, iterations)
mf.train()
# Display the completed matrix
print("\nPredicted Rating Matrix:")
print(mf.full_matrix())
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# 評価行列 (ユーザー×アイテム) - 欠損値は0で表す
R = np.array([[5, 3, 0, 1],
[4, 0, 0, 1],
[1, 1, 0, 5],
[1, 0, 0, 4],
[0, 1, 5, 4]])
def predict_missing_value(R, target_user, target_item):
"""
コサイン類似度に基づいて欠損値を推定する
:param R: 評価行列 (ユーザー×アイテム)
:param target_user: 欠損値を推定するユーザーのインデックス
:param target_item: 欠損値を推定するアイテムのインデックス
:return: 推定された評価値
"""
# 評価が存在しない(0の)部分は無視するために、欠損値を0以外のNoneに置き換える
R_nonzero = np.where(R != 0, R, np.nan)
# 1. コサイン類似度をユーザー間で計算
user_similarity = cosine_similarity(np.nan_to_num(R_nonzero))
# 2. 対象ユーザーと他ユーザーの類似度を取得
similarities = user_similarity[target_user]
# 3. 対象アイテムについて評価しているユーザーのインデックスを取得
nonzero_user_indices = np.where(R[:, target_item] != 0)[0]
if len(nonzero_user_indices) == 0:
return 0 # 他のユーザーが評価していない場合、推定できないため0を返す
# 4. 類似度に基づいた加重平均で欠損値を推定
weighted_sum = 0
sum_of_weights = 0
for user_idx in nonzero_user_indices:
weight = similarities[user_idx]
rating = R[user_idx, target_item]
weighted_sum += weight * rating
sum_of_weights += abs(weight)
if sum_of_weights == 0:
return 0 # 類似度が全くない場合、推定できないため0を返す
predicted_value = weighted_sum / sum_of_weights
return predicted_value
# 欠損値の推定例 (user3, item1 の評価を推定)
target_user = 2 # user3
target_item = 0 # item1
predicted_rating = predict_missing_value(R, target_user, target_item)
print(f"推定された評価値 (user{target_user+1}, item{target_item+1}): {predicted_rating:.2f}")
import numpy as np
class MatrixFactorization:
def __init__(self, R, K, alpha, beta, iterations):
"""
R: 評価行列 (ユーザー×アイテム)
K: 因子の次元数
alpha: 学習率
beta: 正則化パラメータ
iterations: 更新回数
"""
self.R = R
self.num_users, self.num_items = R.shape
self.K = K
self.alpha = alpha
self.beta = beta
self.iterations = iterations
def train(self):
# ユーザー因子行列 P と アイテム因子行列 Q をランダムに初期化
self.P = np.random.normal(scale=1./self.K, size=(self.num_users, self.K))
self.Q = np.random.normal(scale=1./self.K, size=(self.num_items, self.K))
# 学習プロセス: 勾配降下法による更新を繰り返す
for iteration in range(self.iterations):
for u in range(self.num_users):
for i in range(self.num_items):
if self.R[u, i] > 0: # 実際の評価が存在する箇所のみ処理
# 誤差の計算
error = self.R[u, i] - self.predict(u, i)
# P_u と Q_i の更新 (勾配降下法)
self.P[u, :] += self.alpha * (error * self.Q[i, :] - self.beta * self.P[u, :])
self.Q[i, :] += self.alpha * (error * self.P[u, :] - self.beta * self.Q[i, :])
# 損失関数の計算
loss = self.loss()
if (iteration+1) % 10 == 0:
print(f"Iteration: {iteration+1}; Loss: {loss:.4f}")
def predict(self, u, i):
"""ユーザーuがアイテムiに対して予測する評価値"""
return np.dot(self.P[u, :], self.Q[i, :].T)
def loss(self):
"""損失関数 (残差 + 正則化項) の計算"""
xs, ys = self.R.nonzero() # 実際に評価が行われている要素のみ対象
predicted = self.full_matrix()
error = 0
for x, y in zip(xs, ys):
error += (self.R[x, y] - predicted[x, y]) ** 2
# 正則化項を加える
error += self.beta * (np.linalg.norm(self.P) + np.linalg.norm(self.Q))
return np.sqrt(error)
def full_matrix(self):
"""ユーザー因子行列 P と アイテム因子行列 Q から完全な予測評価行列を生成"""
return np.dot(self.P, self.Q.T)
# 評価行列 (ユーザー×アイテム) - 0は評価が行われていない箇所
R = np.array([[5, 3, 0, 1],
[4, 0, 0, 1],
[1, 1, 0, 5],
[1, 0, 0, 4],
[0, 1, 5, 4]])
# パラメータの設定
K = 2 # 因子の次元数
alpha = 0.01 # 学習率
beta = 0.01 # 正則化パラメータ
iterations = 100 # 学習の反復回数
# Matrix Factorizationのモデルを構築して学習
mf = MatrixFactorization(R, K, alpha, beta, iterations)
mf.train()
# 予測結果の評価行列を表示
print("\n予測評価行列:")
print(mf.full_matrix())
import numpy as np
# データ生成
np.random.seed(42)
X = 2 * np.random.rand(100, 1) # 100個のランダムなデータ点 (特徴量)
y = 4 + 3 * X + np.random.randn(100, 1) # 実際の値 (正解値) w=3, b=4 を使って生成
# モデルの初期化
w = np.random.randn(1) # 重みの初期値
b = np.random.randn(1) # バイアスの初期値
alpha = 0.01 # 学習率
iterations = 1000 # 更新の回数
# 予測関数
def predict(X, w, b):
return X * w + b
# 損失関数 (平均二乗誤差)
def compute_loss(y, y_pred):
return np.mean((y - y_pred) ** 2)
# 勾配降下法によるパラメータ更新
def update_parameters(X, y, y_pred, w, b, alpha):
m = len(y)
dw = -(2/m) * np.sum((y - y_pred) * X) # 重み w に対する勾配
db = -(2/m) * np.sum(y - y_pred) # バイアス b に対する勾配
w = w - alpha * dw # 重みの更新
b = b - alpha * db # バイアスの更新
return w, b
# 学習プロセス
for i in range(iterations):
# 1. 予測値を計算
y_pred = predict(X, w, b)
# 2. 損失関数を計算
loss = compute_loss(y, y_pred)
# 3. パラメータを更新
w, b = update_parameters(X, y, y_pred, w, b, alpha)
# 進捗の表示 (10回ごとに表示)
if i % 100 == 0:
print(f"Iteration {i}, Loss: {loss:.4f}, w: {w[0]:.4f}, b: {b[0]:.4f}")
# 結果の表示
print("\n最終的なパラメータ:")
print(f"w (重み): {w[0]:.4f}")
print(f"b (バイアス): {b[0]:.4f}")
# 必要なライブラリをインポート
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
# MNISTデータセットのロード
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()
# データの前処理
train_images = train_images.reshape((train_images.shape[0], 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((test_images.shape[0], 28, 28, 1)).astype('float32') / 255
# CNNモデルの構築
model = models.Sequential()
# 畳み込み層1(32個のフィルタ、カーネルサイズ: 3x3、ReLU活性化関数)
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
# 畳み込み層2(64個のフィルタ、カーネルサイズ: 3x3、ReLU活性化関数)
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
# 畳み込み層3(64個のフィルタ、カーネルサイズ: 3x3、ReLU活性化関数)
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
# 全結合層にデータを渡すために1次元にフラット化
model.add(layers.Flatten())
# 全結合層(Dense layer、64ユニット、ReLU活性化関数)
model.add(layers.Dense(64, activation='relu'))
# 出力層(10クラス分類のためのソフトマックス関数)
model.add(layers.Dense(10, activation='softmax'))
# モデルの構成
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# モデルの概要を表示
model.summary()
# モデルの訓練
history = model.fit(train_images, train_labels, epochs=5,
validation_data=(test_images, test_labels))
# モデルの評価
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'\nテスト精度: {test_acc:.4f}')
# 訓練過程の可視化(損失値と精度の推移)
plt.plot(history.history['accuracy'], label='訓練精度')
plt.plot(history.history['val_accuracy'], label='検証精度')
plt.xlabel('エポック')
plt.ylabel('精度')
plt.legend(loc='lower right')
plt.show()
import numpy as np
# ソフトマックス関数
def softmax(z):
exp_z = np.exp(z - np.max(z)) # オーバーフロー防止のため最大値を引く
return exp_z / np.sum(exp_z, axis=1, keepdims=True)
# 交差エントロピー損失関数
def cross_entropy_loss(y_true, y_pred):
n_samples = y_true.shape[0]
logp = - np.log(y_pred[range(n_samples), y_true])
loss = np.sum(logp) / n_samples
return loss
# データの作成 (特徴量と正解ラベル)
np.random.seed(42)
X = np.random.randn(100, 3) # 100サンプル、3特徴量
y = np.random.randint(0, 3, 100) # 3クラスのラベル (0, 1, 2)
# 重みの初期化
n_features = X.shape[1]
n_classes = len(np.unique(y))
W = np.random.randn(n_features, n_classes) # 重みパラメータ
b = np.zeros((1, n_classes)) # バイアス
# 学習率とエポック数の設定
alpha = 0.01 # 学習率
n_epochs = 1000 # エポック数
# 学習ループ
for epoch in range(n_epochs):
# 1. 線形関数 (z = XW + b)
z = np.dot(X, W) + b
# 2. ソフトマックス関数で確率に変換
y_pred = softmax(z)
# 3. 損失関数の計算 (交差エントロピー)
loss = cross_entropy_loss(y, y_pred)
# 4. 勾配の計算
n_samples = X.shape[0]
y_pred[range(n_samples), y] -= 1 # 正解ラベルに対する誤差
dW = np.dot(X.T, y_pred) / n_samples # 重みに対する勾配
db = np.sum(y_pred, axis=0, keepdims=True) / n_samples # バイアスに対する勾配
# 5. パラメータの更新
W -= alpha * dW
b -= alpha * db
# 10エポックごとに損失を表示
if (epoch + 1) % 100 == 0:
print(f'Epoch {epoch+1}/{n_epochs}, Loss: {loss:.4f}')
# 学習完了後の最終損失
print(f'最終損失: {loss:.4f}')
import numpy as np
# シグモイド関数とその微分
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def sigmoid_derivative(z):
return sigmoid(z) * (1 - sigmoid(z))
# ソフトマックス関数
def softmax(z):
exp_z = np.exp(z - np.max(z, axis=1, keepdims=True))
return exp_z / np.sum(exp_z, axis=1, keepdims=True)
# 交差エントロピー損失関数
def cross_entropy_loss(y_true, y_pred):
n_samples = y_true.shape[0]
logp = - np.log(y_pred[range(n_samples), y_true])
loss = np.sum(logp) / n_samples
return loss
# データ生成
np.random.seed(42)
X = np.random.randn(100, 3) # 100サンプル、3特徴量
y = np.random.randint(0, 3, 100) # 3クラスのラベル (0, 1, 2)
# パラメータの初期化
n_features = X.shape[1]
n_hidden = 5 # 隠れ層のユニット数
n_classes = 3 # 出力クラス数
alpha = 0.01 # 学習率
epochs = 1000 # エポック数
# 重みとバイアスの初期化
W1 = np.random.randn(n_features, n_hidden)
b1 = np.zeros((1, n_hidden))
W2 = np.random.randn(n_hidden, n_classes)
b2 = np.zeros((1, n_classes))
# 学習プロセス
for epoch in range(epochs):
# 順伝播
z1 = np.dot(X, W1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, W2) + b2
a2 = softmax(z2)
# 損失関数の計算
loss = cross_entropy_loss(y, a2)
# 逆伝播(誤差の計算)
delta2 = a2
delta2[range(X.shape[0]), y] -= 1 # 出力層の誤差
dW2 = np.dot(a1.T, delta2) / X.shape[0] # W2 の勾配
db2 = np.sum(delta2, axis=0, keepdims=True) / X.shape[0] # b2 の勾配
delta1 = np.dot(delta2, W2.T) * sigmoid_derivative(z1) # 隠れ層の誤差
dW1 = np.dot(X.T, delta1) / X.shape[0] # W1 の勾配
db1 = np.sum(delta1, axis=0, keepdims=True) / X.shape[0] # b1 の勾配
# パラメータの更新
W1 -= alpha * dW1
b1 -= alpha * db1
W2 -= alpha * dW2
b2 -= alpha * db2
# 100エポックごとに損失を表示
if (epoch + 1) % 100 == 0:
print(f'Epoch {epoch+1}/{epochs}, Loss: {loss:.4f}')
# 学習終了後の損失表示
print(f'最終損失: {loss:.4f}')
from transformers import GPT2LMHeadModel, GPT2Tokenizer
# モデルとトークナイザのロード (GPT-2)
model_name = "gpt2"
model = GPT2LMHeadModel.from_pretrained(model_name)
tokenizer = GPT2Tokenizer.from_pretrained(model_name)
# モデルに入力するテキストの準備
input_text = "Once upon a time, in a land far, far away,"
# 入力テキストをトークン化
input_ids = tokenizer.encode(input_text, return_tensors="pt")
# テキスト生成
output = model.generate(
input_ids,
max_length=100, # 生成するテキストの最大長
num_return_sequences=1, # 生成するテキストの数
no_repeat_ngram_size=2, # n-gramの繰り返しを防ぐ
top_k=50, # トップKサンプリング
top_p=0.95, # トップPサンプリング (核サンプリング)
temperature=0.7 # 温度パラメータ (テキストの多様性)
)
# 生成されたテキストをデコードして表示
generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print(generated_text)
import numpy as np
# シグモイド関数とその導関数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# ソフトマックス関数
def softmax(z):
exp_z = np.exp(z - np.max(z, axis=1, keepdims=True))
return exp_z / np.sum(exp_z, axis=1, keepdims=True)
# 交差エントロピー損失関数
def cross_entropy_loss(y_true, y_pred):
n_samples = y_true.shape[0]
logp = - np.log(y_pred[range(n_samples), y_true])
loss = np.sum(logp) / n_samples
return loss
# データ生成 (2クラスの分類問題)
np.random.seed(42)
X = np.random.randn(100, 3) # 100サンプル、3特徴量
y = np.random.randint(0, 2, 100) # 2クラスのラベル (0, 1)
# パラメータの初期化
n_features = X.shape[1]
n_hidden = 5 # 隠れ層のユニット数
n_classes = 2 # 出力クラス数
alpha = 0.01 # 学習率
epochs = 1000 # エポック数
# 重みとバイアスの初期化
W1 = np.random.randn(n_features, n_hidden)
b1 = np.zeros((1, n_hidden))
W2 = np.random.randn(n_hidden, n_classes)
b2 = np.zeros((1, n_classes))
# 学習プロセス
for epoch in range(epochs):
# 順伝播
z1 = np.dot(X, W1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, W2) + b2
a2 = softmax(z2)
# 損失関数の計算
loss = cross_entropy_loss(y, a2)
# 逆伝播(誤差の計算)
delta2 = a2
delta2[range(X.shape[0]), y] -= 1 # 出力層の誤差
dW2 = np.dot(a1.T, delta2) / X.shape[0] # W2 の勾配
db2 = np.sum(delta2, axis=0, keepdims=True) / X.shape[0] # b2 の勾配
delta1 = np.dot(delta2, W2.T) * (a1 * (1 - a1)) # 隠れ層の誤差
dW1 = np.dot(X.T, delta1) / X.shape[0] # W1 の勾配
db1 = np.sum(delta1, axis=0, keepdims=True) / X.shape[0] # b1 の勾配
# パラメータの更新
W1 -= alpha * dW1
b1 -= alpha * db1
W2 -= alpha * dW2
b2 -= alpha * db2
# 100エポックごとに損失を表示
if (epoch + 1) % 100 == 0:
print(f'Epoch {epoch+1}/{epochs}, Loss: {loss:.4f}')
# テストデータで予測を実行
def predict(X, W1, b1, W2, b2):
z1 = np.dot(X, W1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, W2) + b2
a2 = softmax(z2)
return np.argmax(a2, axis=1)
# テストデータで予測
y_pred = predict(X, W1, b1, W2, b2)
# 結果の表示
print("\n予測ラベル:", y_pred[:10])
print("実際のラベル:", y[:10])
import numpy as np
# ソフトマックス関数の実装
def softmax(z):
exp_z = np.exp(z - np.max(z, axis=1, keepdims=True)) # オーバーフロー対策
return exp_z / np.sum(exp_z, axis=1, keepdims=True)
# 交差エントロピー損失関数
def cross_entropy_loss(y_true, y_pred):
n_samples = y_true.shape[0]
logp = - np.log(y_pred[range(n_samples), y_true])
loss = np.sum(logp) / n_samples
return loss
# データセットの準備(サンプルデータ)
np.random.seed(42)
X = np.random.randn(100, 3) # 100サンプル、3特徴量
y = np.random.randint(0, 3, 100) # 3クラスのラベル (0, 1, 2)
# 重みパラメータの初期化
n_features = X.shape[1]
n_classes = len(np.unique(y))
W = np.random.randn(n_features, n_classes) # 重みパラメータ
b = np.zeros((1, n_classes)) # バイアス
# 学習率とエポック数の設定
alpha = 0.01 # 学習率
epochs = 1000 # エポック数
# 学習ループ
for epoch in range(epochs):
# 1. 線形変換(z = XW + b)
z = np.dot(X, W) + b
# 2. ソフトマックス関数で確率を計算
y_pred = softmax(z)
# 3. 損失関数の計算(交差エントロピー)
loss = cross_entropy_loss(y, y_pred)
# 4. 勾配の計算
n_samples = X.shape[0]
y_pred[range(n_samples), y] -= 1 # 正解クラスに対する誤差
dW = np.dot(X.T, y_pred) / n_samples # 重みに対する勾配
db = np.sum(y_pred, axis=0, keepdims=True) / n_samples # バイアスに対する勾配
# 5. 重みとバイアスの更新
W -= alpha * dW
b -= alpha * db
# 100エポックごとに損失を表示
if (epoch + 1) % 100 == 0:
print(f'Epoch {epoch+1}/{epochs}, Loss: {loss:.4f}')
# モデルの最終的な損失を表示
print(f'最終損失: {loss:.4f}')
# テストデータでの予測関数
def predict(X, W, b):
z = np.dot(X, W) + b
y_pred = softmax(z)
return np.argmax(y_pred, axis=1)
# テストデータで予測を行う
y_pred = predict(X, W, b)
# 結果を表示
print("予測ラベル: ", y_pred[:10]) # 最初の10サンプルの予測結果
print("実際のラベル: ", y[:10]) # 実際のラベル
import numpy as np
import matplotlib.pyplot as plt
# 位置符号化の関数を実装
def positional_encoding(position, d_model):
PE = np.zeros((position, d_model))
for pos in range(position):
for i in range(0, d_model, 2):
PE[pos, i] = np.sin(pos / (10000 ** (i / d_model)))
if i + 1 < d_model:
PE[pos, i + 1] = np.cos(pos / (10000 ** (i / d_model)))
return PE
# パラメータ設定
position = 50 # トークンの位置
d_model = 16 # 埋め込みベクトルの次元
# 位置符号化の計算
PE = positional_encoding(position, d_model)
# 位置符号化を表示
plt.figure(figsize=(10, 6))
plt.pcolormesh(PE, cmap='viridis')
plt.xlabel("Embedding Dimensions")
plt.ylabel("Position")
plt.title("Positional Encoding")
plt.colorbar()
plt.show()