【ネットワーク】お勉強1

【第3回】

  • プロトコル  ネットワークの約束事
  • TCP/IP  プロトコルの一種で最も有名
  • 帯域幅  毛0ブルの性能規格を説明するときに使う言葉で本来の意味は使用できる周波数,最近はデータ転送速度を指す
  • bps  一秒間に何ビット送れるかの単位

【第4回】

第7層 Application Layer
第6層 Presentation Layer
第5層 Sessiion Layer
第4層 Transport Layer
第3層 Network Layer
第2層 Data-Link Layer
第1層 Physical Layer

【第5回】

各レイヤでは機能が違い,独立している.
特定の機能を理解するためにはそのレイヤだけを考えればよい.
機能変更があってもそのレイヤ以外に影響が及ばない.

  • Application Layer

ネットワークサービスを提供
ネットワークが可能かどうか判断する.

  • Presentation Layer

データの形式を決定する.

  • Session Layer

セッションを管理する.
会話(通信)の行き違いがないように会話の流れを管理する.

  • Transport Layer

信頼性の高い通信サービスを保証する.
信頼性の高いとは相手に確実に届けるなど.

  • Network Layer

離れた場所とのデータの伝送,運ぶルートの決定,宛先の決定などを行う.

  • Datalink Layer

近くの機器とのデータの伝送制御を行う.

  • Physical Layer

電気,機械的なルールを決める.
電気信号をやり取りする.

【Python】ループ中の要素の削除

for element in LIST:
    if ---:
        LIST.remove(element)

for i,enumerate in LIST:
    if ---:
        del LIST[i]

上でValueErrorが出たが下で書きなおしたら出なくなった.
全体の処理的には同じ位置を削除するようにしたつもりだけど何故だろう.

k-means法 準備

k-means法で理想的な結果が出せるようにデータを予めプロットしておく方法

# -*- coding: utf-8 -*- impo
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
X,y = make_blobs(n_samples=150, #サンプル点の総数
                n_features=2,   #特徴量の個数
                centers=5,      #クラスタの個数
                cluster_std=0.5,#クラスタの標準偏差
                shuffle=True,   #サンプルをシャッフル
                random_state=0) #乱数生成器の状態を指定
plt.scatter(X[:,0],X[:,1],c='blue',marker='o',s=30)
plt.grid()
plt.show()

plt.scatter()の色指定はcolorはcでもイイらしい.
横軸にX[:,0],縦軸にX[:,1]をセット
X[:,0]はXの全ての要素の1つ目の要素という意味

plt.scatter(X[:,0],X[:,1],c='blue',marker='o',s=30)

f:id:umashika5555:20170411075422p:plain

Irisのデータプロット

# -*- coding: utf-8 -*- impo

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
#データの取得
df = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data",header=None)
df.tail()
#1-100行目の目的変数の抽出
y = df.iloc[0:100,4].values
#Iris-setosaを-1,Iris-virginicaを1に変換
y = np.where(y=="Iris-setosa",-1,1)
#1-100行目の1,3列目の抽出
X = df.iloc[0:100,[0,2]].values
#品種setosaのプロット(赤の○)
plt.scatter(X[:50,0],X[:50,1],color='red',marker='o',label='setosa')
#品種versicolorのプロット(青のx)
plt.scatter(X[50:100,0],X[50:100,1],color='blue',marker='x',label='varsicolor')
#軸のラベルの設定
plt.xlabel('sepal length [cm]')
plt.ylabel('pepal length [cm]')
#判例の設定
plt.legend(loc='upper left')
#図の表示
plt.show()

ラベルの変換方法
名前(文字列)を数値に変換

y = np.where(y == 'Iris-setosa',-1,1)

1-100行目の1,3列目の抽出をする.

X = df.iloc[0:100,[0,2]].values

f:id:umashika5555:20170411073916p:plain

1-50行目の1つ目の要素をX軸に2つ目の要素をY軸とし青xをプロット

plt.scatter(X[:50,0],X[:50,1],color='blue',marker='x',label='varsicolor')

f:id:umashika5555:20170411075055p:plain

Tweepy

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tweepy

CONSUMER_KEY = '-----------------------'                             # Consumer Key
CONSUMER_SECRET = '-----------------------'         # Consumer Secret
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
ACCESS_TOKEN = '-----------------------' # Access Token
ACCESS_SECRET = '-----------------------'         # Accesss Token Secert
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)

