PostgreSQLで特定のテーブル(この場合は records テーブル)の列(項目)とそのデータ型を調べる方法
ChatGPTが応答しない時の対処方法 ―― 江端版
(1)chromeのキャッシュをクリアにする
(1)PCを立ち上げて、最初にchromeを立ち上げる(これ以外何もしてはならない)。一番最初に、Grammaryを全部OFFにして、ChatGPTを起動する。それでも応答しない場合は、ログインしなおす。
→ 現時点では、chatgptをログアウトして、ブラウザのキャッシュをリフレッシュして、再度別のブラウザを立ち上げるて、再度ログインすると、接続する可能性が高いみたい
ChatGPTが回答しない場合、いくつかの原因が考えられます。以下の対処方法をお試しください:
- 入力の確認:
- 入力した質問が明確かどうかを確認してください。不明瞭または曖昧な質問は回答を受けにくい場合があります。
- 接続の確認:
- インターネット接続に問題がないか確認してください。接続が不安定だと、質問がChatGPTに届かないことがあります。
- ページの再読み込み:
- ブラウザのページを再読み込みするか、アプリを再起動してみてください。
- ブラウザの確認:
- 異なるブラウザで試すか、ブラウザのキャッシュをクリアしてみてください。
- サポートへの連絡:
- 上記の方法で解決しない場合は、サービス提供元のサポートチームに連絡してみてください。
対処方法を試しても解決しない場合は、さらに詳細な状況を教えていただけると、より具体的なアドバイスを提供できるかもしれません。どうぞお知らせください。
OpenAIのサポートに直接連絡を取る方法は、公式のサポートチケットシステムを通じて行います。電話によるサポートは提供されていないようですが、以下の手順でサポートリクエストを送信することができます。
- OpenAIのヘルプセンター(help.openai.com)にアクセスします。
- 右下にある「Submit a request」または「リクエストを送信」をクリックします。
- 必要な情報を入力し、問題の詳細を提供します。
- リクエストを送信します。
これにより、OpenAIのサポートチームに問題が直接報告され、メールで対応を受けることができます。返信を待つ間、ヘルプセンターで関連するFAQを確認するのも役立つかもしれません。
ChatGPTとのセッションは、しばらくの間アクティビティがないとタイムアウトすることがあります。以下のような方法で、問題発生のリスクを低減できるかもしれません:
- 定期的な使用:
- ChatGPTを定期的に使用して、セッションがアクティブであることを確認してください。長時間放置すると、セッションがタイムアウトし、再度ログインする必要があるかもしれません。
- セッションのリフレッシュ:
- 長時間同じページを開いている場合は、定期的にページを更新してください。これにより、接続がリセットされ、セッションがアクティブな状態を維持できます。
- 安定したインターネット接続:
- 安定したインターネット接続を確保してください。不安定な接続は、ChatGPTとのコミュニケーションに影響を与える可能性があります。
- サインイン状態の維持:
- もし可能であれば、アカウントにサインインした状態を維持しておくことで、次回の使用時にスムーズにアクセスできる可能性が高まります。
- ブラウザの設定:
- ブラウザの設定で、タブやウィンドウを閉じてもセッション情報が保持されるように設定しておくと便利です。
これらの方法を試しても問題が解決しない場合は、前述のサポートチームへの連絡をお試しください。
セッションをリフレッシュすると、動かなくなった。
具体的な「長時間」の定義はサービス提供者によって異なり、またセッションタイムアウトの正確な時間は公開されていないことが多いです。しかし、一般的には、数十分から数時間の無活動状態が続くとセッションがタイムアウトすることが多いです。
ChatGPTを使用する際は、1時間ごとにアクティビティを行うなど、定期的に何らかの操作をすることをお勧めします。これにより、セッションがアクティブな状態を保ち、突然のタイムアウトを防ぐことができます。また、作業中に何らかの理由で長時間離れる必要がある場合は、戻ってきたときにセッションが切れている可能性があることを覚えておいてください。
ご理解いただきありがとうございます。他にもご不明な点やお困りのことがあれば、いつでもお知らせください。お手伝いできることがあれば喜んで対応させていただきます。
ChatGPTのセッションタイムアウトを防ぐために自動化ツールやスクリプトを使用することは、OpenAIの利用規約に反する可能性があります。自動化された手段を使用してサービスにアクセスすることは、サービスの過負荷や他のユーザーの体験を損なう原因となるため、推奨されません。
もし、長時間のセッションを保持する必要がある場合は、以下のような対策を検討してください:
- 定期的な手動入力: 手動で定期的にChatGPTに何かを入力することで、セッションをアクティブに保つことができます。
- セッション情報の保存: 作業を中断する前に、行った会話や重要な情報をテキストファイルなどに保存しておきます。これにより、セッションがタイムアウトしても、続きから作業を再開することができます。
- ブラウザのタブ管理: ブラウザの拡張機能を使用して、一定時間ごとにタブを自動リフレッシュする設定をすることで、セッションをアクティブに保つことができるかもしれません。ただし、これもサービスの利用規約に反する可能性があるため、使用する前には利用規約を確認してください。
サービスの規約に違反することなく、より効率的にChatGPTを使用する方法については、公式のヘルプセンターやサポートチームに相談するのが最善です。
Chromeブラウザでタブを自動的にリフレッシュするには、タブリフレッシュ機能を提供する拡張機能を使用できます。しかし、これをChatGPTのようなサービスに対して使用する前に、必ず利用規約を確認し、規約違反にならないよう注意してください。
以下は、Chromeのタブを自動リフレッシュするための一般的な手順です:
- Chrome Web Storeにアクセス: Chromeブラウザで「Chrome Web Store」にアクセスし、「Tab auto refresh」、「Auto refresh tab」などと検索します。
- 拡張機能を選択: リフレッシュ機能を提供する拡張機能の中から、評価やレビューを参考に選択します。
- 拡張機能をインストール: 選んだ拡張機能のページで「Chromeに追加」ボタンをクリックしてインストールします。
- 設定を行う: インストール後、拡張機能のアイコンをクリックして、自動リフレッシュの間隔を設定します。例えば、5分、10分、30分など、任意の間隔を設定できます。
- リフレッシュを開始: 設定が完了したら、「Start」や「Enable」ボタンをクリックして、タブの自動リフレッシュを開始します。
注意点として、自動リフレッシュ機能は、ページの読み込みやサービスへのアクセスを繰り返すことで、サーバーへの負荷を高める可能性があります。また、これを利用してサービスのセッションタイムアウトを回避することは、サービスの利用規約に反する可能性があるため、注意が必要です。
「ChatGPTが表示されない」という問題は、様々な原因によって起こる可能性があります。ここでは、一般的なトラブルシューティングのステップをご紹介します。
- ブラウザをリフレッシュする
- まず、ブラウザのリフレッシュ(再読み込み)を試みてください。これは多くの一時的な問題を解決するのに役立ちます。
- ブラウザの互換性を確認する
- 使用しているブラウザがChatGPTをサポートしているかどうかを確認してください。時には特定のブラウザでのみ正しく動作することがあります。
- キャッシュとクッキーをクリアする
- ブラウザのキャッシュやクッキーが原因で表示が妨げられることがあります。ブラウザの設定からキャッシュとクッキーをクリアしてみてください。
- 異なるブラウザやデバイスを試す
- 現在使用しているブラウザやデバイスに問題がある可能性があります。異なるブラウザや別のデバイスを試してみてください。
- インターネット接続を確認する
- インターネット接続に問題がないかを確認してください。接続が不安定だったり速度が遅い場合、ページが正しく読み込まれないことがあります。
- ブラウザの拡張機能を無効にする
- インストールされているブラウザの拡張機能が原因で問題が発生している可能性があります。拡張機能を一時的に無効にして、それが原因でないかを確認してください。
- ファイアウォールやVPNの設定を確認する
- ファイアウォールやVPNがChatGPTへのアクセスを妨げている可能性があります。設定を見直して、必要であれば変更してください。
- システムまたはブラウザの更新
- 古いシステムやブラウザでは正しく表示されないことがあります。最新のアップデートがある場合は、システムやブラウザを更新してください。
- サーバー側の問題
- ChatGPTのサーバー側に問題が発生している場合、ユーザー側では対処できません。公式の通知やサポートフォーラムをチェックして、情報を得ることが重要です。
これらのステップを試しても問題が解決しない場合は、ChatGPTのサポートチームに連絡して、さらなる支援を求めることをお勧めします。
「Linux でミリ秒まで表示するワンライナー時計」を参考にさせていただいています
Linux でミリ秒まで表示するワンライナー時計
私の場合、コンマ秒までを表示したいので、
while true ; do printf "\r%.10s" `date +%T.%N`; sleep 0.01 ; done
となります。
Ubuntuの端末で文字を大きくするには、以下の方法があります。
端末フォントサイズの変更:
通常、端末のフォントサイズを変更することで文字を大きくできます。以下の手順を実行します:
端末を開きます(通常、Ctrl+Alt+Tで起動します)。
メニューバーから「編集」をクリックし、「プロファイルの設定」を選択します。
「テキスト」タブを選択し、フォントサイズを変更します。
で、まあ、こんな風に簡単に作りました。


