本文目錄一覽:
- 1、#Python乾貨#python實現——最優化算法
- 2、數字圖像LSB代碼?
- 3、Python實現簡單多線程任務隊列
- 4、python求質數的算法
- 5、python實現lbfgs算法,(1)maxima語言:CalCoefAB(Crb0) := block(
- 6、如何利用python語言實現機器學習算法
#Python乾貨#python實現——最優化算法
函數詳見rres,此代碼使該算法運行了兩次
收穫:
這是我第一個實現的代碼。學習完該算法以後,邏輯框架基本上就有了,剩下需要明確的就是對應的python的語言。於是我就開始了查找“如何定義函數”(詳見mofan的優酷),“循環體”和“if條件語句”的格式()“數學符號”(詳見mofan的優酷),以及print的使用
1.def是python中指定義,一般用來定義函數,如果需要深度學習搭建網絡可用來定義網絡。值得注意的一點是
我不清楚為什麼,但是如果沒有加的話,那個函數公式就是一個花瓶,就像一個結果輸不出去。
2.最坑的就是邏輯。一開始邏輯沒理清楚,或者說在代碼上有疏漏,導致我將left和right放在了循環體里,結果可想而知。不過也是因為這個錯誤,我知道pycharm中的debug怎麼用,挺簡單的,百度一下就出來了。
3.不知道什麼原因,看的莫煩視頻中的print多個變量一起輸出是沒有辦法在我的pycharm中使用的,出來的結果很奇怪。可能是因為我是win10不是ios吧。print如果多個變量一起輸出必須是print(“名字:%s,名字2:%s”%(a,b))結果輸出就是名字:a ,名字2:b
關於python中數據變量。第一遍運行結果出現很明顯不對,於是我採用了debug。結果發現,mid1處一直為1而不是1.5,於是就開始了解數據變量。起初我猜測python默認所有變量為整型,但是根據二分法的結果我意識到此猜測不對,所以要改整個file的變量格式沒有必要。所以我就在mid1式子前面加了一個float,結果就顯示為1.5了。但是如果我將整個式子用()括起來,前面加float,結果還是1。我不太理解為什麼。不過我知道了python的數據格式是根據輸入量決定的,也就是說你的輸入量如果是整型,那麼與其直接相關的計算輸出結果一定是整型,而且還是不採用進位的整型。在我沒有採用+float/+.0這兩種方法之前,mid1~3全部是整型。
或者不再mid1前面加float,直接將輸入量後面點個點就行
真的很想吐槽一下print,好麻煩啊啊啊啊每次都得弄個%s,而且有時候還不能放一起!!!!
不要問我掌握了什麼,要問我現在寫完這個代碼後有多麼的愛python的精度表示 :-)我決定以後只要再編寫數學公式的代碼都將輸入量的小數學點後面補很多0
fibonacci函數定義,每次debug後我的手都是抖的O( _ )O~
不知道自己什麼時候有的強迫症,只要是代碼下面有“~”我就必須要消掉。笑哭。這個很簡單,前四個除了費波納茨,都很簡單。
這個公式看起來很麻煩,便寫的時候更要謹慎。我上回把那個2擱在了分號下面,結果很大,所以還是換算成0.5更好(PS:勿忘那長河般的0)。
雖然代碼很長,但是主要是因為print太多。本打算在開頭print,最後結果會漏掉最後一部分。懶得想其他辦法了,直接就這樣吧
一開始while裡面寫成了,導致run不出來。繼而,debug也沒法用。在網上一查才知道 “沒聯網”+“沒選斷點”。最後想嘗試將else裡面的內容輸出來,結果發現run以後被刷屏了。於是改成i7以後還是不行,於是想着加一個break跳出循環,結果成效了。
然後剛剛由debug了一下,才知道原來是i+1在if裡面,因為沒有辦法+1,所以i=6一直存在,就不斷循環。因為加break也好,i+1也好,都可以。
這是我第一組自己實現的python代碼,就是數學公式用python語言組裝起來。剛開始的時候知道大概需要在語言中體現什麼,但不太清楚。於是我就在網上找了幾個二分法的,他們都各有不同,但框架都差不多,不過如果要用到我們的那個公式里還需要改變很多。然後我就開始分析我們的題,我發現大體需要兩部分,一部分函數定義,一部分循環體。但我不知道如何定義函數,如何寫數學公式,如何弄變量,也就是說一些小點不太會,所以我選擇直接百度。因為我知道自己閱讀的能力不錯,相比於從視頻中提取要素,我更擅長通過閱讀獲得要點。有目的性地找知識點,掌握地更牢固。
於是我就開始了第一個——二分法的編寫。我發現,自己出現了很多錯誤而且有很多地方都很基礎。但我依然沒選擇視頻,而是將這些問題直接在百度上找,因為視頻講完或許你也沒找到點。當然,這是一步一步走的,不是直接就將程序擺上去,一點一點改。
隨着前兩個的成功,我發現自己對於這些代碼有了自信,似乎看透了他們的偽裝,抓住了本質。除此之外,我還意識到自己自從8月份以後,學習能力似乎提高了不少,而且有了更為有效的學習方法。各方面都有了一定的覺醒。除了第一個找了幾個牛頭不對馬嘴的代碼,其他都是根據自己的邏輯寫,邏輯通下來以後,對應語言中某一部分不知道如何翻譯就去百度,其實這幾個套路都一樣或者說數學公式轉化的套路都一樣。
我還意識到,彙編其實是最難的語言,目前為止所學到的,因為很多都需要自己去定義,去死摳,需要記住大量的指令且不能靈活變通。但是其他的卻只需要將一些對應的記下來就好。python真的挺簡單的。而且,我發現自己今天似乎打開了新世界的大門,我愛上了這種充滿了靈性的東西,充滿了嚴謹的美麗,還有那未知的變化,我發現我似乎愛上了代碼。可能不僅僅局限於python,這些語言都充滿了挑戰性。我覺得當你疑惑的時候,就需要相信直覺,至少我發現它很准
數字圖像LSB代碼?
LSB算法是數字圖像信息隱藏應用較早較普遍的算法[3],是在圖像信息的最不重要二進制位嵌入秘密信息。根據24位BMP圖像文件的結構特點,每個文件只能非壓縮地存放一幅彩色圖像;文件頭由54個字節的數據段組成,其中包含有該位圖文件的類型、大小、圖像尺寸及打印格式等;從第55個字節開始,是該文件的圖像數據部分,由一系列的字節所組成,每連續3個字節便描述圖像一個像素點的顏色信息,這三個字節分別代表藍、綠、紅三基色在此像素中的亮度。LSB算法是用圖像數據部分每個字節中最低位來隱藏信息。這樣每8個字節就可隱藏1個字節的信息[4]。
嵌入信息的方法為:首先,將待隱藏的秘密信息轉化為二進制數據碼流;然後,將BMP文件圖像數據部分的每個字節的最低位替換為需隱藏的信息位。最後,原樣複製其他不需要繼續隱藏信息的原始數據。從對位圖文件的分析,得知偏移量為0x06的4個字節為系統保留,可將被隱藏文件的大小寫入該位置,以便提取信息時提前知道有用信息的長度,提高解碼效率。對文件頭部的其他50個字節,原樣複製即可。隱藏過程如圖1所示。
圖1. LSB圖像隱藏算法示意圖
Fig.1 LSB data hiding algorithm
信息提取是把隱藏的信息從載體圖像中讀取出來,其過程和步驟正好與信息嵌入相反。首先,到隱藏信息後的圖像文件的0x06處讀取被隱藏信息的字節數;然後,從0x36處開始,求取BMP文件圖像數據部分每個字節最低位,每夠8個字節,便將輸出的8位二進制數組成一個字節。經過上述處理,得到一系列8位二進制數,便是隱藏信息的代碼,將代碼轉換成文本、或圖像、或聲音,就是隱藏的信息。提取過程如圖2所示。
由於原始24位BMP圖像文件隱藏信息後,其數據部分字節數值最多變化為1,該字節代表的像素顏色值最多只變化了1/256,所以,已隱藏信息的BMP圖像與未隱藏信息的BMP圖像,用肉眼是看不出差別的。將信息直接嵌入像素RGB值的優點是嵌入信息的容量與所選取的掩護圖像的大小成正比。使用這種方法,一個大小為32k的24位BMP圖像文件,可以隱藏約32k/8=4k的信息(忽略文件頭不能隱藏數據的54個字節),該方法具有較高的信息隱藏率。
圖2. LSB圖像提取算法示意圖
Fig.2 LSB data extracting algorithm
由於該算法是通過調整原始數據的最低位來隱藏信息,使一般用戶對於隱藏信息,在視覺和聽覺上很難察覺。但作為數字水印算法,該算法因其基本原理限制,所隱藏的數字水印信息是極為脆弱的,無法經受一些無損和有損的信號處理。
3 新的數字水印算法
這種技術的改進,是在基於LSB圖像隱藏技術的基礎上,對待隱藏的水印信息進行反覆的隱藏,因為圖片布滿水印信息,所以,有很強的抗剪裁能力。
對載體圖片進行剪裁後,極有可能會破壞水印信息原有的位置,使我們無法對水印信息進行定位,也就無從實現提取了。因此,這種算法的關鍵在於如何對水印信息進行同步。下面,提出一種同步的方法:
(1)在數字水印信息前依次連續寫入同步信號0000,1111,1111數遍(4遍以上),然後寫入前標識符1001,0001,再寫入隱藏信息,最後寫入後標識符1001,0001。
(2)讀入被剪裁後的載體圖片的信息位,如果首位是0則跳過,從非0的位開始讀取,連續讀入8位,判斷該數據是否為同步字FF,如果不是同步字FF則繼續從非0的位開始讀其後的8位,直到連續讀出2組同步字FF,證明已經同步,然後一直到讀出前標識符,說明其後為隱藏信息位,讀出數據,直到讀入後標識符,說明隱藏信息已經完整的讀完,至此讀出一條完整的信息。如圖3所示,無論從第1個同步字的任何一位開始讀取,可以保證到第3個同步字時已經完成同步操作,第4個同步字完成確認同步並等待前標識的到來。
Python實現簡單多線程任務隊列
Python實現簡單多線程任務隊列
最近我在用梯度下降算法繪製神經網絡的數據時,遇到了一些算法性能的問題。梯度下降算法的代碼如下(偽代碼):
defgradient_descent(): # the gradient descent code plotly.write(X, Y)
一般來說,當網絡請求 plot.ly 繪圖時會阻塞等待返回,於是也會影響到其他的梯度下降函數的執行速度。
一種解決辦法是每調用一次 plotly.write 函數就開啟一個新的線程,但是這種方法感覺不是很好。 我不想用一個像 cerely(一種分布式任務隊列)一樣大而全的任務隊列框架,因為框架對於我的這點需求來說太重了,並且我的繪圖也並不需要 redis 來持久化數據。
那用什麼辦法解決呢?我在 python 中寫了一個很小的任務隊列,它可以在一個單獨的線程中調用 plotly.write函數。下面是程序代碼。
fromthreadingimportThreadimportQueueimporttime classTaskQueue(Queue.Queue):
首先我們繼承 Queue.Queue 類。從 Queue.Queue 類可以繼承 get 和 put 方法,以及隊列的行為。
def__init__(self, num_workers=1): Queue.Queue.__init__(self) self.num_workers=num_workers self.start_workers()
初始化的時候,我們可以不用考慮工作線程的數量。
defadd_task(self, task,*args,**kwargs): args=argsor() kwargs=kwargsor{} self.put((task, args, kwargs))
我們把 task, args, kwargs 以元組的形式存儲在隊列中。*args 可以傳遞數量不等的參數,**kwargs 可以傳遞命名參數。
defstart_workers(self): foriinrange(self.num_workers): t=Thread(target=self.worker) t.daemon=True t.start()
我們為每個 worker 創建一個線程,然後在後台刪除。
下面是 worker 函數的代碼:
defworker(self): whileTrue: tupl=self.get() item, args, kwargs=self.get() item(*args,**kwargs) self.task_done()
worker 函數獲取隊列頂端的任務,並根據輸入參數運行,除此之外,沒有其他的功能。下面是隊列的代碼:
我們可以通過下面的代碼測試:
defblokkah(*args,**kwargs): time.sleep(5) print“Blokkah mofo!” q=TaskQueue(num_workers=5) foriteminrange(1): q.add_task(blokkah) q.join()# wait for all the tasks to finish. print“Alldone!”
Blokkah 是我們要做的任務名稱。隊列已經緩存在內存中,並且沒有執行很多任務。下面的步驟是把主隊列當做單獨的進程來運行,這樣主程序退出以及執行數據庫持久化時,隊列任務不會停止運行。但是這個例子很好地展示了如何從一個很簡單的小任務寫成像工作隊列這樣複雜的程序。
defgradient_descent(): # the gradient descent code queue.add_task(plotly.write, x=X, y=Y)
修改之後,我的梯度下降算法工作效率似乎更高了。如果你很感興趣的話,可以參考下面的代碼。fromthreadingimportThreadimportQueueimporttime classTaskQueue(Queue.Queue): def__init__(self, num_workers=1):Queue.Queue.__init__(self)self.num_workers=num_workersself.start_workers() defadd_task(self, task,*args,**kwargs):args=argsor()kwargs=kwargsor{}self.put((task, args, kwargs)) defstart_workers(self):foriinrange(self.num_workers):t=Thread(target=self.worker)t.daemon=Truet.start() defworker(self):whileTrue:tupl=self.get()item, args, kwargs=self.get()item(*args,**kwargs)self.task_done() deftests():defblokkah(*args,**kwargs):time.sleep(5)print”Blokkah mofo!” q=TaskQueue(num_workers=5) foriteminrange(10):q.add_task(blokkah) q.join()# block until all tasks are doneprint”All done!” if__name__==”__main__”:tests()
python求質數的算法
為大家分享了多種方法求質數python實現代碼,供大家參考,具體內容如下
題目要求是求所有小於n的質數的個數。
求質數方法1:
窮舉法:
根據定義循環判斷該數除以比他小的每個自然數(大於1),如果有能被他整除的就不是質數:
def countPrimes1(self, n):
“””
:type n: int
:rtype: int
“””
if n=2:
return 0
else:
res=[]
for i in range(2,n):
flag=0 # 質數標誌,=0表示質數
for j in range(2,i):
if i%j ==0:
flag=1
if flag==0:
res.append(i)
return len(res)
求質數方法2:
利用定理:如果一個數是合數,那麼它的最小質因數肯定小於等於它的平方根。所以判斷一個數是否是質數,只需判斷它是否能被小於它開根後的所有數整除。這樣做的運算會少很多。
def countPrimes2(self, n):
if n=2:
return 0
else:
res=[]
for i in range(2, n):
flag=0
for j in range(2, int(math.sqrt(i))+1):
if i % j == 0:
flag = 1
if flag == 0:
res.append(i)
return len(res)
求質數方法3:
利用定理:如果一個數是合數,那麼它的最小質因數肯定小於等於它的平方根。我們可以發現只要嘗試小於等於平方根的所有數即可。列舉從 3 到根號x的所有數,還是有些浪費。比如要判斷101是否質數,101的根號取整後是10,需要嘗試的數是1到10。但是可以發現,對9的嘗試是多餘的。不能被3整除,必然不能被9整除……順着這個思路走下去,其實,只要嘗試小於根號x的質數即可。而這些質數,恰好前面已經算出來了,已經存在res中了。
def countPrimes3(self, n):
if n = 2:
return 0
else:
res = []
for i in range(2, n):
flag = 0
for j in res:
if i % j == 0:
flag = 1
if flag == 0:
res.append(i)
return len(res)
希望對大家有幫助
python實現lbfgs算法,(1)maxima語言:CalCoefAB(Crb0) := block(
lbfgs你就當是種算法好了,網上介紹很多,可以從bfgs開始看。這個難道要自己寫,最好找些現成的統計包。
如何利用python語言實現機器學習算法
基於以下三個原因,我們選擇Python作為實現機器學習算法的編程語言:(一) Python的語法清晰;(二) 易於操作純文本文件;(三) 使用廣泛,存在大量的開發文檔。 可執行偽代碼 Python具有清晰的語法結構,大家也把它稱作可執行偽代碼(executable pseudo-code)。默認安裝的Python開發環境已經附帶了很多高級數據類型,如列表、元組、字典、集合、隊列等,無需進一步編程就可以使用這些數據類型的操作。使用這些數據類型使得實現抽象的數學概念非常簡單。此外,讀者還可以使用自己熟悉的編程風格,如面向對象編程、面向過程編程、或者函數式編程。不熟悉Python的讀者可以參閱附錄A,該附錄詳細介紹了Python語言、Python使用的數據類型以及安裝指南。 Python語言處理和操作文本文件非常簡單,非常易於處理非數值型數據。Python語言提供了豐富的正則表達式函數以及很多訪問Web頁面的函數庫,使得從HTML中提取數據變得非常簡單直觀。 Python比較流行 Python語言使用廣泛,代碼範例也很多,便於讀者快速學習和掌握。此外,在開發實際應用程序時,也可以利用豐富的模塊庫縮短開發周期。 在科學和金融領域,Python語言得到了廣泛應用。SciPy和NumPy等許多科學函數庫都實現了向量和矩陣操作,這些函數庫增加了代碼的可讀性,學過線性代數的人都可以看懂代碼的實際功能。另外,科學函數庫SciPy和NumPy使用底層語言(C和Fortran)編寫,提高了相關應用程序的計算性能。本書將大量使用Python的NumPy。 Python的科學工具可以與繪圖工具Matplotlib協同工作。Matplotlib可以繪製二D、三D圖形,也可以處理科學研究中經常使用到的圖形,所以本書也將大量使用Matplotlib。 Python開發環境還提供了交互式shell環境,允許用戶開發程序時查看和檢測程序內容。 Python開發環境將來還會集成Pylab模塊,它將NumPy、SciPy和Matplotlib合併為一個開發環境。在本書寫作時,Pylab還沒有併入Python環境,但是不遠的將來我們肯定可以在Python開發環境找到它。 Python語言的特色 諸如MATLAB和Mathematica等高級程序語言也允許用戶執行矩陣操作,MATLAB甚至還有許多內嵌的特徵可以輕鬆地構造機器學習應用,而且MATLAB的運算速度也很快。然而MATLAB的不足之處是軟件費用太高,單個軟件授權就要花費數千美元。雖然也有適合MATLAB的第三方插件,但是沒有一個有影響力的大型開源項目。 Java和C等強類型程序設計語言也有矩陣數學庫,然而對於這些程序設計語言來說,最大的問題是即使完成簡單的操作也要編寫大量的代碼。程序員首先需要定義變量的類型,對於Java來說,每次封裝屬性時還需要實現getter和setter方法。另外還要記着實現子類,即使並不想使用子類,也必須實現子類方法。為了完成一個簡單的工作,我們必須花費大量時間編寫了很多無用冗長的代碼。Python語言則與Java和C完全不同,它清晰簡練,而且易於理解,即使不是編程人員也能夠理解程序的含義,而Java和C對於非編程人員則像天書一樣難於理解。 所有人在小學二年級已經學會了寫作,然而大多數人必須從事其他更重要的工作。 ——鮑比·奈特 也許某一天,我們可以在這句話中將“寫作”替代為“編寫代碼”,雖然有些人對於編寫代碼很感興趣,但是對於大多數人來說,編程僅是完成其他任務的工具而已。Python語言是高級編程語言,我們可以花費更多的時間處理數據的內在含義,而無須花費太多精力解決計算機如何得到數據結果。Python語言使得我們很容易表達自己的目的。 Python語言的缺點 Python語言唯一的不足是性能問題。Python程序運行的效率不如Java或者C代碼高,但是我們可以使用Python調用C編譯的代碼。這樣,我們就可以同時利用C和Python的優點,逐步地開發機器學習應用程序。我們可以首先使用Python編寫實驗程序,如果進一步想要在產品中實現機器學習,轉換成C代碼也不困難。如果程序是按照模塊化原則組織的,我們可以先構造可運行的Python程序,然後再逐步使用C代碼替換核心代碼以改進程序的性能。C++ Boost庫就適合完成這個任務,其他類似於Cython和PyPy的工具也可以編寫強類型的Python代碼,改進一般Python程序的性能。 如果程序的算法或者思想有缺陷,則無論程序的性能如何,都無法得到正確的結果。如果解決問題的思想存在問題,那麼單純通過提高程序的運行效率,擴展用戶規模都無法解決這個核心問題。從這個角度來看,Python快速實現系統的優勢就更加明顯了,我們可以快速地檢驗算法或者思想是否正確,如果需要,再進一步優化代碼
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/294075.html