python實現的kmeans聚類
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
#正則化資料集
def normalize(x,axis=-1,p=2):
lp_norm=np.atleast_1d(np.linalg.norm(x,p,axis))
lp_norm[lp_norm==0]=1
return x/np.expand_dims(lp_norm,axis)
#計算乙個樣本與所有樣本的歐氏距離的平方
def euclidean_distance(one_sample,x):
one_sample=one_sample.reshape(1,-1)
x=x.reshape(x.shape[0],-1)
dis=np.power(np.tile(one_sample,(x.shape[0],1))-x,2).sum(axis=1)
return dis
class kmeans():
def __init__(self,k=2,max_iteration=500,varepsilon=0.0001):
self.k=k
self.max_iteration=max_iteration
self.varepsilon=varepsilon
#從樣本點隨機選擇聚類中心
def init_random_center(self,x):
n_samples,n_features=np.shape(x)
centers=np.zeros((self.k,n_features))
for i in range(self.k):
center=x[np.random.choice(range(n_samples))]
centers[i]=center
return centers
#返回距離該樣本最近的乙個中心索引[0,self.k]
def _cloest_center(self,sample,centers):
dis=euclidean_distance(sample,centers)
closest_i=np.argmin(dis)
return closest_i
#將所有樣本進行歸類
def create_clusters(self,centers,x):
n_samples=np.shape(x)[0]
clusters=[ for _ in range(self.k)]
for sample_i,sample in enumerate(x):
center_i=self._cloest_center(sample,centers)
return clusters
#對中心進行更新
def update_centers(self,clusters,x):
n_features=np.shape(x)[1]
centers=np.zeros((self.k,n_features))
for i,cluster in enumerate(clusters):
center=np.mean(x[cluster],axis=0)
centers[i]=center
return centers
def get_cluster_labels(self,clusters,x):
y_pred=np.zeros(x.shape[0])
for cluster_i,cluster in enumerate(clusters):
for sample_i in cluster:
y_pred[sample_i]=cluster_i
return y_pred
def predict(self,x):
centers=self.init_random_center(x)
for _ in range(self.max_iteration):
clusters=self.create_clusters(centers,x)
former_centers=centers
centers = self.update_centers(clusters,x)
diff=centers-former_centers
if diff.any()break
return self.get_cluster_labels(clusters,x)
def main():
x, y = datasets.make_blobs(n_samples=10000,
n_features=3,
centers=[[3, 3, 3], [0, 0, 0], [1, 1, 1], [2, 2, 2]],
cluster_std=[0.2, 0.1, 0.2, 0.2],
random_state=9)
# 用kmeans演算法進行聚類
clf = kmeans(k=4)
y_pred = clf.predict(x)
# 視覺化聚類效果
fig = plt.figure(figsize=(12, 8))
ax = axes3d(fig, rect=[0, 0, 1, 1], elev=30, azim=20)
plt.scatter(x[y == 0][:, 0], x[y == 0][:, 1], x[y == 0][:, 2])
plt.scatter(x[y == 1][:, 0], x[y == 1][:, 1], x[y == 1][:, 2])
plt.scatter(x[y == 2][:, 0], x[y == 2][:, 1], x[y == 2][:, 2])
plt.scatter(x[y == 3][:, 0], x[y == 3][:, 1], x[y == 3][:, 2])
plt.show()
if __name__=="__main__":
main()
C 學習筆記 第二部分第八章 IO類
io類 標準庫使我們能忽略不能流之間的差異是通過繼承機制實現的。io物件無拷貝或賦值 進行io操作的函式通常以引用方式進行傳遞 返回流。讀寫io不能是const的,因為會改變物件的狀態 如果程式異常終止,輸出緩衝器的不會被重新整理的 關聯輸入和輸出流,tie。比如x.tie o 將流x關聯到輸出流o...
第二部分 建模應用篇 第十一章
這一部分是時間序列,計量經濟學的大頭。下面兩個庫很重要 import pandas as pd import numpy as np import matplotlib.pyplot as plt import statsmodels.api as smapi from arch.unitroot ...
Web API 第二部分
web api 第二部分 元素偏移量 offset element.offsettop element.offsetleft element.offsetwidth 可以得到元素的大小 寬度和高度 是包含padding border width element.offsetheight elemen...