r k-means 分类结果_机器学习-Kmeans均值聚类算法(贪心学院)
生活随笔
收集整理的這篇文章主要介紹了
r k-means 分类结果_机器学习-Kmeans均值聚类算法(贪心学院)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一.Kmeans介紹
非監督學習,聚類算法
1.1 算法過程
設當前k=2
第一步:初始化中心點
第二步:遍歷樣本點和中心之間的距離,離藍色中心點近,則分為藍色類別,反之,歸為紅色
第三步:步驟二獲得紅藍兩個類別,再次尋找藍色區域的中心點和紅色區域的中心點
第四步:根據紅藍區域的中心點,再次計算距離近的樣本點,離藍色中心點近,則分為藍色類別,反之,歸為紅色
第五步:重復步驟三和四
第六步:老中心點與新中心位置沒有發生變化,則聚類結束
1.2 Kmeans的目標函數
k表示分成組的個數
Xi表示樣本點
μ表示中心點
R表示Xi屬于K類,如果Xi屬于k類,則R=1,否則R=0;
此函數使用EM算法求解:
1.假設μ已知,即已知中心點,同時樣本點已知,求距離最小值
2.假設R已知,即已知樣本點屬于某類,則尋找該類的中心點
然后對1,2進行迭代
1.3 額外說明
Q: Kmeans結果是否一定會收斂?
A: 一定會收斂,EM算法的特性是每次結果一定會變好
Q: 不同的初始化是否會帶來不一樣的結果?
A: 會
Q: K值如何選擇?
A: 不同K值,訓練模型后會樣本到其最近聚類中心的平方距離之和,尋找和值降得最快的K值
二.手寫Kmeans
#!/usr/bin/env python # -*- coding: utf-8 -*- from copy import deepcopy import numpy as np import pandas as pd from matplotlib import pyplot as plt# 導入數據 data = pd.read_csv('D:/data.csv') print(data.shape) print(data.head()) # 提取字段并可視化數據,使用scatter plot f1 = data['V1'].values f2 = data['V2'].values # X = np.array(list(zip(f1, f2))) X = np.random.random((200, 2)) * 10def plot_data():'''展示樣本點'''plt.scatter(X[:, 0], X[:, 1], c='black', s=6)plt.show()# plot_data()# K-means里的K值 k = 3 # 隨機初始化K個中心點,把結果存儲在C C_x = np.random.randint(0, np.max(X), size=k) C_y = np.random.randint(0, np.max(X), size=k) C = np.array(list(zip(C_x, C_y)), dtype=np.float32)print("初始化之后的中心點:") print(C)def plot_center():'''展示中心點'''plt.scatter(X[:, 0], X[:, 1], c='#050505', s=7)plt.scatter(C[:, 0], C[:, 1], marker='*', s=300, c='g')plt.show()# plot_center()# 存儲之前的中心點 C_old = np.zeros(C.shape) clusters = np.zeros(len(X)) # K=3, clusters = [0,0,1,2,1,0]def dist(a, b, ax=1):'''計算新老中心點的距離'''return np.linalg.norm(a - b, axis=ax)error = dist(C, C_old, None) print(error)# 循環算法,直到收斂。收斂的條件就是,判斷當前的中心點與之前的中心點之間有沒有變化,沒有變化距離就會變成0,然后拋出異常 while error != 0:# Assigning each value to its closest clusterfor i in range(len(X)):distances = dist(X[i], C)cluster = np.argmin(distances)clusters[i] = cluster# 在計算新的中心點之前,先把舊的中心點存下來,以便計算距離C_old = deepcopy(C)# 計算新的中心點for i in range(k):points = [X[j] for j in range(len(X)) if clusters[j] == i]C[i] = np.mean(points, axis=0)error = dist(C, C_old, None)print(C) print(error)def plot_label():'''顯示聚類結果'''colors = ['r', 'g', 'b', 'y', 'c', 'm']fig, ax = plt.subplots()for i in range(k):points = np.array([X[j] for j in range(len(X)) if clusters[j] == i])ax.scatter(points[:, 0], points[:, 1], s=7, c=colors[i])ax.scatter(C[:, 0], C[:, 1], marker='*', s=200, c='#050505')plt.show()# plot_label()三.圖像分割
#!/usr/bin/env python # -*- coding: utf-8 -*- from pylab import imread, imshow, figure, show, subplot from numpy import reshape, uint8, flipud from sklearn.cluster import KMeans from copy import deepcopyimg = imread('D:/sample2.jpeg') # 讀取圖片的數據 print(img.shape) # (315, 474, 3) 315和474表示像素,3表示三維數據 pixel = reshape(img, (img.shape[0] * img.shape[1], 3)) pixel_new = deepcopy(pixel)model = KMeans(n_clusters=3) labels = model.fit_predict(pixel) palette = model.cluster_centers_for i in range(len(pixel)):pixel_new[i, :] = palette[labels[i]]imshow(reshape(pixel_new, (img.shape[0], img.shape[1], 3))) show()k=3k=10四.選擇K的方法
#!/usr/bin/env python # -*- coding: utf-8 -*- import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.decomposition import PCA data_offer = pd.read_excel("D:/WineKMC.xlsx", sheet_name=0) data_offer.columns = ["offer_id", "campaign", "varietal", "min_qty", "discount", "origin","past_peak" ] data_transactions = pd.read_excel("D:/WineKMC.xlsx", sheet_name=1) data_transactions.columns = ["customer_name", "offer_id"] data_transactions['n'] = 1 # 合并兩個dataframe cust_compare = data_transactions.merge(data_offer, on='offer_id')# Drop unnecessary columns cust_compare = cust_compare.drop(['campaign', 'varietal', 'min_qty', 'discount', 'origin', 'past_peak'],axis=1)# Create pivot table table = pd.pivot_table(cust_compare,index='customer_name',columns='offer_id',aggfunc=np.sum,fill_value=0)SS = []for K in range(2, 20):kmeans = KMeans(n_clusters=K).fit(table) # Using all default values from methodSS.append(kmeans.inertia_)plt.plot(range(2, 20), SS) plt.xlabel('K') plt.ylabel('SS') plt.show()五.高維利用降維的方法來可視化樣本
pca = PCA(n_components=2) data_new = pca.fit_transform(table) kmeans_5 = KMeans(n_clusters=5).fit_predict(table) print(table.shape) print(data_new.shape)colors = ['r', 'g', 'b', 'y', 'c', 'm'] fig, ax = plt.subplots()for i in range(5):points = np.array([data_new[j] for j in range(len(data_new)) if kmeans_5[j] == i])ax.scatter(points[:, 0], points[:, 1], s=7, c=colors[i]) plt.show() 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的r k-means 分类结果_机器学习-Kmeans均值聚类算法(贪心学院)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python文件合法模式组合_pytho
- 下一篇: ckks方案优化最好的_网站优化关键词怎