⑴ 關於讀取圖片時候行位元組數的演算法LineBytes=(width*8+31)/32*4的疑問
該演算法為:LineBytes = (width * bitCount + 31) / 32 * 4
bitCount為點陣圖位寬,32位BMP,位寬為32、24位BMP位寬為23、256色點陣圖位寬為8、等等。
這是一種對齊演算法,對於BMP等點陣圖來說,要求是4位元組對齊,即每行位元組數必須為4的整數倍。
因為8bit等於1Byte,同時滿足以4位元組為對齊單位向下對齊,所以可以得:
LineBytes = (width * bitCount / 8 + 3) / 4 * 4
對於位寬不足8的點陣圖,有可能是多個像素才佔用1Byte,所以應該將「/ 8」移出括弧,進一步得:
LineBytes = (width * bitCount + 31) / 32 * 4
⑵ C語言位元組對齊怎麼操作
成為一名合格的IT人才
⑶ CVPR 2019 Oral 論文解讀 | 無監督域適應語義分割
雷鋒網 AI 科技評論按: 網路研究院、華中科技大學、悉尼科技大學聯合新作——關於無監督領域自適應語義分割的論文《 Taking A Closer Look at Domain Shift: Category-level Adversaries for Semantics Consistent Domain Adaptation》被 CCF A 類學術會議 CVPR2019 收錄為 Oral 論文 。該論文提出了一種從「虛擬域」泛化到「現實域」的無監督語義分割演算法,旨在利用易獲取的虛擬場景標注數據來完成對標注成本高昂的現實場景數據的語義分割,大大減少了人工標注成本。 本文是論文作者之一羅亞威為雷鋒網 AI 科技評論提供的論文解讀。
論文地址: https://arxiv.org/abs/1809.09478
1.問題背景
基於深度學習的語義分割方法效果出眾,但需要大量的人工標注進行監督訓練。不同於圖像分類等任務,語義分割需要像素級別的人工標注,費時費力,無法大規模實施。藉助於計算機虛擬圖像技術,如3D游戲,用戶可以幾乎無成本地獲得無限量自動標注數據。然而虛擬圖像和現實圖像間存在嚴重的視覺差異(域偏移),如紋理、光照、視角差異等等,這些差異導致在虛擬圖像上訓練出的深度模型往往在真實圖像數據集上的分割精度很低。
2. 傳統方法
針對上述域偏移問題,一種廣泛採用的方法是在網路中加入一個域判別器Discriminator (D),利用對抗訓練的機制,減少源域Source (S)和目標域Target(T)之間不同分布的差異,以加強原始網路(G)在域間的泛化能力。方法具體包括兩方面:
(1)利用源域的有標簽數據進行有監督學習,提取領域知識:
其中Xs,Ys為源域數據及其對應標簽。
(2)通過對抗學習,降低域判別器(D)的精度,以對齊源域與目標域的特徵分布:
其中XT為目標域數據,無標簽。
3.我們針對傳統方法的改進
以上基於對抗學習的傳統域適應方法只能對齊全局特徵分布(Marginal Distribution),而忽略了不同域之間,相同語義特徵的語義一致性(Joint Distribution),在訓練過程中容易造成負遷移,如圖2(a)所示。舉例來說,目標域中的車輛這一類,可能與源域中的車輛在視覺上是接近的。因此,在沒有經過域適應演算法之前,目標域車輛也能夠被正確分割。然而,為了迎合傳統方法的全局對齊,目標域中的車輛特徵反而有可能會被映射到源域中的其他類別,如火車等,造成語義不一致。
針對這一問題,我們在今年CVPR的論文中,向對抗學習框架里加入了聯合訓練的思想,解決了傳統域適應方法中的語義不一致性和負遷移等鍵問題。具體做法見圖2(b),我們採用了兩個互斥分類器對目標域特徵進行分類。當兩個分類器給出的預測很一致時,我們認為該特徵已經能被很好的分類,語義一致性較高,所以應減少全局對齊策略對這些特徵產生的負面影響。反之,當兩個分類器給出的預測不一致,說明該目標域特徵還未被很好地分類,依然需要用對抗損失進行與源域特徵的對齊。所以應加大對齊力度,使其盡快和源域特徵對應。
4.網路結構
為了實現上述語義級對抗目標,我們提出了Category-Level Adversarial Network (CLAN)。 遵循聯合訓練的思想,我們在生成網路中採用了互斥分類器的結構,以判斷目標域的隱層特徵是否已達到了局部語義對齊。在後續對抗訓練時, 網路依據互斥分類器產生的兩個預測向量之差(Discrepancy)來對判別網路所反饋的對抗損失進行加權。網路結構如下圖3所示。
圖3中,橙色的線條表示源域流,藍色的線條表示目標域流,綠色的雙箭頭表示我們在訓練中強迫兩個分類器的參數正交,以達到互斥分類器的目的。源域流和傳統的方法並無很大不同,唯一的區別是我們集成了互斥分類器產生的預測作為源域的集成預測。該預測一方面被標簽監督,產生分割損失(Segmentation Loss),如式(3)所示:
另一方面,該預測進入判別器D,作為源域樣本。
綠色的雙箭頭處,我們使用餘弦距離作為損失,訓練兩個分類器產生不同的模型參數:
目標域流中,集成預測同樣進入判別器D。不同的是,我們維持兩個分類器預測的差值,作為局部對齊程度的依據 (local alignment score map)。該差值與D所反饋的損失相乘,生成語義級別的對抗損失:
該策略加大了語義不一致特徵的對齊力度,而減弱了語義一致的特徵受全局對齊的影響,從而加強了特徵間的語義對齊,防止了負遷移的產生。
最後,根據以上三個損失,我們可以得出最終的總體損失函數:
基於以上損失函數,演算法整體的優化目標為:
在訓練中,我們交替優化G和D,直至損失收斂。
5. 特徵空間分析
我們重點關注不常見類,如圖4(a)中黃框內的柱子,交通標志。這些類經過傳統方法的分布對齊,反而在分割結果中消失了。結合特徵的t-SNE圖,我們可以得出結論,有些類的特徵在沒有進行域遷移之前,就已經是對齊的。傳統的全局域適應方法反而會破壞這種語義一致性,造成負遷移。而我們提出的語義級別對抗降低了全局對齊對這些已對齊類的影響,很好的解決了這一問題。
6. 實驗結果
我們在兩個域適應語義分割任務,即GTA5 -> Cityscapes 和 SYNTHIA -> Cityscapes 上進行了實驗驗證。我們採用最常見的Insertion over Union作為分割精度的衡量指標,實驗結果如下。從表1和表2中可以看出,在不同網路結構(VGG16,ResNet101)中,我們的方法(CLAN)域適應效果都達到了 state-of-the-art的精度。特別的,在一些不常見類上(用藍色表示),傳統方法容易造成負遷移,而CLAN明顯要優於其他方法。
表 1. 由虛擬數據集GTA5 遷移至真實數據集 Cityscapes 的域適應分割精度對比。
表 2. 由虛擬數據集SYNTHIA 遷移至真實數據集 Cityscapes 的域適應分割精度對比。
第二個實驗中,我們了展示隱空間層面,源域和目標域間同語義特徵簇的中心距離。該距離越小,說明兩個域間的語義對齊越好。結果見圖 5。
最後,我們給出分割結果的可視化效果。我們的演算法大大提高了分割精度。
7. 總結
《Taking A Closer Look at Domain Shift: Category-level Adversaries for Semantics Consistent Domain Adaptation》引入了聯合訓練結合對抗學習的設計,在無監督域適應語義分割任務中取得了較好的實驗結果。該演算法能應用前景廣泛,比如能夠很好地應用到自動駕駛中,讓車輛在不同的駕駛環境中也能保持魯棒的街景識別率。
最後
CVPR 2019 Oral 論文精選匯總,值得一看的 CV 論文都在這里(持續更新中)
CVPR 2019 即將於 6 月在美國長灘召開。今年有超過 5165 篇的大會論文投稿,最終錄取 1299 篇,其中 Oral 論文近 300 篇。為了方便社區開發者和學術青年查找和閱讀高價值論文,AI 研習社從入選的 Oral 論文中,按應用方向挑選了部分精華論文,貼在本文,打開鏈接即可查看~
https://ai.yanxishe.com/page/postDetail/11408
⑷ linux下怎麼設置內存對齊
內存對齊是有規則的:
a. 基本類型:所有的基本類型都有相應的對齊參數,編譯器在編譯時,會用全局的對齊參數和當前類型的對齊參數中較小的一個進行對齊。比如,編譯時指定按8bytes對齊(用#pragma pack(8)實現之),可是由於一個char變數的大小為一個byte,所以最後還是按1byte對齊。
b. 復合類型:復合類型的對齊原則,就是取其成員變數數據類型的位元組數的最大者和在編譯時指定的對齊數兩者之間較小的位元組數進行對齊。如果沒有用諸如#pragma pack指定全局對齊數,則該復合類型的對齊數就是其成員變數數據類型位元組數之最大者。
⑸ 生物信息學
一, 生物信息學發展簡介
生物信息學是建立在分子生物學的基礎上的,因此,要了解生物信息學,就
必須先對分子生物學的發展有一個簡單的了解.研究生物細胞的生物大分子的結
構與功能很早就已經開始,1866年孟德爾從實驗上提出了假設:基因是以生物
成分存在[1],1871年Miescher從死的白細胞核中分離出脫氧核糖核酸(DNA),
在Avery和McCarty於1944年證明了DNA是生命器官的遺傳物質以前,人們
仍然認為染色體蛋白質攜帶基因,而DNA是一個次要的角色.
1944年Chargaff發現了著名的Chargaff規律,即DNA中鳥嘌呤的量與胞嘧
定的量總是相等,腺嘌呤與胸腺嘧啶的量相等.與此同時,Wilkins與Franklin
用X射線衍射技術測定了DNA纖維的結構.1953年James Watson 和Francis
Crick在Nature雜志上推測出DNA的三維結構(雙螺旋).DNA以磷酸糖鏈形
成發雙股螺旋,脫氧核糖上的鹼基按Chargaff規律構成雙股磷酸糖鏈之間的鹼基
對.這個模型表明DNA具有自身互補的結構,根據鹼基對原則,DNA中貯存的
遺傳信息可以精確地進行復制.他們的理論奠定了分子生物學的基礎.
DNA雙螺旋模型已經預示出了DNA復制的規則,Kornberg於1956年從大
腸桿菌(E.coli)中分離出DNA聚合酶I(DNA polymerase I),能使4種dNTP連接
成DNA.DNA的復制需要一個DNA作為模板.Meselson與Stahl(1958)用實驗
方法證明了DNA復制是一種半保留復制.Crick於1954年提出了遺傳信息傳遞
的規律,DNA是合成RNA的模板,RNA又是合成蛋白質的模板,稱之為中心
法則(Central dogma),這一中心法則對以後分子生物學和生物信息學的發展都起
到了極其重要的指導作用.
經過Nirenberg和Matthai(1963)的努力研究,編碼20氨基酸的遺傳密碼
得到了破譯.限制性內切酶的發現和重組DNA的克隆(clone)奠定了基因工程
的技術基礎.
正是由於分子生物學的研究對生命科學的發展有巨大的推動作用,生物信息
學的出現也就成了一種必然.
2001年2月,人類基因組工程測序的完成,使生物信息學走向了一個高潮.
由於DNA自動測序技術的快速發展,DNA資料庫中的核酸序列公共數據量以每
天106bp速度增長,生物信息迅速地膨脹成數據的海洋.毫無疑問,我們正從一
個積累數據向解釋數據的時代轉變,數據量的巨大積累往往蘊含著潛在突破性發
現的可能,"生物信息學"正是從這一前提產生的交叉學科.粗略地說,該領域
的核心內容是研究如何通過對DNA序列的統計計算分析,更加深入地理解DNA
序列,結構,演化及其與生物功能之間的關系,其研究課題涉及到分子生物學,
分子演化及結構生物學,統計學及計算機科學等許多領域.
生物信息學是內涵非常豐富的學科,其核心是基因組信息學,包括基因組信
息的獲取,處理,存儲,分配和解釋.基因組信息學的關鍵是"讀懂"基因組的核
苷酸順序,即全部基因在染色體上的確切位置以及各DNA片段的功能;同時在
發現了新基因信息之後進行蛋白質空間結構模擬和預測,然後依據特定蛋白質的
功能進行葯物設計[2].了解基因表達的調控機理也是生物信息學的重要內容,根
據生物分子在基因調控中的作用,描述人類疾病的診斷,治療內在規律.它的研
究目標是揭示"基因組信息結構的復雜性及遺傳語言的根本規律",解釋生命的遺
傳語言.生物信息學已成為整個生命科學發展的重要組成部分,成為生命科學研
究的前沿.
二, 生物信息學的主要研究方向
生物信息學在短短十幾年間,已經形成了多個研究方向,以下簡要介紹一些
主要的研究重點.
1,序列比對(Sequence Alignment)
序列比對的基本問題是比較兩個或兩個以上符號序列的相似性或不相似
性.從生物學的初衷來看,這一問題包含了以下幾個意義[3]:
從相互重疊的序列片斷中重構DNA的完整序列.
在各種試驗條件下從探測數據(probe data)中決定物理和基因圖
存貯,遍歷和比較資料庫中的DNA序列
比較兩個或多個序列的相似性
在資料庫中搜索相關序列和子序列
尋找核苷酸(nucleotides)的連續產生模式
找出蛋白質和DNA序列中的信息成分
序列比對考慮了DNA序列的生物學特性,如序列局部發生的插入,刪除(前
兩種簡稱為indel)和替代,序列的目標函數獲得序列之間突變集最小距離加權
和或最大相似性和,對齊的方法包括全局對齊,局部對齊,代溝懲罰等.兩個
序列比對常採用動態規劃演算法,這種演算法在序列長度較小時適用,然而對於海
量基因序列(如人的DNA序列高達109bp),這一方法就不太適用,甚至採用算
法復雜性為線性的也難以奏效.因此,啟發式方法的引入勢在必然,著名的
BALST和FASTA演算法及相應的改進方法均是從此前提出發的.
2, 蛋白質結構比對和預測
基本問題是比較兩個或兩個以上蛋白質分子空間結構的相似性或不相似性.
蛋白質的結構與功能是密切相關的,一般認為,具有相似功能的蛋白質結構一般
相似.蛋白質是由氨基酸組成的長鏈,長度從50到1000~3000AA(Amino Acids),
蛋白質具有多種功能,如酶,物質的存貯和運輸,信號傳遞,抗體等等.氨基酸
的序列內在的決定了蛋白質的3維結構.一般認為,蛋白質有四級不同的結構.
研究蛋白質結構和預測的理由是:醫葯上可以理解生物的功能,尋找docking
drugs的目標,農業上獲得更好的農作物的基因工程,工業上有利用酶的合成.
直接對蛋白質結構進行比對的原因是由於蛋白質的3維結構比其一級結構
在進化中更穩定的保留,同時也包含了較AA序列更多的信息.
蛋白質3維結構研究的前提假設是內在的氨基酸序列與3維結構一一對應
(不一定全真),物理上可用最小能量來解釋.
從觀察和總結已知結構的蛋白質結構規律出發來預測未知蛋白質的結構.同
源建模(homology modeling)和指認(Threading)方法屬於這一范疇.同源建模用
於尋找具有高度相似性的蛋白質結構(超過30%氨基酸相同),後者則用於比較
進化族中不同的蛋白質結構.
然而,蛋白結構預測研究現狀還遠遠不能滿足實際需要.
3, 基因識別,非編碼區分析研究.
基因識別的基本問題是給定基因組序列後,正確識別基因的范圍和在基因組
序列中的精確位置.非編碼區由內含子組成(introns),一般在形成蛋白質後被丟
棄,但從實驗中,如果去除非編碼區,又不能完成基因的復制.顯然,DNA序
列作為一種遺傳語言,既包含在編碼區,又隱含在非編碼序列中.分析非編碼
區DNA序列目前沒有一般性的指導方法.
在人類基因組中,並非所有的序列均被編碼,即是某種蛋白質的模板,已
完成編碼部分僅占人類基因總序列的3~5%,顯然,手工的搜索如此大的基因序
列是難以想像的.
偵測密碼區的方法包括測量密碼區密碼子(codon)的頻率,一階和二階馬爾
可夫鏈,ORF(Open Reading Frames),啟動子(promoter)識別,HMM(Hidden
Markov Model)和GENSCAN,Splice Alignment等等.
4, 分子進化和比較基因組學
分子進化是利用不同物種中同一基因序列的異同來研究生物的進化,構建進
化樹.既可以用DNA序列也可以用其編碼的氨基酸序列來做,甚至於可通過相
關蛋白質的結構比對來研究分子進化,其前提假定是相似種族在基因上具有相似
性.通過比較可以在基因組層面上發現哪些是不同種族中共同的,哪些是不同的.
早期研究方法常採用外在的因素,如大小,膚色,肢體的數量等等作為進化
的依據.近年來較多模式生物基因組測序任務的完成,人們可從整個基因組的角
度來研究分子進化.在匹配不同種族的基因時,一般須處理三種情況:
Orthologous: 不同種族,相同功能的基因
Paralogous: 相同種族,不同功能的基因
Xenologs: 有機體間採用其他方式傳遞的基因,如被病毒注入的基因.
這一領域常採用的方法是構造進化樹,通過基於特徵(即DNA序列或蛋白
質中的氨基酸的鹼基的特定位置)和基於距離(對齊的分數)的方法和一些傳統
的聚類方法(如UPGMA)來實現.
5, 序列重疊群(Contigs)裝配
根據現行的測序技術,每次反應只能測出500 或更多一些鹼基對的序列,
如人類基因的測量就採用了短槍(shortgun)方法,這就要求把大量的較短的序列
全體構成了重疊群(Contigs).逐步把它們拼接起來形成序列更長的重疊群,直
至得到完整序列的過程稱為重疊群裝配.從演算法層次來看,序列的重疊群是一個
NP-完全問題.
6, 遺傳密碼的起源
通常對遺傳密碼的研究認為,密碼子與氨基酸之間的關系是生物進化歷史上
一次偶然的事件而造成的,並被固定在現代生物的共同祖先里,一直延續至今.
不同於這種"凍結"理論,有人曾分別提出過選擇優化,化學和歷史等三種學說
來解釋遺傳密碼.隨著各種生物基因組測序任務的完成,為研究遺傳密碼的起源
和檢驗上述理論的真偽提供了新的素材.
7, 基於結構的葯物設計
人類基因工程的目的之一是要了解人體內約10萬種蛋白質的結構,功能,
相互作用以及與各種人類疾病之間的關系,尋求各種治療和預防方法,包括葯物
治療.基於生物大分子結構及小分子結構的葯物設計是生物信息學中的極為重要
的研究領域.為了抑制某些酶或蛋白質的活性,在已知其蛋白質3級結構的基礎
上,可以利用分子對齊演算法,在計算機上設計抑制劑分子,作為候選葯物.這一
領域目的是發現新的基因葯物,有著巨大的經濟效益.
8, 其他
如基因表達譜分析,代謝網路分析;基因晶元設計和蛋白質組學數據分析等,
逐漸成為生物信息學中新興的重要研究領域;在學科方面,由生物信息學衍生的
學科包括結構基因組學,功能基因組學,比較基因組學,蛋白質學,葯物基因組
學,中葯基因組學,腫瘤基因組學,分子流行病學和環境基因組學.
從現在的發展不難看出,基因工程已經進入了後基因組時代.我們也有應對
與生物信息學密切相關的如機器學習,和數學中可能存在的誤導有一個清楚的認
識.
三, 生物信息學與機器學習
生物信息的大規模給數據挖掘提出了新課題和挑戰,需要新的思想的加入.
常規的計算機演算法仍可以應用於生物數據分析中,但越來越不適用於序列分析問
題.究竟原因,是由於生物系統本質上的模型復雜性及缺乏在分子層上建立的完
備的生命組織理論.
西蒙曾給出學習的定義:學習是系統的變化,這種變化可使系統做相同工作
時更有效[4].機器學習的目的是期望能從數據中自動地獲得相應的理論,通過采
用如推理,模型擬合及從樣本中學習,尤其適用於缺乏一般性的理論,"雜訊"
模式,及大規模數據集.因此,機器學習形成了與常規方法互補的可行的方法.
機器學習使得利用計算機從海量的生物信息中提取有用知識,發現知識成為可能
[5].
機器學習方法在大樣本,多向量的數據分析工作中發揮著日益重要的作用,
而目前大量的基因資料庫處理需要計算機能自動識別,標注,以避免即耗時又花
費巨大的人工處理方法.早期的科學方法—觀測和假設----面對高數據的體積,
快速的數據獲取率和客觀分析的要求---已經不能僅依賴於人的感知來處理了.因
而,生物信息學與機器學習相結合也就成了必然.
機器學習中最基本的理論框架是建立在概率基礎上的,從某種意義來說,是
統計模型擬合的延續,其目的均為提取有用信息.機器學習與模式識別和統計推
理密切相關.學習方法包括數據聚類,神經網路分類器和非線性回歸等等.隱馬
爾可夫模型也廣泛用於預測DNA的基因結構.目前研究重心包括:1)觀測和
探索有趣的現象.目前ML研究的焦點是如何可視化和探索高維向量數據.一般
的方法是將其約簡至低維空間,如常規的主成分分析(PCA),核主成分分析
(KPCA),獨立成分分析(Independent component analysis),局部線性嵌套(Locally
Linear embedding).2)生成假設和形式化模型來解釋現象[6].大多數聚類方法可
看成是擬合向量數據至某種簡單分布的混合.在生物信息學中聚類方法已經用於
microarray數據分析中,癌症類型分類及其他方向中.機器學習也用於從基因數
據庫中獲得相應的現象解釋.
機器學習加速了生物信息學的進展,也帶了相應的問題.機器學習方法大多
假定數據符合某種相對固定的模型,而一般數據結構通常是可變的,在生物信息
學中尤其如此,因此,有必要建立一套不依賴於假定數據結構的一般性方法來尋
找數據集的內在結構.其次,機器學習方法中常採用"黑箱"操作,如神經網路
和隱馬爾可夫模型,對於獲得特定解的內在機理仍不清楚.
四, 生物信息學的數學問題
生物信息學中數學佔了很大的比重.統計學,包括多元統計學,是生物信息
學的數學基礎之一;概率論與隨機過程理論,如近年來興起的隱馬爾科夫鏈模型
(HMM),在生物信息學中有重要應用;其他如用於序列比對的運籌學;蛋白質
空間結構預測和分子對接研究中採用的最優化理論;研究DNA超螺旋結構的拓
撲學;研究遺傳密碼和DNA序列的對稱性方面的群論等等.總之,各種數學理
論或多或少在生物學研究中起到了相應的作用.
但並非所有的數學方法在引入生物信息學中都能普遍成立的,以下以統計學
和度量空間為例來說明.
1, 統計學的悖論
數學的發展是伴隨悖論而發展的.對於進化樹研究和聚類研究中最顯著的悖
論莫過於均值了,如圖1:
圖1 兩組同心圓的數據集
圖1是兩組同心圓構成的數據集,顯然,兩組數據集的均值均在圓點,這也
就說明了要採用常規的均值方法不能將這兩類分開,也表明均值並不能帶來更多
的數據的幾何性質.那麼,如果數據呈現類似的特有分布時,常有的進化樹演算法
和聚類演算法(如K-均值)往往會得錯誤的結論.統計上存在的陷阱往往是由於
對數據的結構缺乏一般性認識而產生的.
2, 度量空間的假設
在生物信息學中,進化樹的確立,基因的聚類等都需要引入度量的概念.舉
例來說,距離上相近或具有相似性的基因等具有相同的功能,在進化樹中滿足分
值最小的具有相同的父系,這一度量空間的前提假設是度量在全局意義下成立.
那麼,是否這種前提假設具有普適性呢
我們不妨給出一般的描述:假定兩個向量為A,B,其中,
,則在假定且滿足維數間線性無關的前提下,兩個
向量的度量可定義為:
(1)
依據上式可以得到滿足正交不變運動群的歐氏度量空間,這也是大多數生物信息
學中常採用的一般性描述,即假定了變數間線性無關.
然而,這種假設一般不能正確描述度量的性質,尤其在高維數據集時,不考
慮數據變數間的非線性相關性顯然存在問題,由此,我們可以認為,一個正確的
度量公式可由下式給出:
(2)
上式中採用了愛因斯坦和式約定,描述了變數間的度量關系.後者在滿足
(3)
時等價於(1),因而是更一般的描述,然而問題在於如何准確描述變數間的非線
性相關性,我們正在研究這個問題.
五, 幾種統計學習理論在生物信息學中應用的困難
生物信息學中面對的數據量和資料庫都是規模很大的,而相對的目標函數卻
一般難以給出明確的定義.生物信息學面臨的這種困難,可以描述成問題規模的
巨大以及問題定義的病態性之間的矛盾,一般從數學上來看,引入某個正則項來
改善性能是必然的[7].以下對基於這一思想產生的統計學習理論[8],Kolmogorov
復雜性[98]和BIC(Bayesian Information Criterion)[109]及其存在的問題給出簡要介
紹.
支持向量機(SVM)是近來較熱門的一種方法,其研究背景是Vapnik的統計
學習理論,是通過最大化兩個數據集的最大間隔來實現分類,對於非線性問題則
採用核函數將數據集映射至高維空間而又無需顯式描述數據集在高維空間的性
質,這一方法較之神經方法的好處在於將神經網路隱層的參數選擇簡化為對核函
數的選擇,因此,受到廣泛的注意.在生物信息學中也開始受到重視,然而,核
函數的選擇問題本身是一個相當困難的問題,從這個層次來看,最優核函數的選
擇可能只是一種理想,SVM也有可能象神經網路一樣只是機器學習研究進程中
又一個大氣泡.
Kolmogorov復雜性思想與統計學習理論思想分別從不同的角度描述了學習
的性質,前者從編碼的角度,後者基於有限樣本來獲得一致收斂性.Kolmogorov
復雜性是不可計算的,因此由此衍生了MDL原則(最小描述長度),其最初只
適用於離散數據,最近已經推廣至連續數據集中,試圖從編碼角度獲得對模型參
數的最小描述.其缺陷在於建模的復雜性過高,導致在大數據集中難以運用.
BIC准則從模型復雜性角度來考慮,BIC准則對模型復雜度較高的給予大的
懲罰,反之,懲罰則小,隱式地體現了奧卡姆剃刀("Occam Razor")原理,近
年也廣泛應用於生物信息學中.BIC准則的主要局限是對參數模型的假定和先驗
的選擇的敏感性,在數據量較大時處理較慢.因此,在這一方面仍然有許多探索
的空間.
六, 討論與總結
人類對基因的認識,從以往的對單個基因的了解,上升到在整個基因組水平
上考察基因的組織結構和信息結構,考察基因之間在位置,結構和功能上的相互
關系.這就要求生物信息學在一些基本的思路上要做本質的觀念轉變,本節就這
些問題做出探討和思索.
啟發式方法:
Simond在人類的認知一書中指出,人在解決問題時,一般並不去尋找最優
的方法,而只要求找到一個滿意的方法.因為即使是解決最簡單的問題,要想得
到次數最少,效能最高的解決方法也是非常困難的.最優方法和滿意方法之間的
困難程度相差很大,後者不依賴於問題的空間,不需要進行全部搜索,而只要能
達到解決的程度就可以了.正如前所述,面對大規模的序列和蛋白質結構數據集,
要獲得全局結果,往往是即使演算法復雜度為線性時也不能夠得到好的結果,因此,
要通過變換解空間或不依賴於問題的解空間獲得滿意解,生物信息學仍需要人工
智能和認知科學對人腦的進一步認識,並從中得到更好的啟發式方法.
問題規模不同的處理:
Marvin Minsky在人工智慧研究中曾指出:小規模數據量的處理向大規模數
據量推廣時,往往並非演算法上的改進能做到的,更多的是要做本質性的變化.這
好比一個人爬樹,每天都可以爬高一些,但要想爬到月球,就必須採用其他方法
一樣.在分子生物學中,傳統的實驗方法已不適應處理飛速增長的海量數據.同
樣,在採用計算機處理上,也並非依靠原有的計算機演算法就能夠解決現有的數據
挖掘問題.如在序列對齊(sequence Alignment)問題上,在小規模數據中可以採用
動態規劃,而在大規模序列對齊時不得不引入啟發式方法,如BALST,FASTA.
樂觀中的隱擾
生物信息學是一門新興學科,起步於20世紀90年代,至今已進入"後基因
組時代",目前在這一領域的研究人員均呈普遍樂觀態度,那麼,是否存在潛在
的隱擾呢
不妨回顧一下早期人工智慧的發展史[11],在1960年左右,西蒙曾相信不出
十年,人類即可象完成登月一樣完成對人的模擬,造出一個與人智能行為完全相
同的機器人.而至今為止,這一諾言仍然遙遙無期.盡管人工智慧研究得到的成
果已經滲入到各個領域,但對人的思維行為的了解遠未完全明了.從本質來看,
這是由於最初人工智慧研究上定位錯誤以及沒有從認識論角度看清人工智慧的
本質造成的;從研究角度來看,將智能行為還原成一般的形式化語言和規則並不
能完整描述人的行為,期望物理科學的成功同樣在人工智慧研究中適用並不現
實.
反觀生物信息學,其目的是期望從基因序列上解開一切生物的基本奧秘,從
結構上獲得生命的生理機制,這從哲學上來看是期望從分子層次上解釋人類的所
有行為和功能和致病原因.這類似於人工智慧早期發展中表現的樂觀行為,也來
自於早期分子生物學,生物物理和生物化學的成就.然而,從本質上來講,與人
工智能研究相似,都是希望將生命的奧秘還原成孤立的基因序列或單個蛋白質的
功能,而很少強調基因序列或蛋白質組作為一個整體在生命體中的調控作用.我
們因此也不得不思考,這種研究的最終結果是否能夠支撐我們對生物信息學的樂
觀呢 現在說肯定的話也許為時尚早.
綜上所述,不難看出,生物信息學並不是一個足以樂觀的領域,究竟原因,
是由於其是基於分子生物學與多種學科交叉而成的新學科,現有的形勢仍表現為
各種學科的簡單堆砌,相互之間的聯系並不是特別的緊密.在處理大規模數據方
面,沒有行之有效的一般性方法;而對於大規模數據內在的生成機制也沒有完全
明了,這使得生物信息學的研究短期內很難有突破性的結果.那麼,要得到真正
的解決,最終不能從計算機科學得到,真正地解決可能還是得從生物學自身,從
數學上的新思路來獲得本質性的動力.
毫無疑問,正如Dulbecco1986年所說:"人類的DNA序列是人類的真諦,
這個世界上發生的一切事情,都與這一序列息息相關".但要完全破譯這一序列
以及相關的內容,我們還有相當長的路要走.
(來源 ------[InfoBio.org | 生物信息學研討組])http://www.infobio.org
生物信息學(Bioinformatics)是在生命科學的研究中,以計算機為工具對生物信息進行儲存、檢索和分析的科學。它是當今生命科學和自然科學的重大前沿領域之一,同時也將是21世紀自然科學的核心領域之一。其研究重點主要體現在基因組學(Genomics)和蛋白學(Proteomics)兩方面,具體說就是從核酸和蛋白質序列出發,分析序列中表達的結構功能的生物信息。
生物信息學是一門利用計算機技術研究生物系統之規律的學科。
目前的生物信息學基本上只是分子生物學與信息技術(尤其是網際網路技術)的結合體。生物信息學的研究材料和結果就是各種各樣的生物學數據,其研究工具是計算機,研究方法包括對生物學數據的搜索(收集和篩選)、處理(編輯、整理、管理和顯示)及利用(計算、模擬)。
1990年代以來,伴隨著各種基因組測序計劃的展開和分子結構測定技術的突破和Internet的普及,數以百計的生物學資料庫如雨後春筍般迅速出現和成長。對生物信息學工作者提出了嚴峻的挑戰:數以億計的ACGT序列中包涵著什麼信息?基因組中的這些信息怎樣控制有機體的發育?基因組本身又是怎樣進化的?
生物信息學的另一個挑戰是從蛋白質的氨基酸序列預測蛋白質結構。這個難題已困擾理論生物學家達半個多世紀,如今找到問題答案要求正變得日益迫切。諾貝爾獎獲得者W. Gilbert在1991年曾經指出:「傳統生物學解決問題的方式是實驗的。現在,基於全部基因都將知曉,並以電子可操作的方式駐留在資料庫中,新的生物學研究模式的出發點應是理論的。一個科學家將從理論推測出發,然後再回到實驗中去,追蹤或驗證這些理論假設」。
生物信息學的主要研究方向: 基因組學 - 蛋白質組學 - 系統生物學 - 比較基因組學
姑且不去引用生物信息學冗長的定義,以通俗的語言闡述其核心應用即是:隨著包括人類基因組計劃在內的生物基因組測序工程的里程碑式的進展,由此產生的包括生物體生老病死的生物數據以前所未有的速度遞增,目前已達到每14個月翻一番的速度。同時隨著互聯網的普及,數以百計的生物學資料庫如雨後春筍般迅速出現和成長。然而這些僅僅是原始生物信息的獲取,是生物信息學產業發展的初組階段,這一階段的生物信息學企業大都以出售生物資料庫為生。以人類基因組測序而聞名的塞萊拉公司即是這一階段的成功代表。
原始的生物信息資源挖掘出來後,生命科學工作者面臨著嚴峻的挑戰:數以億計的ACGT序列中包涵著什麼信息?基因組中的這些信息怎樣控制有機體的發育?基因組本身又是怎樣進化的?生物信息學產業的高級階段體現於此,人類從此進入了以生物信息學為中心的後基因組時代。結合生物信息學的新葯創新工程即是這一階段的典型應用。
⑹ 結構體內存對齊
1、數據成員對齊規則: 結構( struct )(或聯合( union )的)數據成員,第一個數據成員放在 offset 為 0 的地方,以後每個數據成員存儲的起始位置要從該成員大小或者成員的子成員大小(只要該成員有子成員,比如說數組,結構體等)的整數倍開始(如int為4位元組,要從4的整數倍地址開始存儲)
2、結構體作為成員: 如果一個結構體有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍地址開始存儲。(struct a 里存有struct b, b里有 char, int ,double等元素,那b 應該從8的整數倍開始存儲。)
3、收尾工作:結構體的總大小,也就是sizeof的結果,必須是內部最大成員的整數倍,不足要補齊
( 注 :如自定義類或繼承關系 屬性的多少變化而變化,如單純的繼承NSObject並且沒有任何屬性 列印為8 因為 有隱藏 isa 萬物皆對象,而對象的本質為 繼承 objc_object 的結構體 它就是對象模板)
拓 : 我們知道alloc 流程 最重要的三部曲
cls->instanceSize:計算需要開辟的內存空間大小(這里有一個演算法為16位元組對齊)
calloc:申請內存,返回地址指針
obj->initInstanceIsa:將 類 與 isa 關聯
首先創建 3個結構體 這三個結構體內部參數類型 都一樣 只不過 是順序不一樣
根據內存規則 我們畫圖來分析
分析: ofsize 0 開始 存儲 char 類型占 一個 位元組的 a ; b 要存儲了 首先分析 自己自身多大 我是 double 類型的 我需要佔 8 個位元組 可是 如果從 a 後面 開始 不滿足自身 8 的倍數 的地方 那我只能往下數 看來只能到 8的位置開始 容納我的身體 【8 - 15 】 ; 該 c 出廠 存儲了 我自身佔用 4位元組 我是 int 類型的 我只能先從16 開始 我的天 真幸運 正好符合我 自身4位元組的倍數 我可以 存儲了 【16- 19】 d 出場了 我 自身占 2個位元組 得需要從20 位開始找 能不能滿足 我的倍數的規則要求 20 除 2 可以的 我也可以放下了 【20 - 21】
Mystruct1 結構體 承載了 21+1 個位元組 突然 大喇叭喊出規則:結構體的 總大小 ,也就是sizeof的結果, 必須是內部最大成員的整數倍,不足要補齊 :好的 那我裡面最大的是 8 位元組 那麼 我現在 算出來 22 那麼 補齊就好了嘛 不要激動 心裡默念: 二 八 16, 不滿足 ; 三八 24 滿足啦 結束了。所以 Mystruct1 佔用 24個位元組空間
分析: 從 0 的位置開始存 自身是double 類型的佔用8個位元組的 b【0-7】
a 是 佔用一個位元組的char類型 ,從 8的位置 滿足自身1位元組的倍數 所以 存儲在8的位置【8】,c來了 首先 我自己是 int類型 我佔用 4個位元組 我只能從 9的位置開始存 可是 不滿足 規則 必須是自己位元組數的倍數,那我只能往下數了 9.10.11.12 咦!12是我的位置 那就從12開始【12-15】, d來了 首先想自己是 short類型的佔用2個位元組 我只能先從 16 的位置看 咦!這么巧 正好符合規則 是我的倍數 存這沒毛病
Mystruct2 結構體 承載了 17+1 個位元組 ,大喇叭又開始廣播了:結構體的 總大小 ,也就是sizeof的結果, 必須是內部最大成員的整數倍,不足要補齊 ,好的村長 我補齊: 結構體最大的是 double占 用8個位元組 我算出來18。 2*8 = 16 不滿足 3 *8 = 24 村長 我滿足了。所以 Mystruct2 佔用 24個位元組空間
分析:從0 開始 存入一個 char類型的a d 來了 首先分析自己 是short類型 佔用2個位元組 那我如果從1 開始 那不是我的倍數 不滿足規則。所以 往下看 2 好像 是我位元組的倍數 ,好的存入 【2-3】 c來了我是 int類型的 佔4位元組 我只能從4開始存儲 好像也滿足 是我的自身4位元組的倍數 ,好的存入【4-7】,b來了 嗯我是double類型 我自身佔用8位元組 我只能從 8號位置 開始存儲 好像 8也是我的倍數 好的 存入【8-15】
`Mystruct3 結構體 承載了 15+1個位元組,行了大喇叭別廣播了 我知道了 我內部成員最大 的為8位元組 必須是 8位元組的整數倍 不足要補齊。
2*8 = 16 我滿足了 ,所以 Mystruct3佔用 16個位元組
我們已經對結構體內存很明晰了 那麼來個嵌套的
上面我們分析了 Mystruct3 佔用 16 個位元組 那麼 Mystruct4佔用多少呢
分析:
a 是佔用一個位元組的char類型 放在【0】
b是 佔4位元組的int類型 找到最近的 自身的佔用位元組的倍數的位置 為【4-7】
sturct3 是一個佔用 16位元組 的結構體 我們首先分析它最大的成員佔多少內存 這里 為double 類型 佔8個位元組 所以應該 從8 的倍數開始存放第一個元素 上面的b佔了【4-7】故只能從8往後數 正好8的位置 是 sturct3里最大元素的倍數 故第一個元素位置為【8】第二個元素為short類型佔2個位元組 所以需要從8 往後數正好滿足自身的倍數 也就是【10 11】 第三個元素為double類型 佔8個位元組 所以需要從11 往後數滿足8 的倍數 也就是【16 - 23】 因為 sturct3 是個結構體 也滿足內存對齊原則 也就是 最大元素的倍數 sturct3佔了 16位元組 正好滿足 對齊原則 a 佔1 個 空白佔3 b 佔4 個 加在一起占 24個
sturct4 內存對齊 為 最大成員的倍數 最大成員 為struct3 里double 8 位元組 所以
又是大喇叭所說的 內部成員最大位元組 的倍數
所以 sizeof(Mysturct4) 最終 為 24
注意:
⑺ 如何對齊零亂的代碼
使用快捷鍵對齊凌亂的代碼,在編寫程序時,有時只考慮了程序的演算法,而忘記了代碼的縮進格式。導致寫出來的一段代碼非常零亂。此時,可以按Alt+F8組合鍵來對齊代碼。在實例中經常使用快捷鍵將多行不規則的代碼對齊,如果不使用該快捷鍵而是一行一行對齊是很浪費時間的,但使用快捷鍵對齊也是需要在一定編碼規范內的。如果將代碼全部寫在一行內,則是無法完成對齊的。(1)創建基於對話框的應用程序。(2)在對話框中添加一個編輯框和一個按鈕,並填寫按鈕的實現代碼,代碼如下:void CArrangeCodeDlg::OnEnter()�0�2�0�2 {�0�2�0�2�0�2�0�2 CString strResult;�0�2 GetDlgItem(IDC_ED_RESULT)->GetWindowText(strResult);�0�2 for(int i=0;i<strResult.GetLength();i++)�0�2 {�0�2 �0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2 char cGet;�0�2 �0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2 cGet=strResult.GetAt(i);�0�2 �0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2 if(cGet>'a')�0�2 �0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2 {�0�2 �0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2 MessageBox(NULL,"字元輸出","提示",MB_OK);�0�2 �0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2 }�0�2 }�0�2 }�0�2 (3)將代碼的對齊打亂,並通過Alt+F8組合鍵重新對齊。心法領悟016:移動多行代碼的快捷方式。在Visual C++中能夠多行移動代碼的快捷鍵還有許多,例如將多行代碼整體向左移動的快捷鍵是Shift+Ctrl+ M,將多行代碼整體向右移動的快捷鍵是Tab鍵。這兩種移動方法都保持原來的對齊方法不變,進行整體移動。
⑻ JAVA演算法求助,左對齊 居中和右對齊
style=「text-align:left」--左對齊
style=「text-align:center」--居中對齊
style=「text-align:right」--右對齊
⑼ 什麼是數據的對齊為什麼要對齊
有關位元組對齊的介紹:
什麼是對齊,以及為什麼要對齊:
現代計算機中內存空間都是按照byte劃分的,從理論上講似乎對任何類型的變數的訪問可以從任何地址開始,但實際情況是在訪問特定變數的時候經常在特定的內存地址訪問,這就需要各類型數據按照一定的規則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。
對齊的作用和原因:各個硬體平台對存儲空間的處理上有很大的不同。一些平台對某些特定類型的數據只能從某些特定地址開始存取。其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台要求對數據存放進行對齊,會在存取效率上帶來損失。比如有些平台每次讀都是從偶地址開始,如果一個int型(假設為32 位系統)如果存放在偶地址開始的地方,那麼一個讀周期就可以讀出,而如果存放在奇地址開始的地方,就可能會需要2個讀周期,並對兩次讀出的結果的高低位元組進行拼湊才能得到該int數據。顯然在讀取效
率上下降很多。這也是空間和時間的博弈。
對齊的實現
通常,我們寫程序的時候,不需要考慮對齊問題。編譯器會替我們選擇適合目標平台的對齊策略。當然,我們也可以通知給編譯器傳遞預編譯指令而改變對指定數據的對齊方法。
但是,正因為我們一般不需要關心這個問題,所以因為編輯器對數據存放做了對齊,而我們不了解的話,常常會對一些問題感到迷惑。最常見的就是struct數據結構的sizeof結果,出乎意料。為此,我們需要對對齊演算法所了解。
對齊的演算法:
設結構體如下定義:
struct A
{
int a;
char b;
short c;
};
結構體A中包含了4位元組長度的int一個,1位元組長度的char一個和2位元組長度的short型數據一個。所以A用到的空間應該是7位元組。但是因為編譯器要對數據成員在空間上進行對齊。
所以使用sizeof(strcut A)值為8。
現在把該結構體調整成員變數的順序。
struct B
{
char b;
int a;
short c;
};
這時候同樣是總共7個位元組的變數,但是sizeof(struct B)的值卻是12。
下面我們使用預編譯指令#progma pack (value)來告訴編譯器,使用我們指定的對齊值來取代預設的。
#progma pack (2) /*指定按2位元組對齊*/
struct C
{
char b;
int a;
short c;
};
#progma pack () /*取消指定對齊,恢復預設對齊*/
sizeof(struct C)值是8。
修改對齊值為1:
#progma pack (1) /*指定按1位元組對齊*/
struct D
{
char b;
int a;
short c;
};
#progma pack () /*取消指定對齊,恢復預設對齊*/
sizeof(struct D)值為7。
對於char型數據,其自身對齊值為1,對於short型為2,對於int,float,double類型,其自身對齊值為4,單位位元組。
這裡面有四個概念值:
1.數據類型自身的對齊值:就是上面交代的基本數據類型的自身對齊值。
2.指定對齊值:#progma pack (value)時的指定對齊值value。
3.結構體或者類的自身對齊值:其成員中自身對齊值最大的那個值。
4.數據成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中小的那個值。
有了這些值,我們就可以很方便的來討論具體數據結構的成員和其自身的對齊方式。有效對齊值N是最終用來決定數據存放地址方式的值,最重要。有效對齊N,就是表示「對齊在N上」,也就是說該數據的"存放起始地址%N=0".而數據結構中的數據變數都是按定義的先後順序來排放的。第一個數據變數的起始地址就是數據結構的起始地址。結構體的成員變數要對齊排放,結構體本身也要根據自身的有效對齊值圓整(就是結構體成員變數佔用總長度需要是對結構體有效對齊值的整數倍,結合下面例子理解)。這樣就不能理解上面的幾個例子的值了。
例子分析:
分析例子B;
struct B
{
char b;
int a;
short c;
};
假設B從地址空間0x0000開始排放。該例子中沒有定義指定對齊值,在筆者環境下,該值默認為4。第一個成員變數b的自身對齊值是1,比指定或者默認指定對齊值4小,所以其有效對齊值為1,所以其存放地址0x0000符合0x0000%1=0.第二個成員變數a,其自身對齊值為4,所以有效對齊值也為4,所以只能存放在起始地址為0x0004到0x0007這四個連續的位元組空間中,復核0x0004%4=0,且緊靠第一個變數。第三個變數c,自身對齊值為 2,所以有效對齊值也是2,可以存放在0x0008到0x0009這兩個位元組空間中,符合0x0008%2=0。所以從0x0000到0x0009存放的都是B內容。再看數據結構B的自身對齊值為其變數中最大對齊值(這里是b)所以就是4,所以結構體的有效對齊值也是4。根據結構體圓整的要求, 0x0009到0x0000=10位元組,(10+2)%4=0。所以0x0000A到0x000B也為結構體B所佔用。故B從0x0000到0x000B 共有12個位元組,sizeof(struct B)=12;
同理,分析上面例子C:
#progma pack (2) /*指定按2位元組對齊*/
struct C
{
char b;
int a;
short c;
};
#progma pack () /*取消指定對齊,恢復預設對齊*/
第一個變數b的自身對齊值為1,指定對齊值為2,所以,其有效對齊值為1,假設C從0x0000開始,那麼b存放在0x0000,符合0x0000%1= 0;第二個變數,自身對齊值為4,指定對齊值為2,所以有效對齊值為2,所以順序存放在0x0002、0x0003、0x0004、0x0005四個連續位元組中,符合0x0002%2=0。第三個變數c的自身對齊值為2,所以有效對齊值為2,順序存放
在0x0006、0x0007中,符合 0x0006%2=0。所以從0x0000到0x00007共八位元組存放的是C的變數。又C的自身對齊值為4,所以C的有效對齊值為2。又8%2=0,C 只佔用0x0000到0x0007的八個位元組。所以sizeof(struct C)=8.
⑽ 請寫一個位元組對齊演算法int align(x,y),既輸入寫,使之對齊到y位元組,比如f(3,4)=4;f(11,8)=16。
intalign(intx,inty)
{
intr=x%y;
if(r)returnx+y-r;elsereturnx;
}