聚類 python_python中實現k-means聚類算法詳解

算法優缺點:

優點:容易實現

缺點:可能收斂到局部最小值,在大規模數據集上收斂較慢

使用數據類型:數值型數據

算法思想

k-means算法實際上就是通過計算不同樣本間的距離來判斷他們的相近關系的,相近的就會放到同一個類別中去。

1.首先我們需要選擇一個k值,也就是我們希望把數據分成多少類,這里k值的選擇對結果的影響很大,Ng的課說的選擇方法有兩種一種是elbow method,簡單的說就是根據聚類的結果和k的函數關系判斷k為多少的時候效果最好。另一種則是根據具體的需求確定,比如說進行襯衫尺寸的聚類你可能就會考慮分成三類(L,M,S)等

2.然后我們需要選擇最初的聚類點(或者叫質心),這里的選擇一般是隨機選擇的,代碼中的是在數據范圍內隨機選擇,另一種是隨機選擇數據中的點。這些點的選擇會很大程度上影響到最終的結果,也就是說運氣不好的話就到局部最小值去了。這里有兩種處理方法,一種是多次取均值,另一種則是后面的改進算法(bisecting K-means)

3.終于我們開始進入正題了,接下來我們會把數據集中所有的點都計算下與這些質心的距離,把它們分到離它們質心最近的那一類中去。完成后我們則需要將每個簇算出平均值,用這個點作為新的質心。反復重復這兩步,直到收斂我們就得到了最終的結果。

函數

loadDataSet(fileName)

從文件中讀取數據集

distEclud(vecA, vecB)

計算距離,這里用的是歐氏距離,當然其他合理的距離都是可以的

randCent(dataSet, k)

隨機生成初始的質心,這里是雖具選取數據范圍內的點

kMeans(dataSet, k, distMeas=distEclud, createCent=randCent)

kmeans算法,輸入數據和k值。后面兩個事可選的距離計算方式和初始質心的選擇方式

show(dataSet, k, centroids, clusterAssment)

可視化結果

#coding=utf-8

from numpy import *

def loadDataSet(fileName):

dataMat = []

fr = open(fileName)

for line in fr.readlines():

curLine = line.strip().split('\t')

fltLine = map(float, curLine)

dataMat.append(fltLine)

return dataMat

#計算兩個向量的距離,用的是歐幾里得距離

def distEclud(vecA, vecB):

return sqrt(sum(power(vecA - vecB, 2)))

#隨機生成初始的質心(ng的課說的初始方式是隨機選K個點)

def randCent(dataSet, k):

n = shape(dataSet)[1]

centroids = mat(zeros((k,n)))

for j in range(n):

minJ = min(dataSet[:,j])

rangeJ = float(max(array(dataSet)[:,j]) - minJ)

centroids[:,j] = minJ + rangeJ * random.rand(k,1)

return centroids

def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):

m = shape(dataSet)[0]

clusterAssment = mat(zeros((m,2)))#create mat to assign data points

#to a centroid, also holds SE of each point

centroids = createCent(dataSet, k)

clusterChanged = True

while clusterChanged:

clusterChanged = False

for i in range(m):#for each data point assign it to the closest centroid

minDist = inf

minIndex = -1

for j in range(k):

distJI = distMeas(centroids[j,:],dataSet[i,:])

if distJI < minDist:

minDist = distJI; minIndex = j

if clusterAssment[i,0] != minIndex:

clusterChanged = True

clusterAssment[i,:] = minIndex,minDist**2

print centroids

for cent in range(k):#recalculate centroids

ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]#get all the point in this cluster

centroids[cent,:] = mean(ptsInClust, axis=0) #assign centroid to mean

return centroids, clusterAssment

def show(dataSet, k, centroids, clusterAssment):

from matplotlib import pyplot as plt

numSamples, dim = dataSet.shape

mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '

for i in xrange(numSamples):

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, 1], mark[i], markersize = 12)

plt.show()

def main():

dataMat = mat(loadDataSet('testSet.txt'))

myCentroids, clustAssing= kMeans(dataMat,4)

print myCentroids

show(dataMat, 4, myCentroids, clustAssing)

if __name__ == '__main__':

main()

這里是聚類結果,還是很不錯的啦

