⑵ 一個企業,特別是電商類的,如何進行大數據分析
大數據不僅僅意味著數據大,最重要的是對大數據進行分析,只有通過分析才能獲取很多智能的、深入的、有價值的信息。下面介紹大數據分析的五個基本方面——
預測性分析能力:數據挖掘可以讓分析員更好地理解數據,而預測性分析可以讓分析員根據可視化分析和數據挖掘的結果做出一些預測性的判斷。
數據質量和數據管理:通過標准化的流程和工具對數據進行處理,可以保證一個預先定義好的高質量的分析結果。
可視化分析:不管是對數據分析專家還是普通用戶,數據可視化是數據分析工具最基本的要求,可視化可以直觀的展示數據,讓數據自己說話,讓觀眾聽到結果。
語義引擎:由於非結構化數據的多樣性帶來了數據分析的新的挑戰,我們需要一系列的工具去解析、提取、分析數據,語義引擎需要被設計成能夠從「文檔」中智能提取信息。
數據挖掘演算法:可視化是給人看的,數據挖掘就是給機器看的,集群、分割、孤立點分析還有其他的演算法讓我們深入數據內部,挖掘價值,這些演算法不僅要處理大數據的量,也要處理大數據的速度。
據我所知多瑞科輿情數據分析站大數據分析還可以。針對單個網站上的海量數據,無遺漏搜集整理歸檔,並且支持各種圖文分析報告;針對微博或網站或微信,活動用戶投票和活動用戶評論互動信息整理歸檔,統計分析精準預測製造新數據;針對某個論壇版塊數據精準採集,數據歸類,出分析報告,准確定位最新市場動態;針對某個網站監測用戶的操作愛好,評定最受歡迎功能;針對部分網站,做實時數據抽取,預警支持關注信息的最新擴散情況;針對全網數據支持定向採集,設置關鍵詞搜集數據,也可以劃分區域或指定網站搜集數據針對電商網站實時監測評論,歸類成文檔,支持出報告。
大數據會影響整個社會的發展,主要看是想要利用數據做什麼了
⑶ 當唐詩宋詞遇上大數據
文/戴玥
從數據的角度解讀唐詩宋詞,居然能得出超乎想像的結論。這是我所在的浙江大學計算機學院CAD&CG(計算機輔助設計與圖形學)國家重點實驗室與新華網合作推出的兩款數據新聞作品「我有柔情似水,亦有豪情萬丈——唐代女詩人群像」和「宋詞繾綣,何處畫人間」所研究的內容。
什麼是數據新聞?數據新聞又稱數據驅動新聞,是指基於數據的抓取、挖掘、統計、分析和可視化呈現的新型新聞報道方式。如果把未經處理的數據比作新鮮的食材,那麼數據新聞就是將一道精心烹飪的菜餚呈現在讀者面前。「一千個讀者心中有一千個哈姆雷特」,每個人都能從中品出不同的滋味。
為了更加深入地了解「菜餚」的烹制方法,我在浙江大學紫金港校區采訪了兩個作品的總負責人陳為教授與項目的具體負責人張瑋老師。與兩位老師的談話,使得看似神秘的「烹制方法」逐漸清晰起來。
科學而嚴謹的「仕女圖」:唐代女詩人群像
唐詩項目「我有柔情似水,亦有豪情萬丈——唐代女詩人群像」分析了約5.5萬首唐詩,採用多樣化的圖表對唐代女詩人的創作情況進行了可視化呈現。
第一幅圖表是關於唐代詩人創作數量的一覽圖,分別對存世1首、2首、3~5首、5~10首、10~50首及50首以上作品的詩人數量以點陣圖的方式進行了表述,每一個點都代表著一位詩人,滑鼠懸浮在點上便顯示出詩人的姓名與作品數,詩人的性別則用灰色與朱紅色區分。在不同階段,用畫像著重標出了著名的代表詩人,如在「3~5首」的階段里,存世3首作品的張若虛是其中的代表,而在「50首以上」的階段中,存世3009首的白居易又是其中的翹楚。面對單純的數字,我們或許不能敏銳地感知背後的意義,而在點陣圖中,較之於許許多多僅留下孤篇的詩人,我們便可以感受到有3009首作品傳世的香山居士在當時及後世擁有多麼驚人的影響力。三千餘篇詩作歷經一千多年時間長河的波濤洶涌仍然傳遞到了我們手中,這又是怎樣一份文化與 歷史 的厚重。
第二幅圖表是「唐代女詩人全景圖」,將唐朝劃分為初唐、盛唐、中唐、晚唐四個階段。此處同樣採用了點陣的表現方式,但用硃砂色的花朵代替了「點」,不同形狀的花朵代表著女性詩人的不同身份,她們有的是宮廷詩人,如上官婉兒,有的是士大夫妻女,有的則是民間女子或歌妓,而作品存留數量最多同時也最著名的幾人,如薛濤、李冶、魚玄機等人,則以盛開的荷花標記。人們常以花朵喻美人,而這些朱紅的花朵也彷彿承繼了這些女子的驚才絕艷,在紙卷上美好而熱烈地盛開。
在我們的印象里,盛唐才是詩人輩出的時代,其時有李杜等冠絕古今的大詩人出現,想必此時的女性詩人數量應該最多。但這張全景圖卻給出了不一樣的答案——盛唐時的女性詩人僅僅比初唐與中唐稍多,反而是晚唐時期女性詩人數量為最,幾是中唐與盛唐時期的兩倍。發現這個與認知大相徑庭的事實後,我開始嘗試為此找到一種解釋。聯系此前所學,我想或許是因為晚唐時 社會 狀況江河日下,詩風亦偏於陰柔細膩,恰與女性的特質相符,使得女性詩人數量劇增。而我們所認為是詩歌盛世的盛唐時期,詩風大氣而雄壯,這大概與女性氣質不符吧。
第三幅圖表是「詩人詩作字頻詞頻圖」,字詞的大小與深淺顯示著它們被使用的頻率。女性詩人作品中最高頻詞「相思」便可說明女詩人的一貫風格,與我們尋常的認知沒有太大出入,女詩人常常在詩中抒發「相思」與「寂寞」之情。同男性詩人一樣,「風」與「人」都是最高頻的字,而較之於男性,女性詩人又更喜歡運用「花」「月」「春」等柔美的意象,而通過這些意象,女性獨特的內心體驗可見一斑。
最後是「唐代女詩人社交圖」,圖中選取了最具代表的幾位女性詩人,將她們的社交關系以圓與線的方式表現出來,線的粗細則代表社交關系的深淺。通過這張圖可以發現,薛濤與李冶兩位著名的女詩人都與劉禹錫有過詩作唱和。或許我們未能知曉同時位列唐朝四大女詩人的這兩位才女是否有過交集,但此刻她們卻歷經遙遠的時空被線聯系在一起。
之後另有薛濤與李冶單獨的社交關系圖。在李冶的社交圖中,詩人與陸羽、皎然之間形成了一個三角,可見這也是一個詩人之間的「小圈子」,三人都對茶學、佛學等有很大的興趣,並且也曾互有酬和。而「女校書」薛濤的社交圖中類似的圈子更多也更大,最大的有元稹、白居易、劉禹錫、嚴綬等人,他們大多互相認識或者熟識,彷彿是古代版的「朋友圈共同好友」,隱匿在典籍中的錯綜復雜的關系網路具象為簡單明了的社交圖,似乎古人被時間重重遮掩的面貌也在霎時間清晰起來。
新聞的網頁背景模擬了泛黃古卷,配上古雅的圖案設計與字體設計,構成了一幅交織著理性與嚴謹的「仕女圖」,雖未有畫像出現,但透過數據架成的時光之橋,我們彷彿能透過千年的塵埃而窺見美人含羞的影子。
對於數據新聞作品的外觀設計,項目的具體負責人張偉老師表示,他們對每一個圖表都做了兩套以上的方案,經過不斷的篩選與考量之後才有我們所見的這一套外觀。網頁設計也如古時畫工制畫一般,如切如磋,如琢如磨,方能以美的姿態喚起觀者精神的共鳴。
宋朝詞人的情緒表達
宋詞項目「宋詞繾綣,何處畫人間」以《全宋詞》為樣本,從近21000首詞作、1330位詞人的龐大數據中呈現了豐富的圖表。有別於唐詩作品的精緻與古典氣息,宋詞作品的外觀則帶有朦朧的寫意風格,圖表亦多處採用了水墨元素,將精確的數據渲染出詩意之美。
整篇作品分為三個版塊,「萬水千山走遍」「草木皆有情,詞即人生」「春風化雨,歷久彌新」。在第一個板塊「萬水千山走遍」中,首先映入眼簾的就是一幅宋朝的疆域圖,其中以灰點代表著詞人們曾到達過的地方,灰點越大代表到達越多人次。灰點密集地覆蓋了宋朝的大半版圖,除了青藏高原一帶鮮有涉足外,天山南北亦有詞人們的足跡。滑鼠懸浮其上會顯示出詞人的行進路線,跨度最大的一條由疆域的最北端一直延伸到最南的臨海地區。孔子周遊列國的路線其實僅在河南至山東一帶,但今天高鐵幾個小時就能到達的路途,孔子卻走了十數年。這條從南至北貫穿宋朝疆域的路線,很有可能耗費了一位詞人一生的時間。
之後是宋朝詞人的全景圖,這幅全景圖採用了折線圖的方式,橫軸為北宋至南宋的各個 歷史 階段,而縱軸為詞人作品數量。每一段線條代表一位詞人,水平線是詞人的平民時期,向上的折線則是詞人的仕途時期,線條的灰色與棕色來區分婉約派與豪放派。在眾多詞人中,一生布衣「梅妻鶴子」的林逋與女性詞人李清照的線條都是一條水平線,其餘詞人的線條都有起有伏,一生的悲歡跌宕都被一條簡單的線所勾勒,引人唏噓。
在第二個版塊「草木皆有情,詞即人生」中,首先對《全宋詞》的詞頻進行了統計。最高頻詞分別為「東風」「何處」「人間」,宋朝的積貧積弱以及靖康之變加重了詞人心中的漂泊感,他們彷彿一直在尋覓,無論是「今宵酒醒何處」,還是陸放翁常書於詞中的「歸何處」,都是一聲聲對心靈的叩問。
第二幅圖表是宋代著名詞人常見意象及其表達情緒的統計,喜、怒、哀、樂、思五種情緒分別用不同顏色表示,每一種意象都有它所承載情緒表達次數的餅狀統計圖,滑鼠懸浮在詞人名上可以顯示出他們所使用的意象表達情緒次數的比例。王國維曾言「以我觀物,故物皆著我之色彩」,豪放派代表人物辛棄疾常用「酒」「月」等意象,使人聯想到邊關冷月、煮酒悲歌,而晏殊之子晏幾道詞風婉約,他少年時家道中落,此後一生流離,詞中多以落魄王孫的形象出現,常在「小樓」中流連時光,他的名句「舞低楊柳樓心月,歌盡桃花扇底風」恰能道出他詞中風情。
我好奇如何才能計算出意象中承載的情緒,陳為教授告知是根據已有的演算法和模型來計算的,「對文字當中的 情感 進行計算,是計算機學界研究了二十年的一個問題,已經有了標准方法」,「對於我們來說,這就是教科書上的東西」。原來文學與計算機的結合並不只是今年才興起的,早已產生了超越我們想像的進步。
最後一個版塊「春風化雨,歷久彌新」中將各個詞牌代表詞作的平仄以長短不一的線段標出,配以人聲朗誦,詞被還原了它原始的音樂功能,原先掩藏在字詞背後的韻律被直觀地展現出來。或許相隔千年時光,樂坊的客人也在與我們欣賞著同一首曲子詞,咀嚼同一段繁復綿長的 情感 。
數據化與詞學研究的碰撞引入了「定量」的思維方式
唐詩宋詞與大數據結合而產生的一大效果,即是效率的提升。一張張製作精美的圖表將關鍵信息在眼前一字排開,根據需要可以信手采擷。我不由感嘆,如果我之前作業所需的資料也能以這樣的方式呈現,想必可以省下不少時間。
陳為教授介紹,在大數據普及之前,人文學者們獲取信息需要依靠查閱實物典籍,將一本本書從頭翻到尾, 科技 進步後,很多典籍都有了電子掃描版,但還是需要人工檢索,在電腦上將所有的文字讀完。但大數據帶來了改變,「假設我能夠把它核心的、關鍵的特徵和信息提煉,並用計算機建模做出來,然後呈現在屏幕上,這些人的關鍵信息就這些,他跟誰有關系,他有什麼作品,他的生活環境怎樣,這就極大地提高了效率。」
就讀人文專業的我,時常為了解一位古代詩人在某一時間段生活的 社會 環境,對著許多影印版的史志和詩人年譜進行「肉眼檢索」,繁體豎排小字看久了讓人眼睛發花。
我想到自己曾做的一份唐宋詞名物意象變遷的作業,我選擇了「釵」的意象。在例舉含有該意象的詞作時,已經有現成的唐宋詞資料庫,其中收錄了相當數量的唐宋詞,我只需要輸入「釵」「銀釵」「鳳釵」等關鍵詞,就能輕松獲取與之相關的一篇篇作品,方便快捷。而在調查「釵」本身材質與形制的變遷時,我所查到的相關飾物名錄和圖鑒有些甚至沒有目錄和頁碼,只能面對繁體豎排字一頁一頁地查閱,看到可能有用的信息也只能使用pdf閱讀軟體自帶的標記功能。一次查找需要耗費很長的時間,而獲取的信息卻遠遠不能與付出的時間等價。有時候翻完了一本幾百頁的書,能夠得到的有用信息也只有幾句話。從這一點來說,大數據的普及著實是一種迫切的需要,它也為人文社科的研究者帶來了福音,省去了許多繁復而低效率的案頭勞作。
大數據除了能夠極大提高科研效率,同時也為研究提供了一種「定量分析」的思維角度。
唐宋詞的數據化研究是20世紀90年代開始興起的一種研究趨勢,與20世紀90年代的數據 科技 發展息息相關。而數據化與詞學研究的碰撞引入了「定量」的思維方式,譬如如何確定一首詞在宋代的受歡迎程度,這在以前的研究中是難以衡量的,即使能夠定性,也是「空口無憑」,沒有相應的證據。但大數據卻可以解決這個難題,統計宋代詞話中這首詞被收錄的次數,就可以大概得出其受歡迎程度的量化結果。統計數據本身就使得結果更精確,也更有說服力。
雖然大數據能夠帶來諸多益處,但大數據與文學研究的交匯中也產生了一些需要注意的問題。在一節專業課上,老師曾舉過一個大數據研究的例子。在《全金元詞》中,使用頻率最高的詞調有兩個,最高為《黑漆弩》,其次是《木蘭花慢》。《木蘭花慢》是我們耳熟能詳的詞調,而《黑漆弩》對於並不十分專業的我來說卻是聞所未聞。《黑漆弩》在宋代也幾乎沒有作品傳世,但它為何會成為使用頻率最高的詞調?原來《黑漆弩》到元代時,進入元雜劇成為了一種曲調,也就是說,它是一種曲化的詞調,可以稱之為曲調。由此反映出了問題,在利用大數據研究詞的時候,樣本問題需要得到重視,譬如在研究《全金元詞》中使用頻率最高的詞調時,像《黑漆弩》這樣曲化的詞調就不應該計入樣本中。采樣問題成為詞學研究大數據化的「攔路虎」。
除了已知樣本的問題,詞學研究領域樣本的不斷變動同樣也困擾著學者們。唐宋詞不斷有遺詞被發現,樣本在不斷地補充。而相對於現存數量有限的唐宋詞,明清詞的數量更是多如恆河之沙,幾乎難以窮盡,如此龐大的樣本本身就是一個令人頭疼的難題。
人文學科與大數據的合作,已經有了令人欣喜的發展,但仍舊任重而道遠。
作為一個人文專業的學生,我也期待著美好圖景成為現實的一天。
文章選自《大學生》
⑷ 大數據和空間限制
網頁黑名單系統、垃圾郵件過濾系統、爬蟲網址判重系統,且系統容忍一定程度的失誤率,但是對空間要求比較嚴格,這種問題一般考慮 布隆過濾器 。布隆過濾器想做到完全正確是不可能的,其優勢在於使用很少的空間可以將准確度做到很高的程度。
哈希函數(散列函數) :輸入域可以是非常大的范圍,但是輸出域是固定的范圍。性質如下:1.無限輸入域;2.傳入相同輸入值時,返回值一樣;3.傳入不同輸入值時,返回值可能一樣也可能不一樣。4.返回值均勻分布
第四點性質是評價哈希函數優劣的關鍵,不同的輸入值所得到的返回值均勻地分布在輸出域上,哈希函數就越優秀,並且這種均勻分布與輸入值出現的規律無關。
布隆過濾器 :一個長為m的bit數組,每個位置只佔一個bit,假設一共有k個哈希函數,這些函數的輸出域都大於等於m。對一個輸入對象,經過k個哈希函數算出結果,每個結果對m取余,然後在bit array上把相應的位置塗黑。檢查一個對象是否是之前的某一個輸入對象,就檢查相應位置是否是黑的,如果有一個不是黑的,則該輸入一定不在集合里。如果都是黑的,說明在集合中,但是可能誤判。如果bit map的大小m相比輸入對象的個數n過小,失誤率會變大。假設輸入個數為n,失誤率為p,則bit map的大小由以下公式確定:
哈希函數的個數由以下公式決定:
因為在確定布隆過濾器大小的過程中選擇了上下取整,所以還要用如下公式確定布隆過濾器真實失誤率:
【題目】有一個包含 20億個全是32位整數的大文件,在其中找到出現次數最多的數
【要求】內存限制為2GB
【解答】想要在很多整數中找到出現次數最多的數,通常的做法是使用哈希表對出現的每一個數做詞頻統計。但是一次性用哈希表統計20億個數的辦法很可能導致內存不夠。解決辦法是把包含20億個數的大文件用哈希函數分成16個小文件,根據哈希函數的性質,同一種數不可能被散列到不同的小文件上,同時每個小文件中不同的數一定不回大於2億種。對每一個小文件用哈希表來統計其中每種數出現的次數,就得到了16個小文件種各自出現次數最多的數,還有各自的次數統計,接下來比較他們就好了。
把一個大的集合通過哈希函數分配到多台機器中,或者分配到多個文件里,這種技巧是處理大數據面試題最常用的技巧之一。
【題目】32位無符號整數的范圍是0~4294967295,現在有一個正好包含40億個無符號整數的文件,可以使用最多1GB的內存,找出所有未出現過的數。
【解答】如果用哈希表的話需要佔用很多空間,所以申請一個長度為4294976295的bitarray,遍歷這40億個數,把對應位置塗黑,然後再遍歷bitarr,哪個位置不是黑的就沒出現
【進階】內存限制為10MB,但是只用找到一個沒出現過的數即可
【解答】先將0~4294967295分為64個區間,遍歷一次分別統計每個區間內的個數,找到某個區間個數少於67108864,這個區間一定有沒出現過的數,再遍歷一次,利用長度為67108864的bit arr,這佔用大約8MB的空間,然後按照上面的方法即可。
【題目】有一個包含100億個URL的大文件,假設每個URL佔用64B,請找出其中所有重復的URL。
【解答】把大文件通過哈希函數分配到機器,或者通過哈希函數把大文件拆成小文件,一直進行這種劃分,直到劃分的結果滿足資源限制的要求。
【補充問題】某搜索公司一天的用戶搜索詞彙是海量的(百億數據量),請設計一種求出每天熱門top100詞彙的可行辦法
【解答】還是用哈希分流的思路來處理,把包含百億數據量的詞彙文件分流到不同的機器上,處理每一個小文件的時候,通過哈希表統計每種詞及其詞頻,哈希表記錄建立完成後,再遍歷哈希表,遍歷哈希表的過程中使用大小為100的小根堆來選出每一個小文件的top100,然後把各個維簡排序後的top100進行外排序或者繼續利用小根堆,就可以選出每台機器上的top100,然後繼續。。。
【題目】32位無符號整數的范圍是0~4294967295,現在有40億個無符號整數,可以使用最多1GB的內存,找出所有出現了兩次的數。
【解答】用bitarr的方式來表示數出現的情況,即申請一個長度為4294967295*2的數組,用兩個位置表示一個數出現的詞頻,第一次設為01,第二次設為10,第三次及以上設為11,然後統計10的個數
【補充問題】可以使用最多10MB的內存,怎麼找到這40億個整數的中位數
【解答】用分區間的方式處理,長度為2M的無符號整型數組佔用的空間為8MB,向上取整2148個區間,累加每個區間的出現次數,就可以找到40億個數的中位數到底落在哪個區間上
如果用伺服器集群來設計和實現數據緩存時,一種方法是,先將id通過哈希函數轉換成一個哈希值,記為key,如果機器有N台,則計算key%N的值,這個值就是該數據所屬的機器編號。這種方法的潛在問題是如果增刪機器,即N變化,代價會很高,所有數據都不得不根據id重新計算一遍哈希值,將哈希值對新的機器數進行取模操作,然後進行大規模的數據遷移。
為了解決這一為題,引入 一致性哈希演算法 。數據id通過哈希函數轉換成的哈希值頭尾相連,想像成一個閉合的環形,一個數據id在計算出哈希值後認為對應到環中的一個位置。然後將每台機器根據機器id算出來的哈希值確定機器在環中的位置。如何確定一條數據歸屬哪條機器?把數據id用哈希函數算出哈希值,映射到環中相應的位置,順時針找到離這個位置最近的機器,那台機器就是數據的歸屬。這樣增刪機器時的代價就較小。
為解決機器負載不均的問題,引入虛擬節點機制,即對每一台機器通過不同的哈希函數計算出多個哈希值,對多個位置都放置一個服務節點,稱為虛擬節點。具體做法可以在機器ip地址或主機名的後面增加編號或埠號來實現。
⑸ 大數據演算法:分類演算法
KNN演算法,即K近鄰(K Nearest Neighbour)演算法,是一種基本的分類演算法。其主要原理是:對於一個需要分類的數據,將其和一組已經分類標注好的樣本集合進行比較,得到距離最近的K個樣本,K個樣本最多歸屬的類別,就是這個需要分類數據的類別。下面我給你畫了一個KNN演算法的原理圖。
圖中,紅藍綠三種顏色的點為樣本數據,分屬三種類別 、 、 。對於待分類點 ,計算和它距離最近的5個點(即K為5),這5個點最多歸屬的類別為 (4個點歸屬 ,1個點歸屬 ),那麼 的類別被分類為 。
KNN的演算法流程也非常簡單,請看下面的流程圖。
KNN演算法是一種非常簡單實用的分類演算法,可用於各種分類的場景,比如新聞分類、商品分類等,甚至可用於簡單的文字識別。對於新聞分類,可以提前對若干新聞進行人工標注,標好新聞類別,計算好特徵向量。對於一篇未分類的新聞,計算其特徵向量後,跟所有已標注新聞進行距離計算,然後進一步利用KNN演算法進行自動分類。
讀到這你肯定會問,如何計算數據的距離呢?如何獲得新聞的特徵向量呢?
KNN演算法的關鍵是要比較需要分類的數據與樣本數據之間的距離,這在機器學習中通常的做法是:提取數據的特徵值,根據特徵值組成一個n維實數向量空間(這個空間也被稱作特徵空間),然後計算向量之間的空間距離。空間之間的距離計算方法有很多種,常用的有歐氏距離、餘弦距離等。
對於數據 和 ,若其特徵空間為n維實數向量空間 ,即 , ,則其歐氏距離計算公式為
這個歐式距離公式其實我們在初中的時候就學過,平面幾何和立體幾何里兩個點之間的距離,也是用這個公式計算出來的,只是平面幾何(二維幾何)里的n=2,立體幾何(三維幾何)里的n=3,而機器學習需要面對的每個數據都可能有n維的維度,即每個數據有n個特徵值。但是不管特徵值n是多少,兩個數據之間的空間距離的計算公式還是這個歐氏計算公式。大多數機器學習演算法都需要計算數據之間的距離,因此掌握數據的距離計算公式是掌握機器學習演算法的基礎。
歐氏距離是最常用的數據計算公式,但是在文本數據以及用戶評價數據的機器學習中,更常用的距離計算方法是餘弦相似度。
餘弦相似度的值越接近1表示其越相似,越接近0表示其差異越大,使用餘弦相似度可以消除數據的某些冗餘信息,某些情況下更貼近數據的本質。我舉個簡單的例子,比如兩篇文章的特徵值都是:「大數據」「機器學習」和「極客時間」,A文章的特徵向量為(3, 3, 3),即這三個詞出現次數都是3;B文章的特徵向量為(6, 6, 6),即這三個詞出現次數都是6。如果光看特徵向量,這兩個向量差別很大,如果用歐氏距離計算確實也很大,但是這兩篇文章其實非常相似,只是篇幅不同而已,它們的餘弦相似度為1,表示非常相似。
餘弦相似度其實是計算向量的夾角,而歐氏距離公式是計算空間距離。餘弦相似度更關注數據的相似性,比如兩個用戶給兩件商品的打分分別是(3, 3)和(4, 4),那麼兩個用戶對兩件商品的喜好是相似的,這種情況下,餘弦相似度比歐氏距離更合理。
我們知道了機器學習的演算法需要計算距離,而計算距離需要還知道數據的特徵向量,因此提取數據的特徵向量是機器學習工程師們的重要工作,有時候甚至是最重要的工作。不同的數據以及不同的應用場景需要提取不同的特徵值,我們以比較常見的文本數據為例,看看如何提取文本特徵向量。
文本數據的特徵值就是提取文本關鍵詞,TF-IDF演算法是比較常用且直觀的一種文本關鍵詞提取演算法。這種演算法是由TF和IDF兩部分構成。
TF是詞頻(Term Frequency),表示某個單詞在文檔中出現的頻率,一個單詞在一個文檔中出現的越頻繁,TF值越高。
詞頻:
IDF是逆文檔頻率(Inverse Document Frequency),表示這個單詞在所有文檔中的稀缺程度,越少文檔出現這個詞,IDF值越高。
逆文檔頻率:
TF與IDF的乘積就是TF-IDF。
所以如果一個詞在某一個文檔中頻繁出現,但在所有文檔中卻很少出現,那麼這個詞很可能就是這個文檔的關鍵詞。比如一篇關於原子能的技術文章,「核裂變」「放射性」「半衰期」等詞彙會在這篇文檔中頻繁出現,即TF很高;但是在所有文檔中出現的頻率卻比較低,即IDF也比較高。因此這幾個詞的TF-IDF值就會很高,就可能是這篇文檔的關鍵詞。如果這是一篇關於中國原子能的文章,也許「中國」這個詞也會頻繁出現,即TF也很高,但是「中國」也在很多文檔中出現,那麼IDF就會比較低,最後「中國」這個詞的TF-IDF就很低,不會成為這個文檔的關鍵詞。
提取出關鍵詞以後,就可以利用關鍵詞的詞頻構造特徵向量,比如上面例子關於原子能的文章,「核裂變」「放射性」「半衰期」這三個詞是特徵值,分別出現次數為12、9、4。那麼這篇文章的特徵向量就是(12, 9, 4),再利用前面提到的空間距離計算公式計算與其他文檔的距離,結合KNN演算法就可以實現文檔的自動分類。
貝葉斯公式是一種基於條件概率的分類演算法,如果我們已經知道A和B的發生概率,並且知道了B發生情況下A發生的概率,可以用貝葉斯公式計算A發生的情況下B發生的概率。事實上,我們可以根據A的情況,即輸入數據,判斷B的概率,即B的可能性,進而進行分類。
舉個例子:假設一所學校里男生佔60%,女生佔40%。男生總是穿長褲,女生則一半穿長褲一半穿裙子。假設你走在校園中,迎面走來一個穿長褲的學生,你能夠推斷出這個穿長褲學生是男生的概率是多少嗎?
答案是75%,具體演算法是:
這個演算法就利用了貝葉斯公式,貝葉斯公式的寫法是:
意思是A發生的條件下B發生的概率,等於B發生的條件下A發生的概率,乘以B發生的概率,除以A發生的概率。還是上面這個例子,如果我問你迎面走來穿裙子的學生是女生的概率是多少。同樣帶入貝葉斯公式,可以計算出是女生的概率為100%。其實這個結果我們根據常識也能推斷出來,但是很多時候,常識受各種因素的干擾,會出現偏差。比如有人看到一篇博士生給初中學歷老闆打工的新聞,就感嘆讀書無用。事實上,只是少見多怪,樣本量太少而已。而大量數據的統計規律則能准確反映事物的分類概率。
貝葉斯分類的一個典型的應用場合是垃圾郵件分類,通過對樣本郵件的統計,我們知道每個詞在郵件中出現的概率 ,我們也知道正常郵件概率 和垃圾郵件的概率 ,還可以統計出垃圾郵件中各個詞的出現概率 ,那麼現在一封新郵件到來,我們就可以根據郵件中出現的詞,計算 ,即得到這些詞出現情況下,郵件為垃圾郵件的概率,進而判斷郵件是否為垃圾郵件。
現實中,貝葉斯公式等號右邊的概率,我們可以通過對大數據的統計獲得,當有新的數據到來的時候,我們就可以帶入上面的貝葉斯公式計算其概率。而如果我們設定概率超過某個值就認為其會發生,那麼我們就對這個數據進行了分類和預測,具體過程如下圖所示。
訓練樣本就是我們的原始數據,有時候原始數據並不包含我們想要計算的維度數據,比如我們想用貝葉斯公式自動分類垃圾郵件,那麼首先要對原始郵件進行標注,需要標注哪些郵件是正常郵件、哪些郵件是垃圾郵件。這一類需要對數據進行標注才能進行的機器學習訓練也叫作有監督的機器學習。
⑹ 大數據問題
大數據問題,確切來說是很大數據量下的空間限制問題,解決方法有以下7種(圖源左程雲基礎班):
先思考用一個大的HashMap的情況。 key是某個整數,value是該整數出現的次數,這樣可以統計詞頻,然後得出TOP10詞頻。計算此時使用的內存,4位元組無符號整數范圍是0到42億多(如果是有符號整數范圍是-21億多到21億多),范圍是比40億大的。最差情況下如果40億個數都不同,此時HashMap使用的空間為40億條記錄,每條記錄中key(無符號整數)是4位元組,value(詞頻)也是4位元組(int類型),總共8位元組,總計320億位元組,即32G(10億位元組可估算為1G),哈希表爆掉了。
這里先補充一下哈希函數的特徵:
特徵1.輸入域無窮大,輸出域相對有限。
特徵2.沒有任何隨機的成分,是確定規則的函數。輸入相同那麼輸出一定相同;不同的輸入可能會有相同輸出(哈希碰撞)。
特徵3. 輸入哪怕很接近,最終的計算結果也很離散,和輸入規律沒有關系。這一點也是最關鍵的特徵。
特徵4.輸出再模上一個數,取模的結果也是離散的
反推1G內存的HashMap可以有多少條記錄,保守點1億條,意味著該HashMap處理的包含數的種類(不是個數)不要超過1億種,怎麼處理?40億個整數的大文件,每個數字用哈希函數處理完再取模100,只會是0到99。根據哈希函數特徵3,不同輸入會均勻分布到0到99上,40億個數如果擁有的不同數的種類是K種的話,這樣處理完後,每個小文件里幾乎有100/k這么多種數,這樣每個小文件里就不到1億種了。再用HashMap一個一個文件去處理詞頻,搞出100個文件各自的TOP10,哈希函數相同輸入則相同輸出,所以不會出現一個數字落到不同文件里的情況。對文件的TOP10合並,就得到全局TOP10。
上面取模取40其實就可以了,40億個數種類數K小於等於40億,所以K/40小於等於1億,符合上面要求的1G內存,但取的是100而不是40是為了更保險。
使用點陣圖,用某個bit表示某個數出現過還是沒出現過。如果是哈希表,表示一個數出現與否需要用一個鍵值對,鍵和值都佔4位元組,那麼一條記錄所佔的空間就是64bit(8位元組)。用點陣圖的話,1bit表示1個數,數范圍多大就用多少位bit;42億多bit/8 = 5億多byte = 500多M(10億byte=1G);在1G空間內拿下。
用兩個bit位表示某個數字出現的頻率。00表示出現0次;01表示出現1次;10表示出現2次;11表示出現3次,如果出現次數更多大於3次,11不變。這樣最後統計下來就可以知道所有出現2次的數字,與原來相比就多了一倍空間,1G空間拿下。
點陣圖不能用了,3KB空間太小了。先計算3KB能做多長的無符號數組,一個無符號數大小為4B,3KB/4B=750,然後750距離2的某次方哪個最近,512,那就申請一個長度為512的無符號整型數組arr(arr佔用空間大小顯然不超過3KB)。題目中數字范圍是0到2的32次方減一(一共有2的32次方這么多個數),因為和512一樣都是2的某次方,所以2的32次方一定可以均分成512份(每一份大小是8388608);arr[0]表示512份里的第0份(范圍0~8388607),表示這一份上的詞頻統計;而且因為一共只有40億個數,那麼arr[0]統計的數字一定不會溢出(40億 < 2的32次方減一 = 42億多,一無符號數是32位);如果統計所有數出現的頻率到對應范圍的份上,一定有某一份詞頻不夠83888608;假設不足的那一份是第a份,那麼下次把3KB在第a份這個范圍上再分512份,最終往下分,總能找到哪個數字沒出現。
總體時間復雜度:以 512 為底的 2的32次方 的對數。這是個很小的數。且按行讀文件佔用內存是很少的,讀文件並不是一次性把所有文件都load到內存里去,而是在硬碟文件里用偏移量找到某一行數據,讀下一行的時候前一行的空間就可以被釋放了;所以維持一個句柄句尾還有偏移量就可以按行讀文件了。
整個范圍是0到2的32次方減一。計算出中點Mid並統計0到Mid范圍出現多少個數記為a,統計Mid+1到結尾范圍出現多少數記為b個;a和b中一定有一個不滿,不滿的那個再二分,最終一定能定位到某個數字沒出現,遍歷次數以 2 為底 2的32次方 對數次,即32次
面對空間限制類題目,從范圍數據狀況入手,分區間統計的思想。
用哈希函數把URL分配到很多機器上去,每台機器上的文件再用哈希函數分成小文件,每個小文件分區間統計之後,找到重復的URL
利用堆、外排序來做多個處理單元的結果合並
通過1G內存分流文件,這1G用於存儲哈希表。哈希函數特性是同樣的URL會進到一個文件里去,文件大小為分流到1G可以統計下為止,從而把100億個URL的大文件分流成小文件。哈希表的key是64位元組(URL大小),value是long類型(因為是100億個,無符號整數不夠用)8位元組。然後算1G內存最多可以放多少條這種記錄,就可以知道小文件容忍的的不同的URL最多有多少條;從而反推出假設100億個URL都是不同的,需要多少個小文件保證1G不超。
計算:64+8=72位元組,哈希表內部可能有索引空間的佔用,可以算的富裕一點,算作一條記錄要100位元組;1G=10億位元組,得出哈希表最多放1千萬條記錄,即記錄1千萬種不同的URL;最壞情況100億個URL都不同,100億/1千萬得需要1千個小文件,那麼原來的URL大文件用哈希函數算完再模上1千,分到對應的小文件里(根據哈希函數的性質,每個小文件里種類差不多是均分的,而且每個文件里記錄數差不多1千萬左右,不會超出多少)。然後在這1G空間里統計每個小文件里詞頻的TOP100,1千個文件有1千個TOP100,然後在每個文件里建立用詞頻作為排序的大根堆。
把每個堆的堆頂再組成一個大根堆,構成堆上堆,二維堆(即上圖中的二叉樹結構);例如上圖里包含甲、乙、丙;a、b、c;α、β、θ三個堆,現在堆頂元素甲、a、α構成大根堆
如上圖所示,假如調整完發現α是最大的,那麼α與a交換時是α這一串與a這一串交換,就輸出了α作為整個詞頻中TOP1。
如上圖所示,α輸出後β頂上來,但β未必是全局最大值,所以堆頂元素組成的大根堆開始heapify;假如甲此時是全局最大值,那麼甲這一串與β那一串交換......如此循環往復,每次堆上堆輸出一個最大值,下面的元素頂上來,然後堆上堆再調整,整個串交換;二維堆每次輸出一個,輸出100次就是TOP100。
如果是遍歷,時間代價O(100);用堆結構可以加速到O(log100)。從這里可以看出外排每次決定一個東西是遍歷一遍每個堆堆頂並比較大小。
假設給的空間限制為3KB,和前面一樣分成512份且每一份都能統計下詞頻,第一份假設這些數出現a個,第二份假設這些數出現b個,第三份假設這些數出現c個,所有段的詞頻都有,然後把a、b、c……加起來,看在哪個范圍上剛超20億或剛好20億,就把第20億定位在這個范圍上了。
舉例假如第 i 份加完是19億個,第 i + 1份加完是21億個,那麼20億就在第 i + 1份上且是第 i + 1份上的第1億個,接下來在第 i + 1份上再分512份去詞頻統計,看哪一份是剛超1億或剛好到1億,如此下去,總有統計出來的時候。
⑺ 一文看懂大數據的技術生態圈
一文看懂大數據的技術生態圈
大數據本身是個很寬泛的概念,Hadoop生態圈(或者泛生態圈)基本上都是為了處理超過單機尺度的數據處理而誕生的。你可以把它比作一個廚房所以需要的各種工具。鍋碗瓢盆,各有各的用處,互相之間又有重合。你可以用湯鍋直接當碗吃飯喝湯,你可以用小刀或者刨子去皮。但是每個工具有自己的特性,雖然奇怪的組合也能工作,但是未必是最佳選擇。
大數據,首先你要能存的下大數據。傳統的文件系統是單機的,不能橫跨不同的機器。HDFS(Hadoop Distributed FileSystem)的設計本質上是為了大量的數據能橫跨成百上千台機器,但是你看到的是一個文件系統而不是很多文件系統。比如你說我要獲取/hdfs/tmp/file1的數據,你引用的是一個文件路徑,但是實際的數據存放在很多不同的機器上。你作為用戶,不需要知道這些,就好比在單機上你不關心文件分散在什麼磁軌什麼扇區一樣。HDFS為你管理這些數據。存的下數據之後,你就開始考慮怎麼處理數據。雖然HDFS可以為你整體管理不同機器上的數據,但是這些數據太大了。一台機器讀取成T上P的數據(很大的數據哦,比如整個東京熱有史以來所有高清電影的大小甚至更大),一台機器慢慢跑也許需要好幾天甚至好幾周。對於很多公司來說,單機處理是不可忍受的,比如微博要更新24小時熱博,它必須在24小時之內跑完這些處理。那麼我如果要用很多台機器處理,我就面臨了如何分配工作,如果一台機器掛了如何重新啟動相應的任務,機器之間如何互相通信交換數據以完成復雜的計算等等。這就是MapRece / Tez / Spark的功能。MapRece是第一代計算引擎,Tez和Spark是第二代。MapRece的設計,採用了很簡化的計算模型,只有Map和Rece兩個計算過程(中間用Shuffle串聯),用這個模型,已經可以處理大數據領域很大一部分問題了。那什麼是Map什麼是Rece?考慮如果你要統計一個巨大的文本文件存儲在類似HDFS上,你想要知道這個文本里各個詞的出現頻率。你啟動了一個MapRece程序。Map階段,幾百台機器同時讀取這個文件的各個部分,分別把各自讀到的部分分別統計出詞頻,產生類似(hello, 12100次),(world,15214次)等等這樣的Pair(我這里把Map和Combine放在一起說以便簡化);這幾百台機器各自都產生了如上的集合,然後又有幾百台機器啟動Rece處理。Recer機器A將從Mapper機器收到所有以A開頭的統計結果,機器B將收到B開頭的詞彙統計結果(當然實際上不會真的以字母開頭做依據,而是用函數產生Hash值以避免數據串化。因為類似X開頭的詞肯定比其他要少得多,而你不希望數據處理各個機器的工作量相差懸殊)。然後這些Recer將再次匯總,(hello,12100)+(hello,12311)+(hello,345881)= (hello,370292)。每個Recer都如上處理,你就得到了整個文件的詞頻結果。這看似是個很簡單的模型,但很多演算法都可以用這個模型描述了。Map+Rece的簡單模型很黃很暴力,雖然好用,但是很笨重。第二代的Tez和Spark除了內存Cache之類的新feature,本質上來說,是讓Map/Rece模型更通用,讓Map和Rece之間的界限更模糊,數據交換更靈活,更少的磁碟讀寫,以便更方便地描述復雜演算法,取得更高的吞吐量。有了MapRece,Tez和Spark之後,程序員發現,MapRece的程序寫起來真麻煩。他們希望簡化這個過程。這就好比你有了匯編語言,雖然你幾乎什麼都能幹了,但是你還是覺得繁瑣。你希望有個更高層更抽象的語言層來描述演算法和數據處理流程。於是就有了Pig和Hive。Pig是接近腳本方式去描述MapRece,Hive則用的是SQL。它們把腳本和SQL語言翻譯成MapRece程序,丟給計算引擎去計算,而你就從繁瑣的MapRece程序中解脫出來,用更簡單更直觀的語言去寫程序了。有了Hive之後,人們發現SQL對比Java有巨大的優勢。一個是它太容易寫了。剛才詞頻的東西,用SQL描述就只有一兩行,MapRece寫起來大約要幾十上百行。而更重要的是,非計算機背景的用戶終於感受到了愛:我也會寫SQL!於是數據分析人員終於從乞求工程師幫忙的窘境解脫出來,工程師也從寫奇怪的一次性的處理程序中解脫出來。大家都開心了。Hive逐漸成長成了大數據倉庫的核心組件。甚至很多公司的流水線作業集完全是用SQL描述,因為易寫易改,一看就懂,容易維護。自從數據分析人員開始用Hive分析數據之後,它們發現,Hive在MapRece上跑,真雞巴慢!流水線作業集也許沒啥關系,比如24小時更新的推薦,反正24小時內跑完就算了。但是數據分析,人們總是希望能跑更快一些。比如我希望看過去一個小時內多少人在充氣娃娃頁面駐足,分別停留了多久,對於一個巨型網站海量數據下,這個處理過程也許要花幾十分鍾甚至很多小時。而這個分析也許只是你萬里長征的第一步,你還要看多少人瀏覽了跳蛋多少人看了拉赫曼尼諾夫的CD,以便跟老闆匯報,我們的用戶是猥瑣男悶騷女更多還是文藝青年/少女更多。你無法忍受等待的折磨,只能跟帥帥的工程師蟈蟈說,快,快,再快一點!於是Impala,Presto,Drill誕生了(當然還有無數非著名的交互SQL引擎,就不一一列舉了)。三個系統的核心理念是,MapRece引擎太慢,因為它太通用,太強壯,太保守,我們SQL需要更輕量,更激進地獲取資源,更專門地對SQL做優化,而且不需要那麼多容錯性保證(因為系統出錯了大不了重新啟動任務,如果整個處理時間更短的話,比如幾分鍾之內)。這些系統讓用戶更快速地處理SQL任務,犧牲了通用性穩定性等特性。如果說MapRece是大砍刀,砍啥都不怕,那上面三個就是剔骨刀,靈巧鋒利,但是不能搞太大太硬的東西。這些系統,說實話,一直沒有達到人們期望的流行度。因為這時候又兩個異類被造出來了。他們是Hive on Tez / Spark和SparkSQL。它們的設計理念是,MapRece慢,但是如果我用新一代通用計算引擎Tez或者Spark來跑SQL,那我就能跑的更快。而且用戶不需要維護兩套系統。這就好比如果你廚房小,人又懶,對吃的精細程度要求有限,那你可以買個電飯煲,能蒸能煲能燒,省了好多廚具。上面的介紹,基本就是一個數據倉庫的構架了。底層HDFS,上面跑MapRece/Tez/Spark,在上面跑Hive,Pig。或者HDFS上直接跑Impala,Drill,Presto。這解決了中低速數據處理的要求。那如果我要更高速的處理呢?如果我是一個類似微博的公司,我希望顯示不是24小時熱博,我想看一個不斷變化的熱播榜,更新延遲在一分鍾之內,上面的手段都將無法勝任。於是又一種計算模型被開發出來,這就是Streaming(流)計算。Storm是最流行的流計算平台。流計算的思路是,如果要達到更實時的更新,我何不在數據流進來的時候就處理了?比如還是詞頻統計的例子,我的數據流是一個一個的詞,我就讓他們一邊流過我就一邊開始統計了。流計算很牛逼,基本無延遲,但是它的短處是,不靈活,你想要統計的東西必須預先知道,畢竟數據流過就沒了,你沒算的東西就無法補算了。因此它是個很好的東西,但是無法替代上面數據倉庫和批處理系統。還有一個有些獨立的模塊是KV Store,比如Cassandra,HBase,MongoDB以及很多很多很多很多其他的(多到無法想像)。所以KV Store就是說,我有一堆鍵值,我能很快速滴獲取與這個Key綁定的數據。比如我用身份證號,能取到你的身份數據。這個動作用MapRece也能完成,但是很可能要掃描整個數據集。而KV Store專用來處理這個操作,所有存和取都專門為此優化了。從幾個P的數據中查找一個身份證號,也許只要零點幾秒。這讓大數據公司的一些專門操作被大大優化了。比如我網頁上有個根據訂單號查找訂單內容的頁面,而整個網站的訂單數量無法單機資料庫存儲,我就會考慮用KV Store來存。KV Store的理念是,基本無法處理復雜的計算,大多沒法JOIN,也許沒法聚合,沒有強一致性保證(不同數據分布在不同機器上,你每次讀取也許會讀到不同的結果,也無法處理類似銀行轉賬那樣的強一致性要求的操作)。但是丫就是快。極快。每個不同的KV Store設計都有不同取捨,有些更快,有些容量更高,有些可以支持更復雜的操作。必有一款適合你。除此之外,還有一些更特製的系統/組件,比如Mahout是分布式機器學習庫,Protobuf是數據交換的編碼和庫,ZooKeeper是高一致性的分布存取協同系統,等等。有了這么多亂七八糟的工具,都在同一個集群上運轉,大家需要互相尊重有序工作。所以另外一個重要組件是,調度系統。現在最流行的是Yarn。你可以把他看作中央管理,好比你媽在廚房監工,哎,你妹妹切菜切完了,你可以把刀拿去殺雞了。只要大家都服從你媽分配,那大家都能愉快滴燒菜。你可以認為,大數據生態圈就是一個廚房工具生態圈。為了做不同的菜,中國菜,日本菜,法國菜,你需要各種不同的工具。而且客人的需求正在復雜化,你的廚具不斷被發明,也沒有一個萬用的廚具可以處理所有情況,因此它會變的越來越復雜。以上是小編為大家分享的關於一文看懂大數據的技術生態圈的相關內容,更多信息可以關注環球青藤分享更多干貨
⑻ 通過什麼軟體可以看到亞馬遜的關鍵詞
在亞馬遜或者其它跨境電商平台搜索營銷的核心所在,想必大家都知道,那就是:「關鍵詞」!
這些年來Google的搜索不斷在優化當中,以至於我們在考慮關鍵詞的時候,除了與產品直接相關的詞之外,還需要找出所有可以聯想到產品的其它詞彙,還要在控制關鍵詞的數量這個板塊上下很多功夫。那麼很多朋友就會問,怎樣才可以有效地找出關鍵詞呢?其實我們可以從3個方面去思考:
首先
其實應該很多賣家都不知道,通過店鋪的廣告歷史數據來選詞,也是一種方法。如果同店鋪以前賣過同類的的產品,他的廣告歷史數據就能直接拿來用。對於花錢開廣告跑數據,我們可以將其看作是向亞馬遜花錢買數據的一種行為,這種方式對於做垂直細分類目的賣家來說是再合適不過了,屬於一次收費,終身受益。
其次
事實上,跨境賣家們搜索關鍵詞最常用的就是所謂的「目錄索引」,誠然,亞馬遜算是一個好的關鍵詞提供方,但有一點比較遺憾的是,亞馬遜不能把客戶搜索的關鍵詞提供給我們去做廣告或者創建listing,亞馬遜並不能向賣家提供直接的關鍵詞查詢功能。
在亞馬遜上找到關鍵詞位置的方法只有兩個,一個是看廣告推薦關鍵詞,另外一個就是廣告報表裡的客戶點擊關鍵詞,作為賣家,你並不能很好的在創建listing時獲取太多亞馬遜關鍵詞提示。
所以這時候藉助工具是必不可少的了!
最後
事實上,現在每個做跨境的賣家手上都要備著幾個工具,這樣不僅能提高效率還能提高准確性,今天就介紹幾款我喜歡用的工具:
1、第一個是Google的關鍵詞Adwords,「關鍵字優化大師」是很方便的一個功能,對於新手賣家來說還算友好,簡單實用,輸入核心關鍵詞即可得出結果。
2、第二個是Keywordtool ,它可以把插件中顯示的流量較大的詞放入廣泛組中進行拓詞。還能看搜索詞每個月的搜素趨勢變化,對搜索詞的流量進行降序排列等等。
3、AMZScout ,這個必須好好看看它的功能:
① 亞馬遜新賣家在AMZScout 上面可以通過LQS查看listing的評分,有效的優化新手listing的質量。
② 新賣家可以每天了解review、跟賣、流量、產品關鍵詞搜索排名的變化。
③ 鍵詞排名:新賣家可以通過AMZscout中的關鍵詞追蹤功能觀察產品關鍵詞的排名的變化,了解流量和銷量的情況。
希望以上的分享可以幫助到大家,如有幫助可以點個採納哈~