最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python機器學習之K-Means聚類實現(xiàn)詳解

 更新時間:2018年02月22日 16:30:55   作者:博觀厚積  
這篇文章主要為大家詳細介紹了Python機器學習之K-Means聚類的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文為大家分享了Python機器學習之K-Means聚類的實現(xiàn)代碼,供大家參考,具體內(nèi)容如下

1.K-Means聚類原理

K-means算法是很典型的基于距離的聚類算法,采用距離作為相似性的評價指標,即認為兩個對象的距離越近,其相似度就越大。其基本思想是:以空間中k個點為中心進行聚類,對最靠近他們的對象歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。各聚類本身盡可能的緊湊,而各聚類之間盡可能的分開。
算法大致流程為:(1)隨機選取k個點作為種子點(這k個點不一定屬于數(shù)據(jù)集);(2)分別計算每個數(shù)據(jù)點到k個種子點的距離,離哪個種子點最近,就屬于哪類;(3)重新計算k個種子點的坐標(簡單常用的方法是求坐標值的平均值作為新的坐標值;(4)重復2、3步,直到種子點坐標不變或者循環(huán)次數(shù)完成。

2.數(shù)據(jù)及其尋找初步的聚類中心

數(shù)據(jù)為Matlab加載格式(mat),包含X變量,數(shù)據(jù)來源為(大家可以去這下載),X為300*2維變量,由于是2維,所以基本上就是在平面坐標軸上的一些點中進行聚類。

我們首先構建初步尋找聚類中心(centroids,質(zhì)心)函數(shù),再隨機設置初始質(zhì)心,通過歐氏距離初步判斷X的每一個變量屬于哪個質(zhì)心。代碼為:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
from scipy.io import loadmat

def find_closest_centroids(X, centroids):
  m = X.shape[0]
  k = centroids.shape[0] #要聚類的類別個數(shù)
  idx = np.zeros(m) 
  
  for i in range(m):
    min_dist = 1000000 #迭代終止條件
    for j in range(k):
      dist = np.sum((X[i,:] - centroids[j,:]) ** 2) 
      if dist < min_dist:
        # 記錄當前最短距離和其中心的索引值
        min_dist = dist
        idx[i] = j
  
  return idx
data = loadmat('D:\python\Python ml\ex7data2.mat')
X = data['X']
initial_centroids = np.array([[3, 3], [6, 2], [8, 5]])

idx = find_closest_centroids(X, initial_centroids)
idx[0:3]

在這里先生成m(這里為300)個0向量,即idx,也就是假設X的每個變量均屬于0類,然后再根據(jù)與初始質(zhì)心的距離計算dist = np.sum((X[i,:] - centroids[j,:]) ** 2),初步判斷每個變量歸屬哪個類,最終替代idx中的0.

3.不斷迭代尋找質(zhì)心的位置并實現(xiàn)kmeans算法

上述idx得到的300維向量是判斷X中每個變量的歸屬類別,在此基礎上,再對初始質(zhì)心集群位置不斷調(diào)整,尋找最優(yōu)質(zhì)心。

def compute_centroids(X, idx, k):
  m, n = X.shape
  centroids = np.zeros((k, n))
  
  for i in range(k):
    indices = np.where(idx == i)
    centroids[i,:] = (np.sum(X[indices,:], axis=1) / len(indices[0])).ravel()
  #這里簡單的將該類中心的所有數(shù)值求平均值作為新的類中心
return centroids
compute_centroids(X, idx, 3)

根據(jù)上述函數(shù),來構建kmeans函數(shù)實現(xiàn)K-means聚類算法。然后根據(jù)得到的每個變量歸屬類別與質(zhì)心坐標,進行可視化。

def run_k_means(X, initial_centroids, max_iters):
  m, n = X.shape
  k = initial_centroids.shape[0]
  idx = np.zeros(m)
  centroids = initial_centroids
  
  for i in range(max_iters):
    idx = find_closest_centroids(X, centroids)
    centroids = compute_centroids(X, idx, k)
  
  return idx, centroids
idx, centroids = run_k_means(X, initial_centroids, 10)
cluster1 = X[np.where(idx == 0)[0],:] #獲取X中屬于第一個類別的數(shù)據(jù)集合,即類別1的點
cluster2 = X[np.where(idx == 1)[0],:]
cluster3 = X[np.where(idx == 2)[0],:]

fig, ax = plt.subplots(figsize=(12,8))
ax.scatter(cluster1[:,0], cluster1[:,1], s=30, color='r', label='Cluster 1')
ax.scatter(cluster2[:,0], cluster2[:,1], s=30, color='g', label='Cluster 2')
ax.scatter(cluster3[:,0], cluster3[:,1], s=30, color='b', label='Cluster 3')
ax.legend()
plt.show()

得到圖形如下:

image.png

4.關于初始化質(zhì)心的設置

我們前邊設置的初始質(zhì)心:[3, 3], [6, 2], [8, 5],是事先設定的,并由此生成idx(每一變量歸屬類別的向量),這是后邊進行kmeans聚類的基礎,實際上對于二維以上數(shù)據(jù),由于無法在平面坐標軸展示,很難一開始就設定較好的初始質(zhì)心,另外,初始質(zhì)心的設定也可能會影響算法的收斂性。所以需要我們再構造個初始化質(zhì)心設定函數(shù),來更好地設置初始質(zhì)心。

def init_centroids(X, k):
  m, n = X.shape
  centroids = np.zeros((k, n)) #初始化零矩陣
  idx = np.random.randint(0, m, k) #返回0-m之間的整數(shù)值
  
  for i in range(k):
    centroids[i,:] = X[idx[i],:]
  
return centroids
init_centroids(X, 3)

這里所生成的初始質(zhì)心位置,其實就是從X的數(shù)據(jù)中隨機找3個變量作為初始值。在此基礎上,令initial_centroids = init_centroids(X, 3),然后代入前邊的code中,重新運行一遍即可。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • np.hstack()和np.dstack()的使用

    np.hstack()和np.dstack()的使用

    本文主要介紹了np.hstack()和np.dstack()的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • 一篇文章帶你了解幾個好用的Python技巧

    一篇文章帶你了解幾個好用的Python技巧

    這篇文章主要介紹了幾個Python小技巧,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10
  • python之如何實現(xiàn)延遲操作

    python之如何實現(xiàn)延遲操作

    這篇文章主要介紹了python之如何實現(xiàn)延遲操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • python使用matplotlib:subplot繪制多個子圖的示例

    python使用matplotlib:subplot繪制多個子圖的示例

    這篇文章主要介紹了python使用matplotlib:subplot繪制多個子圖的示例,幫助大家更好的利用python繪制圖像,感興趣的朋友可以了解下
    2020-09-09
  • 簡單實現(xiàn)Python爬取網(wǎng)絡圖片

    簡單實現(xiàn)Python爬取網(wǎng)絡圖片

    這篇文章主要教大家如何簡單實現(xiàn)Python爬取網(wǎng)絡圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Python中str.format()方法的具體使用

    Python中str.format()方法的具體使用

    本文主要介紹了Python中str.format()方法的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Python實現(xiàn)的生成自我描述腳本分享(很有意思的程序)

    Python實現(xiàn)的生成自我描述腳本分享(很有意思的程序)

    這篇文章主要介紹了Python實現(xiàn)的生成自我描述腳本分享,很有意思的程序,繞的人有點頭暈,需要的朋友參考下吧
    2014-07-07
  • Python NaN空值的處理示例詳解

    Python NaN空值的處理示例詳解

    這篇文章主要介紹了Python NaN空值的處理,通過本文的介紹,對Python去掉數(shù)組中的空值NaN有了更加深入的了解,在實際的數(shù)據(jù)分析工作中,我們可以根據(jù)具體的情況選擇合,需要的朋友可以參考下
    2023-11-11
  • python文件操作之目錄遍歷實例分析

    python文件操作之目錄遍歷實例分析

    這篇文章主要介紹了python文件操作之目錄遍歷的方法,以實例形式較為詳細的分析了目錄遍歷所需要用到的相關函數(shù)與使用技巧,需要的朋友可以參考下
    2015-05-05
  • python 使用遞歸的方式實現(xiàn)語義圖片分割功能

    python 使用遞歸的方式實現(xiàn)語義圖片分割功能

    這篇文章主要介紹了python 使用遞歸的方式實現(xiàn)語義圖片分割,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07

最新評論

灵丘县| 磐石市| 东源县| 招远市| 莆田市| 秦皇岛市| 河西区| 德清县| 大城县| 林周县| 鄂州市| 张家界市| 宁都县| 连南| 奇台县| 京山县| 永清县| 广宁县| 滨海县| 册亨县| 万源市| 津市市| 鹤峰县| 霍山县| 凯里市| 化德县| 寻乌县| 行唐县| 渭南市| 红原县| 中西区| 翁源县| 江达县| 鄱阳县| 来安县| 锦州市| 南康市| 体育| 贵溪市| 孝昌县| 时尚|