第二部分 建模應用篇 第八章

2021-09-08 16:42:38 字數 3121 閱讀 4502

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...