#APIインスタンスを作成
api = tweepy.API(auth)

# これだけで、Twitter APIをPythonから操作するための準備は完了。
print('Done!')

#タイムライン上の最新ツイートを参照する
print api.home_timeline()[0].text

#自分のアカウントでつぶやく
api.update_status(status='test from Tweepy')  

#ツイート検索
#エラー出た
search_result = api.search(q='もふもふ')
for result in search_result:
    print result.text

www.statsbeginner.net

k-means法問題点

【k-means法の問題点】
空になるクラスタが存在する可能性があること.(Fuzzy C-means法(k-medoids)ではこの問題は生じない.)
scikit-learnのk-means実装ではこの問題には対処できている.
クラスタが空の場合,空のクラスタのセントロイドから最も離れているサンプルを探す.この最も離れた点がセントロイドになるようにセントロイドの割当を変更する.


クラスタがオーバーラップしない,階層的ではない.

クラスタに少なくとも1つアイテムが存在することが前提.

k-means法

k-means法はプロトタイプベース(prototype-based)クラスタリングというカテゴリに属している.
アルゴリズムは以下の通りである.

1.クラスタの中心の初期値として,サンプル点からk個のセントロイドをランダムに選びだす.
2.各サンプルを最も近いセントロイドに割り当てる.
3.セントロイドに割り当てられたサンプルの中心にセントロイドを移動する.
4.サンプル点へのクラスタの割当が変化しなくなるか,ユーザー定義の許容値またはイテレーションの最大回数に達するまでステップ2-3を繰り返す.

ステップ4について,オブジェクトの類似度を測定するにはm次元空間にある2つの点
xベクトルとyベクトルのユークリッド距離の2乗は
 d(x,y)^2=\sum_{j=1}^{m}(x_{j}-y_{j})^{2} = |x-y|_{2}^{2}

ABC022_C

頂点1を含まないグラフを考えてその最短経路を作れば良いと思ったが
頂点1を含まないグラフの作り方 == 頂点1に隣接している頂点の選び方O(N^2)
dijkstra法O(N^2)
よって全体でO(N^4)掛かってしまい案の定TLEだった.

#include <bits/stdc++.h>
using namespace std;
static const int WHITE = 0;
static const int GRAY = 1;
static const int BLACK = 2;
static const int INF = 1<<21;
static const int MAX_N = 300;
static const int MAX_M = 45000;
int n,m;
int res = INF;
int u[MAX_M],v[MAX_M],l[MAX_M];
int M[MAX_N][MAX_N];
int color[MAX_N],d[MAX_N];

void dijkstra(int s){//最短経路を求める
    int mincost;
    //初期化:全ての頂点uに対してcolor[u]をWHITE,d[u]をINF,d[s]=0,p[s]=-1;
    for(int u=0;u<n;u++){
        color[u] = WHITE;
        d[u] = INF;
    }
    d[s] = 0;
    color[s] = GRAY;

    while(1){
        mincost = INF;
        int u = -1;
        for(int i=0;i<n;i++){
            if(color[i]!=BLACK && d[i]<mincost){
                mincost = d[i];
                u = i;
            }
        }
        if(u==-1){
            break;
        }
        color[u] = BLACK;
        for(int v=0;v<n;v++){
            if(color[v]!=BLACK && M[u][v]!=INF){
                if(d[v]>d[u]+M[u][v]){
                    d[v] = d[u]+M[u][v];
                    color[v] = GRAY;
                }
            }
        }
    }
}
int main()
{
    cin>>n>>m;
    for(int i=0;i<m;i++){
        cin>>u[i]>>v[i]>>l[i];//家u[i]から家v[i]までの距離がl[i]
    }
    //隣接グラフにする
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            M[i][j] = INF;
        }
    }
    for(int i=0;i<m;i++){
        M[u[i]-1][v[i]-1] = l[i];
        M[v[i]-1][u[i]-1] = l[i];
    }
    //始点1に隣接する接点を2つ選ぶ
    for(int i=0;i<n-1;i++){
        for(int j=i+1;j<n;j++){
            if(M[0][i]!=INF && M[0][j]!=INF){//始点に2つ隣接する頂点があったら
                int tmp1 = M[0][i];
                int tmp2 = M[0][j];
                M[0][i] = INF;
                M[0][j] = INF;
                dijkstra(i);
                res = min(res,tmp1 + tmp2 + d[j]);
                M[0][i] = tmp1;
                M[0][j] = tmp2;
            }
        }
    }
    if(res==INF)res = -1;
    cout<<res<<endl;
    return 0;
}

