2016年1月17日日曜日

pythonでのコピー

python での値のコピー
a=b とやると値参照になるので注意!!
http://bugrammer.g.hatena.ne.jp/nisemono_san/20111210/1323444429
http://lightson.dip.jp/zope/ZWiki/084_e9_85_8d_e5_88_97_e3_82_92_e8_a4_87_e8_a3_bd_e3_81_99_e3_82_8b
pythonでの配列のコピー
   >>> import copy
   >>> e = copy.deepcopy(d)
   >>> b[0] = "b"
   >>> d
   (['a', 1, 2], ['b', 4, 5])
   >>> e
   (['a', 1, 2], [3, 4, 5])

pythonで転置行列にする(Numpyなし)

文字列を行列に含んでいるとNumpyでは面倒なので調べた。
data =
[['O', 'A', 'B', 'C', 'D', 'E', 'F'], 
 ['P', 'A11', 'A12', 'A13', 'A14', 'A15', 'A16'], 
 ['Q', 'A21', 'A22', 'A23', 'A24', 'A25', 'A26'], 
 ['R', 'A31', 'A32', 'A33', 'A34', 'A35', 'A36']]
のとき、

data2 = list(map(list, zip(*data)))
とするとできた。
data2 = 
[['O', 'P', 'Q', 'R'], 
 ['A', 'A11', 'A21', 'A31'], 
 ['B', 'A12', 'A22', 'A32'], 
 ['C', 'A13', 'A23', 'A33'], 
 ['D', 'A14', 'A24', 'A34'], 
 ['E', 'A15', 'A25', 'A35'], 
 ['F', 'A16', 'A26', 'A36']]

参照: http://asiagohan.hatenablog.com/entry/2015/05/08/170715
こちらのやり方もできた。
http://lightson.dip.jp/blog/seko/2830
def invert_lst(lst):
       col = len(lst[0])
       row = len(lst)
       inv = []
       for i in range(col):
               l = []
               for j in range(row):
                       l.append('')
               inv.append(l)                   
       for i in range(row):
               for j in range(col):
                       inv[j][i] = lst[i][j]
       return inv
       
lst = [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
print invert_lst(lst)

>>>[[1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3]]

pythonでループでのインデックス

pythonでループでのインデックス

>>> list1 = ['a', 'b', 'c']
>>> for (i, x) in enumerate(list1):
...   print i,x
... 
0 a
1 b
2 c

pythonで多次元配列の行と列の長さ取得

pythonで多次元配列の行と列の長さ取得

list = [[1, 2, 3], [4, 5, 6]] # 2x3行列のとき

print len(list) # 表示されるのは 2。 行の長さ
print len(list[0]) # 表示されるのは 3。列の長さ

2016年1月14日木曜日

ひまがなくなってしまった。。。

機械学習を勉強したいけど、仕事の次のプロジェクトが本格的に動き出してしまいまったくもって勉強する時間がなくなってしまった。

2016年1月1日金曜日

Cousera Machine Learning / week5-5 めも

Gradient Checking

epsilon = 1e-4;
for i = 1:n,
  thetaPlus = theta;
  thetaPlus(i) += epsilon;
  thetaMinus = theta;
  thetaMinus(i) -= epsilon;
  gradApprox(i) = (J(thetaPlus) - J(thetaMinus))/(2*epsilon)
end;

次をチェックする
gradApprox ≈ DVec

Cousera Machine Learning / week5-4 めも

Implementation Note: Unrolling Parameters 授業メモ
function [jVal, gradient] = costFunction(theta)
...

optTheta = fminunc(@costFunction. initalTheta, options)

Neural Network(L-4):
 theta  matrices (Theta1, Theta2, Theta3)
 D matrices (D1, D2, D3)
 
 -------------------------
thetaVec = [Theta1(:), Theta2(:); Theta3(:)];
DVec = [D1(:); D2(:); D3(:)];

ここでTheta1(:)の意味は、Theta1の各要素をすべて列にしたもの
つまり
octave:7> b=[1 3; 2 4]
b =
   1   3
   2   4
があったっとき、b(:)は、次のようになる
octave:8> b(:)
ans =
   1
   2
   3
   4
-------

Theta1 is 10x11, Theta2 is 10x11 and Theta3 is 1x11

Theta1 = reshape(thetaVector(1:110),10,11)
Theta2 = reshape(thetaVector(111:220),10,11)
Theta3 = reshape(thetaVector(221:231),1,11)

reshape関数は、reshape(a, size)のように書いて次のように行列の変形をできる
> reshape([1,2,3,4], 2,2)
ans =
   1   3
   2   4

---------
octave:1> Theta1=ones(10,11)
Theta1 =
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1

octave:2> Theta2=2*ones(10,11)
Theta2 =
   2   2   2   2   2   2   2   2   2   2   2
   2   2   2   2   2   2   2   2   2   2   2
   2   2   2   2   2   2   2   2   2   2   2
   2   2   2   2   2   2   2   2   2   2   2
   2   2   2   2   2   2   2   2   2   2   2
   2   2   2   2   2   2   2   2   2   2   2
   2   2   2   2   2   2   2   2   2   2   2
   2   2   2   2   2   2   2   2   2   2   2
   2   2   2   2   2   2   2   2   2   2   2
   2   2   2   2   2   2   2   2   2   2   2

octave:3> Theta3=3*ones(1,11)
Theta3 =
   3   3   3   3   3   3   3   3   3   3   3
> ThetaVec =[ Theta1(:); Theta2(:); Theta3(:) ];
octave:10> size(ThetaVec)
ans =
   231     1
ここでsizeは行列のサイズを返し、次のようになる
> a=[1,2;3,4;5,6]
a =
  1  2
  3  4
  5  6
octave> size(a)
ans =
  3  2
octave> size(a,1)
ans =  3
octave> size(a,2)
ans =  2

1> reshape(ThetaVec(1:110), 10, 11)
ans =
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
   1   1   1   1   1   1   1   1   1   1   1
---------------