ラズパイのネットワーク構成を、GUIで変更する時の写真のメモ
ラズパイのネットワークI/Fを、GUIで変更した時の写真のメモ

User Mobile Agent と Mobility Agentは どちらが正しいですか
「Mobile Agent」と「Mobility Agent」は異なる概念を指しますが、どちらも「正しい」といえます。これらは用途や文脈に応じて使われます。
- Mobile Agent:
- 一般的に、ネットワーク上で自律的に移動し、タスクを実行するソフトウェアのことを指します。
- この用語は、特に分散コンピューティングや情報処理の分野で使用されます。
- Mobility Agent:
- この用語は、モビリティや交通の文脈で使用されることが多く、移動や交通に関するシステムやサービスを指す場合があります。
- 例えば、交通管理システムやスマートシティのプロジェクトにおける移動の管理や分析を行うエージェントを指すことがあります。
どちらの用語も、その分野や文脈に応じて適切に使用されます。
なるほど
『つまりMobile Agent:は、コンピュータで使われるソフトウェアであって、マルチエージェントシミュレーションのエージェントのことではない。マルチエージェントシミュレーション上で、移動するエージェントのことをMobility Agent:という』
と解釈した(江端)。
Mobile Agent:の例としては、ネットワーク管理エージェント、データマイニングエージェント、Eコマース取引エージェント、負荷分散エージェントのようなもので、マルチエージェントシミュレーション上で移動させるエージェントとは全く違う概念
以上
SELECT * FROM records WHERE start_at = '2023-03-20 05:03:00'; を"2023-03-20"が含まれているものだけを条件にするには、どのようなSQL文になりますか
SELECT * FROM records WHERE start_at = '2023-03-20 05:03:00'; を"2023-03-20"が含まれているものだけを条件にするには、どのようなSQL文になりますか
SELECT * FROM records WHERE start_at::date = '2023-03-20';
プログラムはこちら
// f:\しゅらばしゅう\有吉先生データ\Moove\2023-07/test5.go
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq"
)
type Location struct {
Lat float64 `json:"lat"`
Lng float64 `json:"lng"`
}
type Record struct {
ID int `json:"id"`
UserID int `json:"user_id"`
Distance float64 `json:"distance"`
Place []Location `json:"place"`
Speed []float64 `json:"speed"`
Prediction int `json:"prediction_type"`
StartAt string `json:"start_at"`
EndAt string `json:"end_at"`
}
func main() {
// PostgreSQL データベースへの接続情報
const (
host = "192.168.0.23"
port = 15432
user = "postgres"
password = "password"
dbname = "moove"
)
// PostgreSQL データベースへの接続
dbinfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbname)
db, err := sql.Open("postgres", dbinfo)
if err != nil {
panic(err)
}
defer db.Close()
fmt.Println("Successfully connected!")
// 検索したい日付
var targetDate string = "2023-03-03"
// 特定の日付を含むレコードを取得するクエリ
query := fmt.Sprintf("SELECT id, user_id FROM records WHERE start_at::date = '%s'", targetDate)
fmt.Println("pass1")
rows, err := db.Query(query)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
fmt.Println("pass2")
// 各行を繰り返し処理
for rows.Next() {
// ここには、取得したいカラムに応じた変数を定義します
var column1, column2 int // これは、idとuser_idのことです
// 必要に応じて他のカラムも追加
err := rows.Scan(&column1,&column2)
if err != nil {
log.Fatal(err)
}
fmt.Println(column1, column2) // 取得したデータを出力
// 他のカラムも出力する場合は、ここに追加
}
// 繰り返し処理後のエラーをチェック
err = rows.Err()
if err != nil {
log.Fatal(err)
}
}
NAT購入したのですが、設置場所のセグメントが、メインのセグメントと違ったので、ポートフォワードで対応しました
先日、1年分の研究成果がぎっしり詰ったPCが、立ち上がらなくなるというシャレにならない状況に直面し、昨日、2TBのNASを購入しました(以下の話と関係があります)。
NASは、できるだけ風通しのよい温度の低い環境の設置が望ましいので、液晶テレビの外付けHDDが置いている場所に併設しようと思いましたが、テレビ用のネットワークを別セグメントにしていたため、NASのIPが届かないことが判明しました。
ルータをブリッジモードにすれば良いのですが、そうすると既存の設定にも影響が出てきそうなの(というか、間違いなく問題が発生するだろう)で、できるだけルータの構成をかえずに対応したいと思いました。
で、ChatGPTに、以下の質問して、回答を貰いました。

私は、SMBだけ通れば良いので、ルータに以下の設定(ポート転送)をしました。

(めずらしく)さくっと、NASが通りました。
これで、研究成果が吹き飛ぶという恐怖が、幾分軽減しました。
PythonのGAで色々なんとかする
Pythonを使った因子分析のコード を そのまま使わせて頂いています。
【Pythonで行う】因子分析
# ebata@DESKTOP-P6KREM0:/mnt/c/Users/ebata/go-efa$ python3 main3.py
# ライブラリのインポート
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
from factor_analyzer import FactorAnalyzer
# データの読み込み
df_workers = pd.read_csv("sample_factor.csv")
print(df_workers)
# 変数の標準化
df_workers_std = df_workers.apply(lambda x: (x-x.mean())/x.std(), axis=0)
# 固有値を求める
ei = np.linalg.eigvals(df_workers.corr())
print("固有値", ei)
# 因子分析の実行
fa = FactorAnalyzer(n_factors=2, rotation="promax")
fa.fit(df_workers_std)
# 因子負荷量,共通性
loadings_df = pd.DataFrame(fa.loadings_, columns=["第1因子", "第2因子"])
loadings_df.index = df_workers.columns
loadings_df["共通性"] = fa.get_communalities()
print(loadings_df)
# 因子負荷量の二乗和,寄与率,累積寄与率
var = fa.get_factor_variance()
df_var = pd.DataFrame(list(zip(var[0], var[1], var[2])),
index=["第1因子", "第2因子"],
columns=["因子負荷量の二乗和", "寄与率", "累積寄与率"])
print(df_var.T)
# バイプロットの作図
score = fa.transform(df_workers_std)
coeff = fa.loadings_.T
fa1 = 0
fa2 = 1
labels = df_workers.columns
annotations = df_workers.index
xs = score[:, fa1]
ys = score[:, fa2]
n = score.shape[1]
scalex = 1.0 / (xs.max() - xs.min())
scaley = 1.0 / (ys.max() - ys.min())
X = xs * scalex
Y = ys * scaley
for i, label in enumerate(annotations):
plt.annotate(label, (X[i], Y[i]))
for j in range(coeff.shape[1]):
plt.arrow(0, 0, coeff[fa1, j], coeff[fa2, j], color='r', alpha=0.5,
head_width=0.03, head_length=0.015)
plt.text(coeff[fa1, j] * 1.15, coeff[fa2, j] * 1.15, labels[j], color='r',
ha='center', va='center')
plt.xlim(-1, 1)
plt.ylim(-1, 1)
plt.xlabel("第1因子")
plt.ylabel("第2因子")
plt.grid()
plt.show()
Pythonを使ったGAのコード を そのまま使わせて頂いています。
【python】遺伝的アルゴリズム(Genetic Algorithm)を実装してみる
遺伝配列を0/1を、便宜的に0~4にして動くよう、一部改造させて頂いております。
# ebata@DESKTOP-P6KREM0:/mnt/c/Users/ebata/go-efa$ python3 ga.py
import numpy as np
import matplotlib.pyplot as plt
class Individual:
'''各個体のクラス
args: 個体の持つ遺伝子情報(np.array)'''
def __init__(self, genom):
self.genom = genom
self.fitness = 0 # 個体の適応度(set_fitness関数で設定)
self.set_fitness()
def set_fitness(self):
'''個体に対する目的関数(OneMax)の値をself.fitnessに代入'''
self.fitness = self.genom.sum()
def get_fitness(self):
'''self.fitnessを出力'''
return self.fitness
def mutate(self):
'''遺伝子の突然変異'''
tmp = self.genom.copy()
i = np.random.randint(0, len(self.genom) - 1)
# tmp[i] = float(not self.genom[i])
tmp[i] = np.random.randint(0, 5) # 江端修正
self.genom = tmp
self.set_fitness()
def select_roulette(generation):
'''選択の関数(ルーレット方式)'''
selected = []
weights = [ind.get_fitness() for ind in generation]
norm_weights = [ind.get_fitness() / sum(weights) for ind in generation]
selected = np.random.choice(generation, size=len(generation), p=norm_weights)
return selected
def select_tournament(generation):
'''選択の関数(トーナメント方式)'''
selected = []
for i in range(len(generation)):
tournament = np.random.choice(generation, 3, replace=False)
max_genom = max(tournament, key=Individual.get_fitness).genom.copy()
selected.append(Individual(max_genom))
return selected
def crossover(selected):
'''交叉の関数'''
children = []
if POPURATIONS % 2:
selected.append(selected[0])
for child1, child2 in zip(selected[::2], selected[1::2]):
if np.random.rand() < CROSSOVER_PB:
child1, child2 = cross_two_point_copy(child1, child2)
children.append(child1)
children.append(child2)
children = children[:POPURATIONS]
return children
def cross_two_point_copy(child1, child2):
'''二点交叉'''
size = len(child1.genom)
tmp1 = child1.genom.copy()
tmp2 = child2.genom.copy()
cxpoint1 = np.random.randint(1, size)
cxpoint2 = np.random.randint(1, size - 1)
if cxpoint2 >= cxpoint1:
cxpoint2 += 1
else:
cxpoint1, cxpoint2 = cxpoint2, cxpoint1
tmp1[cxpoint1:cxpoint2], tmp2[cxpoint1:cxpoint2] = tmp2[cxpoint1:cxpoint2].copy(), tmp1[cxpoint1:cxpoint2].copy()
new_child1 = Individual(tmp1)
new_child2 = Individual(tmp2)
return new_child1, new_child2
def mutate(children):
for child in children:
if np.random.rand() < MUTATION_PB:
child.mutate()
return children
def create_generation(POPURATIONS, GENOMS):
'''初期世代の作成
return: 個体クラスのリスト'''
generation = []
for i in range(POPURATIONS):
# individual = Individual(np.random.randint(0, 2, GENOMS))
individual = Individual(np.random.randint(0, 5, GENOMS))
generation.append(individual)
return generation
def ga_solve(generation):
'''遺伝的アルゴリズムのソルバー
return: 最終世代の最高適応値の個体、最低適応値の個体'''
best = []
worst = []
# --- Generation loop
print('Generation loop start.')
for i in range(GENERATIONS):
# --- Step1. Print fitness in the generation
best_ind = max(generation, key=Individual.get_fitness)
best.append(best_ind.fitness)
worst_ind = min(generation, key=Individual.get_fitness)
worst.append(worst_ind.fitness)
print("Generation: " + str(i) \
+ ": Best fitness: " + str(best_ind.fitness) \
+ ". Worst fitness: " + str(worst_ind.fitness))
# --- Step2. Selection (Roulette)
# selected = select_roulette(generation)
selected = select_tournament(generation)
# --- Step3. Crossover (two_point_copy)
children = crossover(selected)
# --- Step4. Mutation
generation = mutate(children)
print("Generation loop ended. The best individual: ")
print(best_ind.genom)
return best, worst
np.random.seed(seed=65)
# param
POPURATIONS = 100
# GENOMS = 50 # 江端修正
GENOMS = 160
GENERATIONS = 1000
CROSSOVER_PB = 0.8
MUTATION_PB = 0.1
# create first genetarion
generation = create_generation(POPURATIONS, GENOMS)
# solve
best, worst = ga_solve(generation)
# plot
fig, ax = plt.subplots()
ax.plot(best, label='max')
ax.plot(worst, label='min')
ax.axhline(y=GENOMS, color='black', linestyle=':', label='true')
ax.set_xlim([0, GENERATIONS - 1])
#ax.set_ylim([0, GENOMS * 1.1])
ax.set_ylim([0, GENOMS * 2.2])
ax.legend(loc='best')
ax.set_xlabel('Generations')
ax.set_ylabel('Fitness')
ax.set_title('Tournament Select')
plt.show()