そこでwarshall_froyd法を用いた.
warshall_floyd法はグラフの全ての頂点の間の最短路を見つけるアルゴリズム.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

typedef vector<vector<int> > Matrix;

const int INF = 1<<21;
Matrix d;//隣接行列

void warshall_floyd(int n){//n:頂点数
    for(int i=0;i<n;i++){//経由する頂点
        for(int j=0;j<n;j++){//開始頂点
            for(int k=0;k<n;k++){//終端
                d[j][k] = min(d[j][k],d[j][i] + d[i][k]);//j->kの経路がiを経由して短縮できたら更新する
            }
        }
    }
}

int main(){
    int n,m;
    cin>>n;
    d = Matrix(n,vector<int>(n,INF));//n*n行列,要素はINF
    for(int i=0;i<n;i++){
        d[i][i] = 0;
    }
    cin>>m;
    for(int i=0;i<m;i++){
        int from,to,cost;
        cin>>from>>to>>cost;
        d[from][to] = cost;
        d[to][from] = cost;
    }

    warshall_floyd(n);

    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(i!=j && d[i][j]!=INF){
                cout<<i<<"から"<<j<<"へのコスト:"<<d[i][j]<<endl;
            }
        }
    }
    return 0;
}

最短経路問題(ベルマンフォード法・ワーシャルフロイド法) - アルゴリズム講習会
abc022.contest.atcoder.jp
解答

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
static const int MAX_N = 300;
typedef vector<vector<int> > Matrix;

const int INF = 1<<29;
Matrix d;//隣接行列

void warshall_floyd(int n){//n:頂点数
    for(int i=1;i<n;i++){//経由する頂点
        for(int j=1;j<n;j++){//開始頂点
            for(int k=1;k<n;k++){//終端
                d[j][k] = min(d[j][k],d[j][i] + d[i][k]);//j->kの経路がiを経由して短縮できたら更新する
            }
        }
    }
}

int main(){
    int n,m;
    cin>>n;
    d = Matrix(n,vector<int>(n,INF));//n*n行列,要素はINF
    for(int i=0;i<n;i++){
        d[i][i] = 0;
    }
    cin>>m;
    for(int i=0;i<m;i++){
        int from,to,cost;
        cin>>from>>to>>cost;
        d[from-1][to-1] = cost;
        d[to-1][from-1] = cost;
    }

    //WFで頂点1以外の最短経路を更新
    warshall_floyd(n);

    //頂点1から隣接した2点に
    int res = INF;
    for(int i=1;i<n-1;i++){
        for(int j=i+1;j<n;j++){
            res = min(res,d[0][i]+d[0][j]+d[i][j]);
        }
    }
    cout<<(res!=INF?res:-1)<<endl;
    return 0;
}

ABC007_C

幅優先探索の問題
queueにいれて順番に計算していく.
座標を扱う際にtypedefが便利

typedef pair<int,int> P;
que.push(P(x,y));
#include <bits/stdc++.h>
using namespace std;
int r,c,sx,sy,gx,gy;
int dx[4] = {1,0,-1,0},dy[4] = {0,1,0,-1};
static const int MAX_R =50;
static const int INF = 1<<21;
char M[MAX_R][MAX_R+1];
int D[MAX_R][MAX_R];
typedef pair<int,int> P;

int main()
{
    queue<P> que;
    cin>>r>>c>>sy>>sx>>gy>>gx;
    sy--;sx--;gy--;gx--;
    string tmp;
    for(int y=0;y<r;y++){
        cin>>tmp;
        for(int x=0;x<c;x++){
            M[y][x] = tmp[x];
            D[y][x] = INF;
        }
    }
    D[sy][sx] = 0;
    que.push(P(sx,sy));
    while(!que.empty()){
        P p = que.front();que.pop();
        int x = p.first;
        int y = p.second;
        if(x==gx && y==gy)break;
        for(int i=0;i<4;i++){
            int nx = x + dx[i];
            int ny = y + dy[i];
            if(0<=nx && nx<c && 0<=ny && ny<r && M[ny][nx]=='.' && D[ny][nx]==INF){
                que.push(P(nx,ny));
                D[ny][nx] = D[y][x] + 1;
            }    
        }
    }
    cout<<D[gy][gx]<<endl;
    return 0;
}