聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用
生活随笔
收集整理的這篇文章主要介紹了
聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
import numpy as np
x=np.random.randint(1,100,[20,1]) #在1-100范圍中產生20行1列的隨機數組
y=np.zeros(20)
k=3
#取數據中k個對象為初始中心,每個對象代表一個聚類中心 def initcenter(x,k): return x[:k] kc=initcenter(x,k) kc
#對于樣本中的數據對象,根據它們與這些聚類中心的歐氏距離,按距離最近的準則將它們分到距離它們最近的聚類中心(最相似)所對應的類; def nearest(kc,i): #數組中的值,與聚類中心最小距離所在類別的索引號d=(abs(kc-i))w=np.where(d==np.min(d))return w[0][0] def xclassify(x,y,kc): #對每個數據進行循環,將分類的結果放進對應y位置中for i in range(x.shape[0]):y[i]=nearest(kc,x[i])return y
#更新聚類中心:將每個類別中所有對象所對應的均值作為該類別的聚類中心,計算目標函數的值; def kcmean(x,y,kc,k):l=list(kc)flag=Falsefor c in range(k):print(c)m=np.where(y==c)print(m,x[m])n=np.mean(x[m])print(kc[c],n)if l[c]!=n:kc[c]=n #這個值沒賦上print(type(kc),kc[c])l[c]=nflag=True #聚類中心發生變化print(l,flag)return(np.array(l),flag) flag=True print("x值為",x,"y值為",y,"kc值為",kc,"flag值為",flag)
#判斷聚類中心和目標函數的值是否發生改變,若不變,則輸出結果,若改變,則返回2) while flag:y = xclassify(x,y,kc)kc, flag = kcmean(x,y,kc,k)print(y,kc,type(kc)) print(x,y)
#鳶尾花花瓣長度數據做聚類并用散點圖顯示 import matplotlib.pyplot as plt plt.scatter(x,x,c=x,s=50,cmap="rainbow"); plt.show()
#鳶尾花花瓣長度數據做聚類并用散點圖顯示。 import numpy as np from sklearn.datasets import load_iris iris=load_iris() x=iris.data[:,1] y=np.zeros(150)def initcenter(x,k): #初始聚類中心數組return x[0:k].reshape(k)def nearest(kc,i): #數組中的值,與聚類中心最小距離所在類別的索引號d = (abs(kc-i))w = np.where(d == np.min(d))return w[0][0]def xclassify(x,y,kc):for i in range(x.shape[0]): #對數組的每個值進行分類,shape[0]讀取矩陣第一維度的長度y[i] = nearest(kc,x[i])return ydef kcmean(x,y,kc,k): #計算各聚類新均值l = list(kc)flag = Falsefor c in range(k):print(c)m = np.where(y == c)n=np.mean(x[m])if l[c] != n:l[c] = nflag = True #聚類中心發生變化print(l,flag)return (np.array(l),flag)k = 3 kc = initcenter(x,k)flag = True print(x,y,kc,flag)
#判斷聚類中心和目標函數的值是否發生改變,若不變,則輸出結果,若改變,則返回2 while flag:y = xclassify(x,y,kc)kc, flag = kcmean(x,y,kc,k)print(y,kc,type(kc))print(x,y) import matplotlib.pyplot as plt plt.scatter(x,x,c=y,s=50,cmap="Paired"); plt.show()
#用sklearn.cluster.KMeans,鳶尾花花瓣長度數據做聚類并用散點圖顯示 import matplotlib.pyplot as plt import numpy as np from sklearn.datasets import load_irisiris = load_iris() X = iris.data Xfrom sklearn.cluster import KMeansest = KMeans(n_clusters = 3) est.fit(X) kc = est.cluster_centers_ y_kmeans = est.predict(X) #預測每個樣本的聚類索引print(y_kmeans,kc) print(kc.shape,y_kmeans.shape,np.shape)plt.scatter(X[:,0],X[:,1],c=y_kmeans,s=50,cmap='rainbow'); plt.show()
#取數據中k個對象為初始中心,每個對象代表一個聚類中心 def initcenter(x,k): return x[:k] kc=initcenter(x,k) kc
#對于樣本中的數據對象,根據它們與這些聚類中心的歐氏距離,按距離最近的準則將它們分到距離它們最近的聚類中心(最相似)所對應的類; def nearest(kc,i): #數組中的值,與聚類中心最小距離所在類別的索引號d=(abs(kc-i))w=np.where(d==np.min(d))return w[0][0] def xclassify(x,y,kc): #對每個數據進行循環,將分類的結果放進對應y位置中for i in range(x.shape[0]):y[i]=nearest(kc,x[i])return y
#更新聚類中心:將每個類別中所有對象所對應的均值作為該類別的聚類中心,計算目標函數的值; def kcmean(x,y,kc,k):l=list(kc)flag=Falsefor c in range(k):print(c)m=np.where(y==c)print(m,x[m])n=np.mean(x[m])print(kc[c],n)if l[c]!=n:kc[c]=n #這個值沒賦上print(type(kc),kc[c])l[c]=nflag=True #聚類中心發生變化print(l,flag)return(np.array(l),flag) flag=True print("x值為",x,"y值為",y,"kc值為",kc,"flag值為",flag)
#判斷聚類中心和目標函數的值是否發生改變,若不變,則輸出結果,若改變,則返回2) while flag:y = xclassify(x,y,kc)kc, flag = kcmean(x,y,kc,k)print(y,kc,type(kc)) print(x,y)
#鳶尾花花瓣長度數據做聚類并用散點圖顯示 import matplotlib.pyplot as plt plt.scatter(x,x,c=x,s=50,cmap="rainbow"); plt.show()
#鳶尾花花瓣長度數據做聚類并用散點圖顯示。 import numpy as np from sklearn.datasets import load_iris iris=load_iris() x=iris.data[:,1] y=np.zeros(150)def initcenter(x,k): #初始聚類中心數組return x[0:k].reshape(k)def nearest(kc,i): #數組中的值,與聚類中心最小距離所在類別的索引號d = (abs(kc-i))w = np.where(d == np.min(d))return w[0][0]def xclassify(x,y,kc):for i in range(x.shape[0]): #對數組的每個值進行分類,shape[0]讀取矩陣第一維度的長度y[i] = nearest(kc,x[i])return ydef kcmean(x,y,kc,k): #計算各聚類新均值l = list(kc)flag = Falsefor c in range(k):print(c)m = np.where(y == c)n=np.mean(x[m])if l[c] != n:l[c] = nflag = True #聚類中心發生變化print(l,flag)return (np.array(l),flag)k = 3 kc = initcenter(x,k)flag = True print(x,y,kc,flag)
#判斷聚類中心和目標函數的值是否發生改變,若不變,則輸出結果,若改變,則返回2 while flag:y = xclassify(x,y,kc)kc, flag = kcmean(x,y,kc,k)print(y,kc,type(kc))print(x,y) import matplotlib.pyplot as plt plt.scatter(x,x,c=y,s=50,cmap="Paired"); plt.show()
#用sklearn.cluster.KMeans,鳶尾花花瓣長度數據做聚類并用散點圖顯示 import matplotlib.pyplot as plt import numpy as np from sklearn.datasets import load_irisiris = load_iris() X = iris.data Xfrom sklearn.cluster import KMeansest = KMeans(n_clusters = 3) est.fit(X) kc = est.cluster_centers_ y_kmeans = est.predict(X) #預測每個樣本的聚類索引print(y_kmeans,kc) print(kc.shape,y_kmeans.shape,np.shape)plt.scatter(X[:,0],X[:,1],c=y_kmeans,s=50,cmap='rainbow'); plt.show()
?
?
?
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/h000/p/9865044.html
總結
以上是生活随笔為你收集整理的聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动手使用ABAP Channel开发一些
- 下一篇: 如何保障数据安全