20171111163929236.jpg?20171011163955

但是有時候也會收斂到局部最小值,就像下面這樣,就是不幸收斂到局部最優了

20171111164028330.jpg?20171011164048

總結

以上就是本文關于python中實現k-means聚類算法詳解的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站:

有什么問題可以隨時留言,小編會及時回復大家的。感謝朋友們對本站的支持!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276666.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276666.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python筆試常見題

1、冒泡排序&#xff1a; 冒泡排序算是最基本的python算法了。也算python面試遇到問的最多的了。 如果是封裝成函數。代碼如下&#xff1a; 如果初始就一個字典。那么代碼為&#xff1a; 冒泡排序的本質就是兩兩比較。根據結果調換位置。最終達到一個排序的效果。 注&#xff1…

固定資產打開提示:上年度數據未結轉!

問題現象&#xff1a;固定資產打開提示&#xff1a;上年度數據未結轉&#xff01; 問題分析&#xff1a;服務器出問題后&#xff0c;數據庫UFSYSTEM丟失&#xff0c;重新建賬后年度數據覆蓋后出現的&#xff0c;那么問題應該出在UFSYSTEM庫UA_ACCOUNT_SUB表與年度庫Accinformat…

windows MySQL 5+ 服務手動安裝

MySQL 5 服務手動安裝的方法&#xff1a;運行cmd&#xff0c;進入mysql的安裝目錄&#xff1a; C:\Users\aministrator> D: D:\> cd MySQL Server 5.6\bin D:\MySQL Server 5.6\bin>在bin目錄中運行mysqld.exe -install命令&#xff0c;安裝不完成會有提示信息。#1、手…

Kotlin防止按鈕多次點擊

