(二)k-means算法原理以及python实现
一、有監督學習和無監督學習
1. 有監督學習
監督學習(supervised learning):通過已有的訓練樣本(即已知數據以及其對應的輸出)來訓練,從而得到一個最優模型,再利用這個模型將所有新的數據樣本映射為相應的輸出結果,對輸出結果進行簡單的判斷從而實現分類的目的,那么這個最優模型也就具有了對未知數據進行分類的能力。
監督學習中只要輸入樣本集,機器就可以從中推演出制定目標變量的可能結果.如協同過濾推薦算法,通過對訓練集進行監督學習,并對測試集進行預測,從而達到預測的目的.
2. 無監督學習
現實生活中常常會有這樣的問題:缺乏足夠的先驗知識,因此難以人工標注類別或進行人工類別標注的成本太高。很自然地,我們希望計算機能代我們完成這些工作,或至少提供一些幫助。根據類別未知(沒有被標記)的訓練樣本解決模式識別中的各種問題,稱之為無監督學習
聚類算法是一種典型的無監督學習算法,主要用于將相似的樣本自動歸到一個類別中,典型的分割聚類算法有K-means算法, K-medoids算法、CLARANS算法。聚類算法與分類算法最大的區別是:聚類算法是無監督的學習算法,而分類算法屬于監督的學習算法。
在聚類算法中根據樣本之間的相似性,將樣本劃分到不同的類別中,對于不同的相似度計算方法,會得到不同的聚類結果,常用的相似度計算方法有歐式距離法。
二、k-means介紹
基本K-Means算法的思想很簡單,事先確定常數K,常數K意味著最終的聚類類別數,首先隨機選定初始點為質心,并通過計算每一個樣本與質心之間的相似度(這里為歐式距離),將樣本點歸到最相似的類中,接著,重新計算每個類的質心(即為類中心),重復這樣的過程,知道質心不再改變,最終就確定了每個樣本所屬的類別以及每個類的質心。由于每次都要計算所有的樣本與每一個質心之間的相似度,故在大規模的數據集上,K-Means算法的收斂速度比較慢。
三、K-means算法的流程
1.初始化常數K,隨機選取初始點為質心
2.重復計算一下過程,直到每個樣本所屬的類不再改變
1)計算樣本與每個質心之間的相似度,將樣本歸類到最相似的類中
2)重新計算質心
3.輸出最終的質心以及每個類
四、python實現k-means
1. 數據介紹
如下面數據所示(僅部分數據),第1、2列分別代表數據坐標(x,y),第3列代表數據所屬于的類,即label(該列并不會使用)。
注意:聚類算法不需要知道數據的標簽的,而是自動劃分該樣本到相應的類中
-0.017612 14.053064 0 -1.395634 4.662541 1 -0.752157 6.538620 0 -1.322371 7.152853 0 0.423363 11.054677 0 0.406704 7.067335 1 0.667394 12.741452 02. 目標
使用python實現k-means算法,將數據劃分到不同的類中,并用圖形顯示
3. python實現
#!/usr/bin/python # -*- coding: UTF-8 -*-from numpy import * import random import matplotlib.pyplot as plt#計算兩個樣本之間的歐式距離 #參數是矩陣 def calDistance(vec1,vec2):vec1=array(vec1);#轉為數組vec2 = array(vec2);return sqrt(sum(pow(vec1-vec2,2)));#隨機選取初始質心 def getInitCentroid(dataSet,k):m,n=shape(dataSet);centroid=zeros((k,n));#初始化k個質心for i in range(k):index=random.uniform(0,len(dataSet));centroid[i,:]=dataSet[int(index),:];return mat(centroid);#核心算法 def kmeans(dataSet,k):m,n=shape(dataSet);clusterAssment=mat(zeros((m,1)))#初始化簇m行,1列,第一列為元素所屬的簇 說明:簇也就是所屬的類,類就是我們常說的標簽centroid=getInitCentroid(dataSet,k)#獲得初始質心isEnd=True;while isEnd:isEnd=False;for i in range(len(dataSet)):#對于每一個樣本minDistance=100000;minindex=-1;for j in range(k):#尋找離質心最近的簇distance=calDistance(dataSet[i,:],centroid[j,:])if distance<minDistance:minDistance=distance;minindex=j#尋找到了離質心最近的簇if clusterAssment[i,0] != minindex:#若簇有變化,更新簇isEnd=True;clusterAssment[i,0]=minindexfor n in range(k):#更新每個質心test1=clusterAssment[:, 0].A==n#獲得與質心類型相同的簇test2=nonzero(test1);test3=test2[0];#獲得與質心類型相同簇元素的下標test4=dataSet[test3]centroid[n,:]=mean(test4,axis=0);#相同的簇,計算平均值即為新的質心,axis=0為對列求平均值return centroid,clusterAssment#加載數據 def loadData(filePath):dataSet=[];with open(filePath) as f:for line in f.readlines():lines=line.split("\t");dataSet.append([float(lines[0]),float(lines[1])]);return mat(dataSet)#畫圖 def showCluster(dataSet, k, centroids, clusterAssment):numSamples, dim = dataSet.shapeif dim != 2:print("Sorry! I can not draw because the dimension of your data is not 2!")return 1#顏色mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']if k > len(mark):print("Sorry! Your k is too large! please contact Zouxy")return 1#畫樣本for i in range(numSamples):markIndex = int(clusterAssment[i, 0]) # 每個樣本所屬族群plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb']#畫質心for i in range(k):plt.plot(centroids[i, 0], centroids[i, 1], mark[i], markersize=6)plt.show()if __name__=='__main__':dataSet=loadData("D:\\testSet.txt");#加載數據centroid, clusterAssment=kmeans(dataSet,2)#knn算法,返回質心以及簇showCluster(dataSet,2,centroid,clusterAssment);#作圖4.實驗結果
(1)質心個數為2,即劃分為2類,k=2
(2)質心個數為3,即劃分為3類,k=3
總結
以上是生活随笔為你收集整理的(二)k-means算法原理以及python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Centos下通过wget方式下载jdk
- 下一篇: (三)协同过滤算法之基于物品的推荐算法p