直接上**:
# -*- 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 重複...