剛開始寫kotlin 這段代碼寫的可能有問題 望指正 object ViewClickDelay {var hash: Int 0var lastClickTime: Long 0var SPACE_TIME: Long 3000 }infix fun View.clickDelay(clickAction: () -> Unit) {this.setOnClickListener {if (this.hashCode() ! hash) {hash thi…

C#網絡編程(同步傳輸字符串) - Part.2

服務端客戶端通信 在與服務端的連接建立以后&#xff0c;我們就可以通過此連接來發送和接收數據。端口與端口之間以流&#xff08;Stream&#xff09;的形式傳輸數據&#xff0c;因為幾乎任何對象都可以保存到流中&#xff0c;所以實際上可以在客戶端與服務端之間傳輸任何類型的…

Factory Method工廠方法

“對象創建“模式 通過”對象創建“模式繞開new&#xff0c;來避免對象創建(new)過程中所導致的緊耦合&#xff08;以來具體類&#xff09;&#xff0c;從而支持對象創建的穩定。它是接口抽象之后的第一部工作。 典型模式&#xff1a;Factory Method&#xff0c;Abstract Facto…

centos 關閉防火墻_CentOS7操作系統下如何關閉防火墻

centos系統如果不關閉防火墻在使用中會遇到不少問題&#xff0c;而且centos7和centos6關閉防火墻的方式不一樣。centos6:1.永久性生效&#xff0c;重啟后不會復原開啟&#xff1a; chkconfig iptables on關閉&#xff1a; chkconfig iptables off2.即時生效&#xff0c;重啟后復…

web 網頁按比例顯示圖片 js

原文鏈接&#xff1a;http://blog.csdn.net/liqinghuiyx/article/details/5442349 在動態站點上經常需要上傳自己的圖片&#xff0c;而這些圖片的大小是未知的&#xff0c;在顯示成縮略圖的時候必須進行按比例的縮放才能美觀地顯示。以最近做的golf網站&#xff08;http://www…

黑馬C++設計模式1

設計模式的基礎是&#xff1a;多態。 設計模式綜覽表&#xff1a; 單例模式&#xff1a;是保證一個類僅有一個實例&#xff0c;并提供一個訪問它的全局訪問點。 簡單工廠模式&#xff1a;通過專門頂一個一個類來負責創建其它類的實例&#xff0c;被創建的實例通常都具有共同的父…

對于未來的一點思考

最近在思考一個問題&#xff1a;以后的發展路線。   自己算是走上了IT的道路&#xff0c;但現在也只是在程序員階段&#xff0c;當然還未畢業&#xff0c;以后的路還很長&#xff0c;但是這個問題確是現在或以后不得不面對的一個問題。  上學期未那兩個月&#xff0c;去了N…

深入解析react關于事件綁定this的四種方式

這篇文章主要介紹了詳解react關于事件綁定this的四種方式&#xff0c;寫的十分的全面細致&#xff0c;具有一定的參考價值&#xff0c;對此有需要的朋友可以參考學習下。如有不足之處&#xff0c;歡迎批評指正。 在react組件中&#xff0c;每個方法的上下文都會指向該組件的實例…

Apache的認證、授權、訪問控制

原文鏈接&#xff1a; http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/howto/auth.html Apache認證、授權、訪問控制 認證(Authentication)是指任何識別用戶身份的過程。授權(Authorization)是允許特定用戶訪問特定區域或信息的過程。 相關模塊和指令 認證和授權…

黑馬C++設計模式2

簡單工廠模式 //一般來說&#xff0c;自己創建一個對象的方法是在自己寫的業務函數中直接new一個對象出來//但是現實需求&#xff0c;我不想創建對象&#xff0c;我只想拿來用。&#xff08;創建類的步驟比較復雜&#xff09; //好處&#xff0c;1、客戶端和具體實現類解耦。2…

[轉]Struts 2.1發布

作者 Ian Roughley譯者 崔康 發布于 2009年2月4日 上午8時13分 Struts2框架剛剛發布最新2.1版。該版本做了重大升級&#xff0c;包括重構更多代碼到插件框架、通過增加convention插件減少XML配置和改進REST支持。 我采訪了Musachy Barroso——該版本的一位開發人員&#xff0c…

dim private public static_PHP中const,static,public,private,protected的區別

const: 定義常量&#xff0c;一般定義后不可改變static: 靜態&#xff0c;類名可以訪問public: 表示全局&#xff0c;類內部外部子類都可以訪問&#xff1b;private: 表示私有的&#xff0c;只有本類內部可以使用&#xff1b;protected: 表示受保護的&#xff0c;只有本類或子類…

C#圖解教程 第六章 深入理解類

深入理解類 類成員 前兩章闡述了9種類成員中的兩種&#xff1a;字段和方法。本章將會介紹除事件(第14章)和運算符外的其他類成員&#xff0c;并討論其特征。 成員修飾符的順序 字段和方法的聲明可以包括許多如public、private這樣的修飾符。本章還會討論許多其他修飾符。多個修…

Apache用戶身份驗證

原文鏈接&#xff1a;http://www.yylog.org/?p4830 Apache用戶身份驗證 在apache應用過程中&#xff0c;管理員經常需要對apache下的目錄做一些限制&#xff0c;不希望所有用戶都能訪問該目錄下的文件&#xff0c;只對指定用戶訪問&#xff0c;此時我們就要用到apache用戶身…

攜程elong相繼牽手支付寶轉“危”為“機”

新華網浙江頻道1月16日電 自電子機票全面普及以來&#xff0c;航空公司機票直銷的力度不斷加強正給傳統的機票代理甚至在線旅游平臺帶來了極大的生存壓力。 而面對危機&#xff0c;在進一步豐富自身產品服務之外&#xff0c;大的在線旅行平臺也終于找到對策。繼eLong此前與支付…

c# 獲取word表格中的內容_Java 獲取、刪除Word文本框中的表格

本文介紹如何來獲取Word文本框中包含的表格&#xff0c;以及刪除表格。程序測試環境包括&#xff1a;IDEAJDK 1.8.0Spire.Doc.jar注&#xff1a;jar導入&#xff0c;可通過創建Maven程序項目&#xff0c;并在pom.xml中配置Maven倉庫路徑&#xff0c;并指定Free Spire.Doc for J…

Array.prototype.reduce 的理解與實現

Array.prototype.reduce 是 JavaScript 中比較實用的一個函數&#xff0c;但是很多人都沒有使用過它&#xff0c;因為 reduce 能做的事情其實 forEach 或者 map 函數也能做&#xff0c;而且比 reduce 好理解。但是 reduce 函數還是值得去了解的。 reduce 函數可以對一個數組進行…