1. 程式人生 > >np.prod() 函式計算陣列元素乘積等

np.prod() 函式計算陣列元素乘積等

np.prod()函式用來計算所有元素的乘積,對於有多個維度的陣列可以指定軸,如axis=1指定計算每一行的乘積。

 Python format 格式化函式:

例1:
>>>"{} {}".format("hello", "world")    # 不設定指定位置,按預設順序
'hello world'
 
>>> "{0} {1}".format("hello", "world")  # 設定指定位置
'hello world'
 
>>> "{1} {0} {1}".format("hello", "world")  # 設定指定位置
'world hello world'

例2:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
print("網站名:{name}, 地址 {url}".format(name="菜鳥教程", url="www.runoob.com"))
 
# 通過字典設定引數
site = {"name": "菜鳥教程", "url": "www.runoob.com"}
print("網站名:{name}, 地址 {url}".format(**site))
 
# 通過列表索引設定引數
my_list = ['菜鳥教程', 'www.runoob.com']
print("網站名:{0[0]}, 地址 {0[1]}".format(my_list))  # "0" 是必須的

 

python進階發現的資源,後續有實際應用另行更新:

KNN 分類器的K值選取:K值不能過大,也不能過小,K值的選取取決於學習難度與訓練樣本的規模,通常,K取3~10。一種常見的做法就是設定K等於訓練樣本數的“平方根”。更好的一種方法是“交叉驗證”:設定多個測試樣本集,用這些樣本集來測試多個K值,根據分類效能選擇最合適的K值。

從知乎上看到的資料清洗方面的知識:

 資料探勘中常用的資料清洗方法有哪些?

python排序,保留索引值

: 比如對a = [3,4,1,7,2]用a.sort()排序得到a = [1,2,3,4,7],請問如何得到排序後的
: 陣列元素的索引系列,是說,在原來陣列中的索引。在這個例子裡應該是[2,4,0,1,3].

In [1]: a = [3,4,1,7,2]

In [2]: enumerate(a)
Out[2]: <enumerate object at 0x8591f0c>

In [3]: list(enumerate(a))
Out[3]: [(0, 3), (1, 4), (2, 1), (3, 7), (4, 2)]

In [4]: from operator import itemgetter

In [5]: sorted(enumerate(a), key=itemgetter(1))
Out[5]: [(2, 1), (4, 2), (0, 3), (1, 4), (3, 7)]

In [6]: [index for index, value in sorted(enumerate(a), key=itemgetter(1))]
Out[6]: [2, 4, 0, 1, 3]
大殺器:
In [7]: import numpy as np

In [8]: np.argsort([3,4,1,7,2])
Out[8]: array([2, 4, 0, 1, 3])

注意的是,對於 [(索引,值),...,(索引,值)]這種形式的情況我以為對任意的索引值都可以用,但其實不是,例如:

# 使用jupyter notebook
a=[(12,4),(100,3),(1000,1),(9832,2)]
from operator import itemgetter
[index for index,value in sorted(enumerate(a),key=itemgetter(1))]
Output[1]:[0, 1, 2, 3] # 注意,我是把12,100,1000,9832當做索引值的,即“任意索引值”,但是發現輸出的不是例子中給出的那樣,實際情況仍然是索引從0開始的情況。後來我是用for迴圈解決的:
Input:a=sorted(a,key=itemgetter(1))
       a
Output:[(1000, 1), (9832, 2), (100, 3), (12, 4)] # a排序後的效果

#接著上面提取任意索引:
Input:
    indx=[]
    a=a[:len(a)/2]
    for i in a:
        indx.append(i[0])
Output:
       indx
       [1000, 9832]  # 提取出值最小的兩個值對應的索引。

其他關於python排序的高階技巧請自行搜尋

python面向物件:

現在面向物件的思維用的很多,大到實際生活工作中的問題或小/具體到程式設計問題,你要時時注意到你討論的問題的物件是什麼,是對什麼討論的這個問題。比如今天下午討論的影象聚類和影象劃分,一個面向的物件是一張張圖片,目的是把相似的圖片進行聚類;另一個問題的物件是圖片中的一個個畫素點的值,目的是對一張圖片的不同區域進行劃分。問題的物件就不一樣,要是一下子就能意識到問題的物件變了,就可以流暢的在不同的問題場景中轉換。

好了,扯遠了,,回來回來,說到python面向物件我本意是想說python面向物件中的類,類中屬性是可以直接通過類名進行訪問的,而類的方法如果沒有加“@classmethod”這樣的裝飾器的話需要先把類例項化一個具體的類的例項物件,即要通過一個類的實體才能去呼叫這個方法;對於有些方法不需要傳入引數的,可以用裝飾器“@property” 把這個方法裝飾成類的一個屬性,這樣就可以通過類名直接呼叫了,而且不用加方法的“()”,就像呼叫類的一般屬性的方式那樣呼叫就行了。

好,這部分今天就說到這裡~

python & tensorflow 設定學習率:

先設定一個learning_rate 例項,再傳入優化器Optimizer()中。

import tensorflow as tf
from numpy.random import RandomState
 
if __name__ == "__main__":
    #設定每次跌打資料的大小
    batch_size = 8
    #定義輸入節點
    x = tf.placeholder(tf.float32,shape=(None,1),name="x_input")
    #定義預測值的輸出節點
    y_ = tf.placeholder(tf.float32,shape=(None,1),name="y_output")
    #定義引數變數
    w = tf.Variable(50.,trainable=True)
    # 定義神經網路的傳播過程
    y = x * w
    #定義損失函式
    loss = tf.reduce_sum(tf.square(y-y_))
    #定義global_step
    global_step = tf.Variable(0,trainable=False)
    #通過指數衰減函式來生成學習率
    learing_rate = tf.train.exponential_decay(0.1,global_step,100,0.96,staircase=False)
    #使用梯度下降演算法來最優化損失值
    learing_step = tf.train.GradientDescentOptimizer(learing_rate).minimize(loss,global_step)
    #隨機產生一個數據集
    rdm = RandomState(1)
    #設定資料集的大小
    dataset_size = 200
    #產生輸入資料
    X = rdm.rand(dataset_size,1)
    #定義真實的輸出資料Y,
    Y = [x1 + rdm.rand()/5.0 - 0.05 for x1 in X]
    #訓練模型
    with tf.Session() as sess:
        #初始化所有的引數
        all_init = tf.initialize_all_variables()
        sess.run(all_init)
        #設定迭代次數
        STEPS = 5000
        for i in range(STEPS):
            start = (i * batch_size) % batch_size
            end = min(start+batch_size,dataset_size)
            #訓練模型
            sess.run(fetches=learing_step,feed_dict={x:X[start:end],y_:Y[start:end]})
            #沒迭代100次輸出一次引數值
            if i % 100 == 0:
                print("w:%f,learing_rate:%f"%(w.eval(session=sess),learing_rate.eval(session=sess)))

深度學習中的“batch_size”引數:

如果資料集比較小,則可以採用全資料集(即‘Full Batch Learing’),但是對於更大的資料集並不適用。相對於Full Batch Learning的另一個極端就是一個batch只有一個數據,叫“線上學習(Online Learning)”, 線性神經元在均方誤差代價函式的錯誤面是一個拋物面,橫截面是橢圓。對於多層神經元、非線性網路,在區域性依然是近似拋物面。使用線上學習(online learning)每次修正的方向以各自樣本的梯度方向修正,橫衝直撞,難以達到收斂。

不同隨機優化器的比較: