大經演算法
『壹』 公制螺紋 大經 中經 小徑 計算方法
公制螺紋一般有現成表格可以查詢的,金屬車削手冊或者查詢國標都可以找到,當然也可以通過一定的公式進行計算。
下面是一些具體的計算公式:
內螺紋:螺距*0.65=牙高 例M33*2 0.65*2=1.3 33-1.3(半徑)*2=30.4mm
小徑=大徑-螺距
M36X2外螺紋的中徑是34.701,小徑是33.853.內螺紋的大徑就是36,但這都是理想值,具體的數值要看你的螺紋的公差等級和公差帶位置才能確定 毫米(mm)和英寸(in)的換算
1in=25.4mm
1mm=1/25.4in=0.03937in( / :表示分號)
大徑=公稱直徑。
中徑=大徑-0.6495p
小徑=大徑-1.0825p
牙型高度=0.5413p
公制三角型60° p=2 M24 X 2
大徑=公制直徑=24°
中徑=24-1.0825X2
牙型高度=0.5413X2
什麼是公制螺紋:
公制螺紋,螺紋標準的一種,又稱米制螺紋,與英制螺紋最大的區別是螺距用毫米計量。公制螺紋有普通螺紋(牙型角60°);梯形螺紋(牙型角30°);鋸齒形螺紋(牙型角33°);方牙螺紋等幾種。
牙型的五要素
徑是指和外螺紋的牙頂、內螺紋的牙底相重合的假想柱面或錐面的直徑,外螺紋的大徑用d表示,內螺紋的大徑用D表示;小徑是指和外螺紋的牙底、內螺紋的牙頂相重合的假想柱面或錐面的直徑,外螺紋的小徑用d1表示,內螺紋的小徑用D1表示。在大徑和小徑之間,設想有一柱面(或錐面),在其軸剖面內,素線上的牙寬和槽寬相等,則該假想柱面的直徑稱為中徑。
線數:形成螺紋的螺旋線的條數稱為線數。有單線和多線螺紋之分,多線螺紋在垂直於軸線的剖面內是均勻分布的。
導程:相鄰兩牙在中徑線上對應兩點軸向的距離稱為螺距。同一條螺旋線上,相鄰兩牙在中徑線上對應兩點軸向的距離稱為導程。線數n、螺距P、導程S之間的關系為:S=n·P
旋向:沿軸線方向看,順時針方向旋轉的螺紋成為右旋螺紋,逆時針旋轉的螺紋稱為左旋螺紋。
螺紋的牙型、大徑、螺距、線數和旋向稱為螺紋五要素,只有五要素相同的內、外螺紋才能互相旋合。
『貳』 計算機十大經典演算法有哪些
再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,逆著這個行進方向,從終點向始點計算,在選定系統行進方向之後,常比線性規劃法更為有效,由每個階段都作出決策,從而使整個過程達到最優化。所謂多階段決策過程,特別是對於那些離散型問題。實際上,動態規劃法就是分多階段進行決策,其基本思路是,原問題的解即子問題的解的合並
不好意思啊,就是把研究問題分成若干個相互聯系的階段,逐次對每個階段尋找某種決策,用來解決多階段決策過程問題的一種最優化方法,就是把一個復雜的問題分成兩個或更多的相同或相似的子問題:按時空特點將復雜問題劃分為相互聯系的若干個階段。字面上的解釋是「分而治之」動態規劃法[dynamic
programming
method
(dp)]是系統分析中一種常用的方法。在水資源規劃中,往往涉及到地表水庫調度、水資源量的合理分配、優化調度等問題,而這些問題又可概化為多階段決策過程問題。動態規劃法是解決此類問題的有效方法。動態規劃法是20世紀50年代由貝爾曼(r,使整個過程達到最優.
bellman)等人提出。許多實際問題利用動態規劃法處理,故又稱為逆序決策過程。
回溯法是一種選優搜索法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。
在計算機科學中,分治法是一種很重要的演算法
『叄』 大經600。小徑506。高度60。錐度1:7.5。求角度多少~~~~求師傅幫忙。。急用~~~~~~
計算公式直接算出來的有誤差.有近似公式的不過只適合小的角度.角度大了誤差太大還是查三角函數簡單標准
大經600。小徑506。高度60演算法
600-506÷60÷2=0.7833333333查科學計算器
Inv tan 得半形38.07278.38.07278乘2=76.14556度
1:7.5演算法
1÷7.5÷2=半形3.81407乘2=7.628度
近似公式1÷7.5乘28.7=半形3.8266乘2=7.653度
『肆』 m35x1.5 -6g螺紋大經公差是多少呢,怎麼算呢
按GB192-81計算
35-sin30°×1.5/4=34.8125
近似演算法是35-0.15=34.85
公差帶可以去切削手冊上查
建議大徑加工至34.7再加工螺紋,加工後肯定能螺上
『伍』 數據挖掘十大經典演算法及各自優勢
數據挖掘十大經典演算法及各自優勢
不僅僅是選中的十大演算法,其實參加評選的18種演算法,實際上隨便拿出一種來都可以稱得上是經典演算法,它們在數據挖掘領域都產生了極為深遠的影響。
1. C4.5
C4.5演算法是機器學習演算法中的一種分類決策樹演算法,其核心演算法是ID3演算法. C4.5演算法繼承了ID3演算法的優點,並在以下幾方面對ID3演算法進行了改進:
1) 用信息增益率來選擇屬性,克服了用信息增益選擇屬性時偏向選擇取值多的屬性的不足;2) 在樹構造過程中進行剪枝;3) 能夠完成對連續屬性的離散化處理;4) 能夠對不完整數據進行處理。
C4.5演算法有如下優點:產生的分類規則易於理解,准確率較高。其缺點是:在構造樹的過程中,需要對數據集進行多次的順序掃描和排序,因而導致演算法的低效。
2. The k-means algorithm 即K-Means演算法
k-means algorithm演算法是一個聚類演算法,把n的對象根據他們的屬性分為k個分割,k < n。它與處理混合正態分布的最大期望演算法很相似,因為他們都試圖找到數據中自然聚類的中心。它假設對象屬性來自於空間向量,並且目標是使各個群組內部的均 方誤差總和最小。
3. Support vector machines
支持向量機,英文為Support Vector Machine,簡稱SV機(論文中一般簡稱SVM)。它是一種監督式學習的方法,它廣泛的應用於統計分類以及回歸分析中。支持向量機將向量映射到一個更 高維的空間里,在這個空間里建立有一個最大間隔超平面。在分開數據的超平面的兩邊建有兩個互相平行的超平面。分隔超平面使兩個平行超平面的距離最大化。假 定平行超平面間的距離或差距越大,分類器的總誤差越小。一個極好的指南是C.J.C Burges的《模式識別支持向量機指南》。van der Walt 和 Barnard 將支持向量機和其他分類器進行了比較。
4. The Apriori algorithm
Apriori演算法是一種最有影響的挖掘布爾關聯規則頻繁項集的演算法。其核心是基於兩階段頻集思想的遞推演算法。該關聯規則在分類上屬於單維、單層、布爾關聯規則。在這里,所有支持度大於最小支持度的項集稱為頻繁項集,簡稱頻集。
5. 最大期望(EM)演算法
在統計計算中,最大期望(EM,Expectation–Maximization)演算法是在概率(probabilistic)模型中尋找參數最大似然 估計的演算法,其中概率模型依賴於無法觀測的隱藏變數(Latent Variabl)。最大期望經常用在機器學習和計算機視覺的數據集聚(Data Clustering)領域。
6. PageRank
PageRank是Google演算法的重要內容。2001年9月被授予美國專利,專利人是Google創始人之一拉里·佩奇(Larry Page)。因此,PageRank里的page不是指網頁,而是指佩奇,即這個等級方法是以佩奇來命名的。
PageRank根據網站的外部鏈接和內部鏈接的數量和質量倆衡量網站的價值。PageRank背後的概念是,每個到頁面的鏈接都是對該頁面的一次投票, 被鏈接的越多,就意味著被其他網站投票越多。這個就是所謂的「鏈接流行度」——衡量多少人願意將他們的網站和你的網站掛鉤。PageRank這個概念引自 學術中一篇論文的被引述的頻度——即被別人引述的次數越多,一般判斷這篇論文的權威性就越高。
7. AdaBoost
Adaboost是一種迭代演算法,其核心思想是針對同一個訓練集訓練不同的分類器(弱分類器),然後把這些弱分類器集合起來,構成一個更強的最終分類器 (強分類器)。其演算法本身是通過改變數據分布來實現的,它根據每次訓練集之中每個樣本的分類是否正確,以及上次的總體分類的准確率,來確定每個樣本的權 值。將修改過權值的新數據集送給下層分類器進行訓練,最後將每次訓練得到的分類器最後融合起來,作為最後的決策分類器。
8. kNN: k-nearest neighbor classification
K最近鄰(k-Nearest Neighbor,KNN)分類演算法,是一個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。
9. Naive Bayes
在眾多的分類模型中,應用最為廣泛的兩種分類模型是決策樹模型(Decision Tree Model)和樸素貝葉斯模型(Naive Bayesian Model,NBC)。 樸素貝葉斯模型發源於古典數學理論,有著堅實的數學基礎,以 及穩定的分類效率。同時,NBC模型所需估計的參數很少,對缺失數據不太敏感,演算法也比較簡單。理論上,NBC模型與其他分類方法相比具有最小的誤差率。 但是實際上並非總是如此,這是因為NBC模型假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,這給NBC模型的正確分類帶來了一定影響。在屬 性個數比較多或者屬性之間相關性較大時,NBC模型的分類效率比不上決策樹模型。而在屬性相關性較小時,NBC模型的性能最為良好。10. CART: 分類與回歸樹
CART, Classification and Regression Trees。 在分類樹下面有兩個關鍵的思想。第一個是關於遞歸地劃分自變數空間的想法;第二個想法是用驗證數據進行剪枝。
以上是小編為大家分享的關於數據挖掘十大經典演算法及各自優勢的相關內容,更多信息可以關注環球青藤分享更多干貨
『陸』 易經的演算法是什麼
《周禮‧春官‧大卜》:「掌三易之法,一曰連山。二曰歸藏,三曰周易」鄭玄〈易贊〉及〈易論〉雲:「夏曰連山,殷曰歸藏。」 連山易 跟 歸藏易 目前都失傳了只有周易流傳至今。一般認為連山始於艮,如山勢綿延不絕,歸藏源於坤,順藏納萬物。周易出於乾,天行周衍。
三易的佔法
北宋邵雍在《皇極經世》認為:「連山蓍用九十七策,以八為揲,正卦一0一六,互卦一0一六,變卦三二五0一二,以數斷不以辭斷。其吉凶一定不可易」
歸藏在《漢書•藝文志》中沒有著錄,《隋書•經籍志》亦曰:「《歸藏》漢初已亡,晉《中經》有之,唯載卜筮,不似聖人之旨。」但明朝楊慎認為漢代時《歸藏》未失,「《連山》藏於蘭台,《歸藏》藏於太卜,見桓譚《新論》,則後漢時《連山》《歸藏》猶存,未可以《藝文志》不列其目而疑之。」清人朱彝尊雲:「《歸藏》隋時尚存,至宋猶有《初經》、《齊母》、《本蓍》三篇,其見於傳注所引者。」
宋代家鉉翁稱:「歸藏之書作於黃帝。而六十甲子與先天六十四卦並行者,乃中天歸藏易也。」。
不過1993年3月,湖北江陵王家台15號秦墓中出土了《歸藏》,稱為王家台秦簡歸藏。按廖名春的〈王家台秦簡《歸藏》管窺〉中言:「秦簡《易占》不僅是《歸藏》,更准確一點,應當是《歸藏》易中的《鄭母經》」
其他多半應屬偽托
周易的佔法比較復雜主要分成幾個系統,主要跟取卦法跟釋卦法有關。取卦就是如何算出這個卦,釋卦就是如何從卦來推斷解釋問題的答案
最傳統取卦法的出自〈易傳‧系辭傳下〉:「大衍之數五十,其用四十有九。分而為二以象兩,掛一以象三, 揲之以四以象四時,歸奇於扐以象閏,五歲再閏,故再扐而後掛.....」具體方法見下:
一、將藏在竹櫝或木櫝中的五十莖蓍草取出,以兩手執之,熏於香爐,命蓍,然後隨取一莖放回櫝中,留下四十九莖,也叫四十九策,用來揲蓍。此即「大衍之數五十,其用四十有九。」
二、信手將四十九策分為二分,不需計數。分開後,就放在左右兩邊,以象兩儀。此即「分而為二以象兩。」
三、兩儀在左邊的象天,在右邊的象地,即在左邊的策數中分出一策象人,掛在右手的小指間,以象天地人三才。此即「掛一以象三。」
四、取左邊的蓍草,執於左手,以右手四四揲之。就是以四策為一計數單位,揲之就是數之,一數就是四策,以象一年的春夏秋冬。數到最後,視所余的策數,或一,或二,或三,或四,都算是奇數,即將此奇數之策扐在左手的第三第四指之間。此即「歸奇於扐以象閏。」已經四四數過之策則放回左邊。
五、次取右邊之策執於右手,而以左手四四揲之。這也是「揲之以四,以象四時。」數到最後,視所余之策,或一,或二,或三,或四,都算是奇數,而將此奇數之策扐在左手的第二第三指之間。此即「五歲再閏,故再扐而後掛。」已經四四數過之策則放回右邊。揲蓍到此,是為第一變。檢視扐在左手三四指間的左余之策,以及扐在左手二三指間的右余之策,如左餘一策,則右余必三策,左二則右亦二,左三則右必一,左四則右亦四。合計左右所余之策,以及掛在右手小指間的一策,即是一掛二扐的策數,不是五策,就是九策。即將這五策或九策另置一處,第一變即告完成。
六、再將左右兩邊已經數過的蓍草合起來,檢視其數,或是四十四策,或是四十策,再度分二、掛一、揲四、歸扐,如第一變之儀。最後檢視左右所余之策,左一則右必二,左二則右必一,左三則右必四,左四則右必三。合計左右所余之策,以及掛在右手小指間的一策,即是一掛二扐的策數,不是四策,就是八策。即將這四策或八策另置一處,是為第二變。
七、又將左右過揲之蓍合起來,檢視其數,或四十策,或三十六策,或三十二策,如第二變那樣分二、掛一、揲四、歸扐。最後檢視左右所余之策,與第二變同,則將所余之策與掛一之策合之,另置一處,是為第三變。
八、三變而成一爻,計算三變所得掛扐與過揲之策,便知所得何爻。如三變合計得掛扐十三策,以減四十九策,則知三變合得過揲的策數是三十六策,以四除之,因為揲蓍時是以四四數之,此處故以四除,則三十六得九,是為老陽,其畫為「O 」,名之為重。如三變合得掛扐二十五策,則知三變合得過揲二十四策,四除,得六,是為老陰,其畫為「X 」,名之為交。如三變合得掛扐二十一策,則知三變合得過揲二十八策,除以四,得七,是為少陽,其畫為「-」,名之為單。如三變合得掛扐十七策,則知三變合得過揲三十二策,以四除之,得八,是為少陰,其畫為「- -」,名之為拆。
如是三變而成初爻,即將初爻畫在畫卦的版上。以下不再命蓍,即用四十九蓍,分二、掛一、揲四、歸扐,再經三變而成二爻。以後每三變都是如此。一卦六爻,十八變而成一卦。畫卦時,由下往上畫。前九變而成三爻,出現一個三畫卦於內,即是初二三爻,稱為內卦。後九變又出現一個三畫卦於外,即是四五上爻,稱為外卦。得內卦是小成,得外卦是大成。六十四卦皆是如此。
大衍之數,有體有用。體是五十莖蓍草去一不用,此一即是太極。韓康伯引王弼之說:「不用而用以之通,非數而數以之成,斯易之太極也。」用是以四十九蓍分二掛一揲四歸扐,以象兩儀三才四時閏月等,由此而成六十四卦,三百八十四爻,老陽每爻三十六策,老陰每爻二十四策,老陰老陽各一百九十二爻,總為一萬一千五百二十策,以當萬物之數。大衍的衍字,鄭康成當演字講,就是推演其數之義。演數必須五十莖蓍草,故取五十以為大衍之數。觀變玩占,了解五十之數體用兼備的意義,即可入道。自漢以來,歷代諸儒對於五十之數的解說,各有其異見,學者可以流覽參考,不必深入研究。
(轉載自讀易簡說 http://www.minlun.org.tw/3pt/3pt-1-5/t/014.htm )
占算出後其中一種釋卦方式是依經解卦,即對照佔卜出來的卦、爻辭還有易傳跟歷代的注釋進行解讀與詮釋的工作。
第二種系統是起於漢易術數系統,代表是《黃金策》、《增刪卜易》等等。則是取卦後依照問題屬性與起課干支來進行裝卦的動作,推算六世(親爻)應(爻)用(神)飛(神)伏(神)等所在。然後根據其位置與問題屬性斷論吉凶。
而在之後又為了需要發展出許多取卦,代表就是《梅花易數》隨便看到落下的幾辦花葉,書上隨手翻開的頁碼都可以當作是取象畫卦的依據。最簡單的一種演變就是金錢卦,拿三枚硬幣丟六次,全正是老陽,全反是老陰,一正兩反少陽,一反兩正少陰。
畫卦時一律由下往上畫,老陰老陽會變爻,陰變陽,陽便陰。
就這樣,演算法取象很容易,難在釋卦解卦。依經解卦靠經驗學識,裝卦則是要靠技巧背口訣。
希望我的回答對你有幫助。
『柒』 哪位朋友知道錐度螺紋大小經的演算法麻煩賜教一下最好能以G2"為例子講解下十分感謝,是常數的參數最好標
應該這個上面有 具體怎麼計算沒研究過 一般都是查表
『捌』 z1/2螺紋,長度15。求大徑,小徑,螺距,牙高。
Z1/2錐螺紋的外徑是20.956mm,螺紋的外徑不用計算,直接查螺絲手冊。小徑=大經-(牙高×2)。我就知道這些,望對你有所幫助!
『玖』 算英制錐螺紋的大小徑怎麼算
演算法如下:
英制螺紋以英寸為單位標注螺紋尺寸,一般牙型角為55度,G是管螺紋的意思,ZG是圓錐管螺紋。1/2 14 其中1/2 是螺紋外徑1/2英寸,按每英寸為公制25.4mm計算,25.4*1/2=12.7mm,即螺紋外徑為12.7mm;14是指該螺紋每英寸距離內有14牙,這樣相當以公製表示時螺距為 25.4/14=1.814mm;其餘類推。其實加工時車床往往在掛輪表中已經有相應指示,上述螺紋只要按14牙掛輪,55度車刀,外徑加工到12.7mm即可。
英制螺紋是螺紋尺寸用英制標注,按外形分圓柱、圓錐兩種;按牙型角分55°、60°兩種。螺紋中的1/4、1/2、1/8 標記是指螺紋尺寸的直徑,單位是英寸。一寸等於8分,1/4 寸就是2分,如此類推。
『拾』 大數據十大經典演算法之k-means
大數據十大經典演算法之k-means
k均值演算法基本思想:
K均值演算法是基於質心的技術。它以K為輸入參數,把n個對象集合分為k個簇,使得簇內的相似度高,簇間的相似度低。
處理流程:
1、為每個聚類確定一個初始聚類中心,這樣就有k個初始聚類中心;
2、將樣本按照最小距離原則分配到最鄰近聚類
3、使用每個聚類中的樣本均值作為新的聚類中心
4、重復步驟2直到聚類中心不再變化
5、結束,得到K個聚類
劃分聚類方法對數據集進行聚類時的要點:
1、選定某種距離作為數據樣本間的相似性度量,通常選擇歐氏距離。
2、選擇平價聚類性能的准則函數
用誤差平方和准則函數來評價聚類性能。
3、相似度的計算分局一個簇中對象的平均值來進行
K均值演算法的優點:
如果變數很大,K均值比層次聚類的計算速度較快(如果K很小);
與層次聚類相比,K均值可以得到更緊密的簇,尤其是對於球狀簇;
對於大數據集,是可伸縮和高效率的;
演算法嘗試找出使平方誤差函數值最小的k個劃分。當結果簇是密集的,而簇與簇之間區別明顯的時候,效果較好。
K均值演算法缺點:
最後結果受初始值的影響。解決辦法是多次嘗試取不同的初始值。
可能發生距離簇中心m最近的樣本集為空的情況,因此m得不到更新。這是一個必須處理的問題,但我們忽略該問題。
不適合發現非凸面形狀的簇,並對雜訊和離群點數據較敏感,因為少量的這類數據能夠對均值產生較大的影響。
K均值演算法的改進:
樣本預處理。計算樣本對象量量之間的距離,篩掉與其他所有樣本那的距離和最大的m個對象。
初始聚類中心的選擇。選用簇中位置最靠近中心的對象,這樣可以避免孤立點的影響。
K均值演算法的變種:
K眾數(k-modes)演算法,針對分類屬性的度量和更新質心的問題而改進。
EM(期望最大化)演算法
k-prototype演算法
這種演算法不適合處理離散型屬性,但是對於連續型具有較好的聚類效果。
k均值演算法用途:
圖像分割;
衡量足球隊的水平;
下面給出代碼:
#include <iostream>
#include <vector>
//auther archersc
//JLU
namespace CS_LIB
{
using namespace std;
class Kmean
{
public:
//輸入格式
//數據數量N 維度D
//以下N行,每行D個數據
istream& loadData(istream& in);
//輸出格式
//聚類的數量CN
//中心維度CD
//CN行,每行CD個數據
//數據數量DN
//數據維度DD
//以下DN組,每組的第一行兩個數值DB, DDis
//第二行DD個數值
//DB表示改數據屬於一類,DDis表示距離改類的中心的距離
ostream& saveData(ostream& out);
//設置中心的數量
void setCenterCount(const size_t count);
size_t getCenterCount() const;
//times最大迭代次數, maxE ,E(t)表示第t次迭代後的平方誤差和,當|E(t+1) - E(t)| < maxE時終止
void clustering(size_t times, double maxE);
private:
double calDistance(vector<double>& v1, vector<double>& v2);
private:
vector< vector<double> > m_Data;
vector< vector<double> > m_Center;
vector<double> m_Distance;
vector<size_t> m_DataBelong;
vector<size_t> m_DataBelongCount;
};
}
#include "kmean.h"
#include <ctime>
#include <cmath>
#include <cstdlib>
//auther archersc
//JLU
namespace CS_LIB
{
template<class T>
void swap(T& a, T& b)
{
T c = a;
a = b;
b = c;
}
istream& Kmean::loadData(istream& in)
{
if (!in){
cout << "input error" << endl;
return in;
}
size_t dCount, dDim;
in >> dCount >> dDim;
m_Data.resize(dCount);
m_DataBelong.resize(dCount);
m_Distance.resize(dCount);
for (size_t i = 0; i < dCount; ++i){
m_Data[i].resize(dDim);
for (size_t j = 0; j < dDim; ++j){
in >> m_Data[i][j];
}
}
return in;
}
ostream& Kmean::saveData(ostream& out)
{
if (!out){
cout << "output error" << endl;
return out;
}
out << m_Center.size();
if (m_Center.size() > 0)
out << << m_Center[0].size();
else
out << << 0;
out << endl << endl;
for (size_t i = 0; i < m_Center.size(); ++i){
for (size_t j = 0; j < m_Center[i].size(); ++j){
out << m_Center[i][j] << ;
}
out << endl;
}
out << endl;
out << m_Data.size();
if (m_Data.size() > 0)
out << << m_Data[0].size();
else
out << << 0;
out << endl << endl;
for (size_t i = 0; i < m_Data.size(); ++i){
out << m_DataBelong[i] << << m_Distance[i] << endl;
for (size_t j = 0; j < m_Data[i].size(); ++j){
out << m_Data[i][j] << ;
}
out << endl << endl;
}
return out;
}
void Kmean::setCenterCount(const size_t count)
{
m_Center.resize(count);
m_DataBelongCount.resize(count);
}
size_t Kmean::getCenterCount() const
{
return m_Center.size();
}
void Kmean::clustering(size_t times, double maxE)
{
srand((unsigned int)time(NULL));
//隨機從m_Data中選取m_Center.size()個不同的樣本點作為初始中心。
size_t *pos = new size_t[m_Data.size()];
size_t i, j, t;
for (i = 0; i < m_Data.size(); ++i){
pos[i] = i;
}
for (i = 0; i < (m_Data.size() << 1); ++i){
size_t s1 = rand() % m_Data.size();
size_t s2 = rand() % m_Data.size();
swap(pos[s1], pos[s2]);
}
for (i = 0; i < m_Center.size(); ++i){
m_Center[i].resize(m_Data[pos[i]].size());
for (j = 0; j < m_Data[pos[i]].size(); ++j){
m_Center[i][j] = m_Data[pos[i]][j];
}
}
delete []pos;
double currE, lastE;
for (t = 0; t < times; ++t){
for (i = 0; i < m_Distance.size(); ++i)
m_Distance[i] = LONG_MAX;
for (i = 0; i < m_DataBelongCount.size(); ++i)
m_DataBelongCount[i] = 0;
currE = 0.0;
for (i = 0; i < m_Data.size(); ++i){
for (j = 0; j < m_Center.size(); ++j){
double dis = calDistance(m_Data[i], m_Center[j]);
if (dis < m_Distance[i]){
m_Distance[i] = dis;
m_DataBelong[i] = j;
}
}
currE += m_Distance[i];
m_DataBelongCount[m_DataBelong[i]]++;
}
cout << currE << endl;
if (t == 0 || fabs(currE - lastE) > maxE)
lastE = currE;
else
break;
for (i = 0; i < m_Center.size(); ++i){
for (j = 0; j < m_Center[i].size(); ++j)
m_Center[i][j] = 0.0;
}
for (i = 0; i < m_DataBelong.size(); ++i){
for (j = 0; j < m_Data[i].size(); ++j){
m_Center[m_DataBelong[i]][j] += m_Data[i][j] / m_DataBelongCount[m_DataBelong[i]];
}
}
}
}
double Kmean::calDistance(vector<double>& v1, vector<double>& v2)
{
double result = 0.0;
for (size_t i = 0; i < v1.size(); ++i){
result += (v1[i] - v2[i]) * (v1[i] - v2[i]);
}
return pow(result, 1.0 / v1.size());
//return sqrt(result);
}
}
#include <iostream>
#include <fstream>
#include "kmean.h"
using namespace std;
using namespace CS_LIB;
int main()
{
ifstream in("in.txt");
ofstream out("out.txt");
Kmean kmean;
kmean.loadData(in);
kmean.setCenterCount(4);
kmean.clustering(1000, 0.000001);
kmean.saveData(out);
return 0;
}