明日は、この2つをマージして、目的のプログラムを完成させます。
以下のプログラムは、20個のデータを使って因子分析を行い、その分析因子分析を同じ結果を生み出す200個のダミーデータを作成します。
アルゴリズムの説明は省略します(が、私は分かっています)。
まず、データ(sample_factory.csv)
x1,x2,x3,x4,x5,x6,x7,x8
2,4,4,1,3,2,2,1
5,2,1,3,1,4,2,1
2,3,4,3,4,2,4,5
2,2,2,2,3,2,2,2
5,4,3,4,4,5,4,3
1,4,4,2,4,3,2,3
3,1,1,1,1,2,1,1
5,5,3,5,4,5,3,5
1,3,4,1,3,1,3,1
4,4,3,1,4,4,2,1
3,3,3,2,4,4,4,2
1,2,1,3,1,1,1,1
5,2,3,5,2,5,1,3
4,1,1,3,1,2,2,1
1,1,1,1,2,1,2,1
3,1,2,1,1,3,2,1
1,2,3,5,2,2,2,2
3,1,1,3,2,4,2,1
3,2,3,2,2,2,2,5
1,4,3,1,4,3,5,3
以下、GAのコード
# ebata@DESKTOP-P6KREM0:/mnt/c/Users/ebata/go-efa$ python3 ga-factory2.py
# ライブラリのインポート
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# import japanize_matplotlibe
from factor_analyzer import FactorAnalyzer
import matplotlib.pyplot as plt
class Individual:
'''各個体のクラス
args: 個体の持つ遺伝子情報(np.array)'''
def __init__(self, genom):
self.genom = genom
self.fitness = 0 # 個体の適応度(set_fitness関数で設定)
self.set_fitness()
def set_fitness(self):
'''個体に対する目的関数(OneMax)の値をself.fitnessに代入'''
# まずgenomを行列にデータに変換する
# self.fitness = self.genom.sum()
# 遺伝子列を行列に変換
arr2d = self.genom.reshape((-1, 8)) # 列が分からない場合は、-1にするとよい
# 各列の平均と標準偏差を計算
mean = np.mean(arr2d, axis=0)
std = np.std(arr2d, axis=0)
# 標準偏差値に変換
standardized_arr2d = (arr2d - mean) / std
# 因子分析の実行
fa_arr2d = FactorAnalyzer(n_factors=2, rotation="promax")
fa_arr2d.fit(standardized_arr2d)
# 因子分析行列の算出
loadings_arr2d = fa_arr2d.loadings_
# 因子分析行列の差分算出
distance2 = euclidean_distance(fa.loadings_, loadings_arr2d)
# print(distance2)
# とりあえず評価関数をこの辺から始めてみる
self.fitness = 1 / distance2
def get_fitness(self):
'''self.fitnessを出力'''
return self.fitness
def mutate(self):
'''遺伝子の突然変異'''
tmp = self.genom.copy()
i = np.random.randint(0, len(self.genom) - 1)
# tmp[i] = float(not self.genom[i])
tmp[i] = np.random.randint(1, 6) # 江端修正
self.genom = tmp
self.set_fitness()
def euclidean_distance(matrix_a, matrix_b):
# 行列Aと行列Bの要素ごとの差を計算します
diff = matrix_a - matrix_b
# 差の二乗を計算します
squared_diff = np.square(diff)
# 差の二乗の和を計算します
sum_squared_diff = np.sum(squared_diff)
# 和の平方根を計算します
distance = np.sqrt(sum_squared_diff)
return distance
def select_roulette(generation):
'''選択の関数(ルーレット方式)'''
selected = []
weights = [ind.get_fitness() for ind in generation]
norm_weights = [ind.get_fitness() / sum(weights) for ind in generation]
selected = np.random.choice(generation, size=len(generation), p=norm_weights)
return selected
def select_tournament(generation):
'''選択の関数(トーナメント方式)'''
selected = []
for i in range(len(generation)):
tournament = np.random.choice(generation, 3, replace=False)
max_genom = max(tournament, key=Individual.get_fitness).genom.copy()
selected.append(Individual(max_genom))
return selected
def crossover(selected):
'''交叉の関数'''
children = []
if POPURATIONS % 2:
selected.append(selected[0])
for child1, child2 in zip(selected[::2], selected[1::2]):
if np.random.rand() < CROSSOVER_PB:
child1, child2 = cross_two_point_copy(child1, child2)
children.append(child1)
children.append(child2)
children = children[:POPURATIONS]
return children
def cross_two_point_copy(child1, child2):
'''二点交叉'''
size = len(child1.genom)
tmp1 = child1.genom.copy()
tmp2 = child2.genom.copy()
cxpoint1 = np.random.randint(1, size)
cxpoint2 = np.random.randint(1, size - 1)
if cxpoint2 >= cxpoint1:
cxpoint2 += 1
else:
cxpoint1, cxpoint2 = cxpoint2, cxpoint1
tmp1[cxpoint1:cxpoint2], tmp2[cxpoint1:cxpoint2] = tmp2[cxpoint1:cxpoint2].copy(), tmp1[cxpoint1:cxpoint2].copy()
new_child1 = Individual(tmp1)
new_child2 = Individual(tmp2)
return new_child1, new_child2
def mutate(children):
for child in children:
if np.random.rand() < MUTATION_PB:
child.mutate()
return children
def create_generation(POPURATIONS, GENOMS):
'''初期世代の作成
return: 個体クラスのリスト'''
generation = []
for i in range(POPURATIONS): # POPURATIONS = 100
# individual = Individual(np.random.randint(0, 2, GENOMS))
individual = Individual(np.random.randint(1, 6, GENOMS))
generation.append(individual)
return generation
def ga_solve(generation):
'''遺伝的アルゴリズムのソルバー
return: 最終世代の最高適応値の個体、最低適応値の個体'''
best = []
worst = []
# --- Generation loop
print('Generation loop start.')
for i in range(GENERATIONS):
# --- Step1. Print fitness in the generation
best_ind = max(generation, key=Individual.get_fitness)
best.append(best_ind.fitness)
worst_ind = min(generation, key=Individual.get_fitness)
worst.append(worst_ind.fitness)
print("Generation: " + str(i) \
+ ": Best fitness: " + str(best_ind.fitness) \
+ ". Worst fitness: " + str(worst_ind.fitness))
# --- Step2. Selection (Roulette)
# selected = select_roulette(generation)
selected = select_tournament(generation)
# --- Step3. Crossover (two_point_copy)
children = crossover(selected)
# --- Step4. Mutation
generation = mutate(children)
print("Generation loop ended. The best individual: ")
print(best_ind.genom)
return best, worst
np.random.seed(seed=65)
# param
POPURATIONS = 100 # 個体数
# GENOMS = 50 # 江端修正
# GENOMS = 160 # GENの長さ
GENOMS = 1600 # GENの長さ 1つのデータが8個の整数からなるので、合計200個のデ0タとなる
GENERATIONS = 1000
CROSSOVER_PB = 0.8
# MUTATION_PB = 0.1
MUTATION_PB = 0.3 # ミューテーションは大きい方が良いように思える
# ファイルからデータの読み込み
df_workers = pd.read_csv("sample_factor.csv")
print(df_workers)
# 変数の標準化
df_workers_std = df_workers.apply(lambda x: (x-x.mean())/x.std(), axis=0)
print(df_workers_std)
# 固有値を求める(不要と思うけど、残しておく)
ei = np.linalg.eigvals(df_workers.corr())
print(ei)
print("因子分析の実行") # 絶対必要
fa = FactorAnalyzer(n_factors=2, rotation="promax")
fa.fit(df_workers_std)
# print(fa.loadings_) # これが因子分析の行列
# 因子負荷量,共通性(不要と思うけど、残しておく)
loadings_df = pd.DataFrame(fa.loadings_, columns=["第1因子", "第2因子"])
loadings_df.index = df_workers.columns
loadings_df["共通性"] = fa.get_communalities()
# 因子負荷量の二乗和,寄与率,累積寄与率(不要と思うけど、残しておく)
var = fa.get_factor_variance()
df_var = pd.DataFrame(list(zip(var[0], var[1], var[2])),
index=["第1因子", "第2因子"],
columns=["因子負荷量の二乗和", "寄与率", "累積寄与率"])
print(df_var.T)
# create first genetarion
generation = create_generation(POPURATIONS, GENOMS)
# solve
best, worst = ga_solve(generation)
# plot
#fig, ax = plt.subplots()
#ax.plot(best, label='max')
#ax.plot(worst, label='min')
#ax.axhline(y=GENOMS, color='black', linestyle=':', label='true')
#ax.set_xlim([0, GENERATIONS - 1])
#ax.set_ylim([0, GENOMS * 1.1])
#ax.legend(loc='best')
#ax.set_xlabel('Generations')
#ax.set_ylabel('Fitness')
#ax.set_title('Tournament Select')
#plt.show()
ga-factory2.py :200固体 主成分行列からの距離は、distance2(これが一致度) 評価関数は、この逆数を使っているだけ
ga-factory3.py :2000固体
以上
【QGIS】緯度・経度をもつCSVデータを読み込み、地図に表示する
【QGIS】緯度・経度をもつCSVデータを読み込み、地図に表示する
Lat, Lng
35.3663 , 139.6225
35.3669 , 139.6245
35.3673 , 139.6259
35.3672 , 139.6268
35.3673 , 139.6296
35.3668 , 139.6296
35.367 , 139.6296
35.3671 , 139.6297
35.3672 , 139.6298
35.368 , 139.622(以下、省略)
(2)CSVファイルの読み込み
(3)結果

以上

