聚類演算法 KMeans 機器學習實戰

2021-08-18 16:56:10 字數 4382 閱讀 5882

直接上**:

# -*- coding:utf8 -*-

# @time : 2018/4/12 下午05:33

# @author : yjfiejd

# @file : k-means_3.py

from numpy import *

import time

import matplotlib.pyplot as plt

# 1)先定義3個函式,第乙個函式為匯入資料函式

def loaddataset(filename):

dataset = #定義乙個陣列用來儲存匯入的資料

fr = open(filename) #開啟檔案

for line in fr.readlines(): #便利檔案的每一行,返回list

curline = line.strip().split('\t') #對每一行格式化

fltline = map(float, curline) #把每一行轉為float型別

# 2)定義第二個函式,計算歐氏距離函式, 兩個矩陣之間對距離,所以有sum

def disteclud(vector1, vector2):

return sqrt(sum(power(vector2 - vector1, 2)))

# 3)定義隨機對簇點,簇點來自與dataset,注意隨機簇點對對取值範圍

def randcent(dataset, k):

n = shape(dataset)[1] #獲取矩陣列數,shape[行,列]

centroids = mat(zeros((k, n))) #初始化簇矩陣,有k個質心, array轉換為matrix格式

for j in range(n): #遍歷每乙個列(特徵—)

minj = min(dataset[:, j]) #取每列中最小值

maxj = max(dataset[:, j]) #取每一列中最大值

rangej = float(maxj - minj) #計算簇對取值範圍

centroids[:, j] = mat(minj + rangej*random.rand(k, 1)) #rand隨機生成k行1列陣列,其中值【0,1】

return centroids

# 這個函式對另一種做法

#def initcentroids(dataset, k):

# numsamples, dim = dataset.shape #矩陣的行數、列數

# centroids = zeros((k, dim))

# for i in range(k): #直接初始化簇點

# index = int(random.uniform(0, numsamples)) #隨機產生乙個浮點數,然後將其轉化為int型

# centroids[i, :] = dataset[index, :]

# return centroids

# 4)定義kmeans函式

def kmeans(dataset, k):

# 1)初始化儲存點簇分配結果矩陣

m = shape(dataset)[0] #獲取資料對行數,也就是樣本點對個數

clusterassment = mat(zeros((m, 2))) #初始化簇對分類結果矩陣,m行,2列特徵

# 2) 初始化隨機簇點

centroids = randcent(dataset, k) #初始化隨機簇點

clusterchange = true #定義迴圈判定條件,當簇點中心位置不再變化時,退出

while clusterchange:

clusterchange = false

for i in range(m): #對每個樣本計算最近對中心

mindist = 1000000.0; #初始化mindist,第一次設定為很大對值

minindex = 0 #初始化索引,對應為,分到哪個簇

for j in range(k): #對每個簇中心遍歷,因為有多個,計算每個點到簇中心距離,把最小對進行歸類

distji = disteclud(centroids[j, :], dataset[i, :]) #計算距離

if distji < mindist:

mindist = distji; #把小對值給mindist

minindex = j #得到最近對中心,以及對應對j,簇號

# 3) 更新cluster, 若所有對簇質心位置不變,則退出while迴圈

# k個簇裡第i個樣本距離最小對標號和距離儲存在clusterassment

if clusterassment[i, :] != minindex:

clusterchange = false

clusterassement[i,:] = minindex, mindist**2 #兩個**表示對數mindist對平方

#4)更新centroids,遍歷簇心位置

for j in range(k):

#clusterassment[:,0].a==j是找出矩陣clusterassment中第一列元素中等於j的行的下標,返回的是乙個以array的列表,第乙個array為等於j的下標

pointsincluster = dataset[nonzero(clusterassment[:, 0].a == j)[0]]

centroids[j, :] = mean(pointsincluster, axis = 0) #計算標註為j的所有樣本的平均值

print('finish')

return centroids, clusterassment

# 5)展示2d

def showcluster(dataset, k , centroids, clusterassment):

m = shape(dataset)[0] #行數

n = shape(dataset)[1] #列數

if n != 2:

print("sorry, can't draw because your data dimension is 2")

return 1

mark = ['or', 'ob', 'og', 'ok','^r', '+r', 'sr', 'dr', 'len(mark):

print ("sorry, your k is too large")

return 1

# 繪製所有點對顏色

for i in range(m):

markindex = int(clusterassment[i, 0]) #為樣本指定顏色

plt.plot(dataset[i, 0], dataset[i, 1], mark[markindex])

mark = ['dr', 'db', 'dg', 'dk', '^b', '+b', 'sb', 'db', '#繪製簇中心點對顏色

for i in range(k):

plt.plot(centroids[i, 0], centroids[i, i], mark[i], markersize = 12)

plt.show()

## step 1: load data

import os

print ("step 1: load data..." )

dataset = #列表,用來表示,列表中的每個元素也是乙個二維的列表;這個二維列表就是乙個樣本,樣本中包含有我們的屬性值和類別號。

#與我們所熟悉的矩陣類似,最終我們將獲得n*2的矩陣,

f = "/users/a1/desktop/演算法實戰/k-means/k-means_3/testset.txt"

filein = open(f) #是正斜槓

for line in filein.readlines():

temp=

linearr = line.strip().split('\t') #line.strip()把末尾的'\n'去掉

filein.close()

## step 2: clustering...

print ("step 2: clustering..." )

dataset = mat(dataset) #mat()函式是numpy中的庫函式,將陣列轉化為矩陣

k = 4

centroids, clusterassment = kmeans(dataset, k) #呼叫kmeans檔案中定義的kmeans方法。

## step 3: show the result

print ("step 3: show the result..." )

kmeans.showcluster(dataset, k, centroids, clusterassment)

機器學習之聚類演算法 K Means

參考 聚類演算法可以分為 中心點方法 層次聚類方法 基於密度方法 基於網格 基於模型方法。其中最為經典的是k means演算法 k means屬於中心點方法 也有叫劃分方法 演算法經典簡單。演算法 人工選取k值,並選取k個點作為k個簇的質心 對所有樣本分別計算到k個簇的質心的距離 歐式或者曼哈頓 取...

機器學習演算法 之K means聚類

1.模型 k means演算法並沒有顯式的數學模型,演算法的目的是從資料集中得到k個中心點,每個中心點及其周圍的點形成乙個聚簇。k means是一種無監督的學習模型。k means的學習目標如下圖所示 2.策略 k mean演算法採用的損失函式是平方損失函式。每個簇的點距離中心的平方距離之和構成損失...

機器學習之K means聚類演算法

k均值演算法的計算過程非常直觀 1 從d中隨機取k個元素,作為k個簇的各自的中心。2 分別計算剩下的元素到k個簇中心的相異度,將這些元素分別劃歸到相異度最低的簇。3 根據聚類結果,重新計算k個簇各自的中心,計算方法是取簇中所有元素各自維度的算術平均數。4 將d中全部元素按照新的中心重新聚類。5 重複...