十一 用scikit learn做聚類分析

2021-07-26 10:19:59 字數 2455 閱讀 4395

線性回歸和邏輯回歸都是監督學習方法,聚類分析是非監督學習的一種,可以從一批資料集中探索資訊,比如在社交網路資料中可以識別社群,在一堆菜譜中識別出菜系。本節介紹k-means聚類演算法

k是乙個超引數,表示要聚類成多少類。k-means計算方法是重複移動類的重心,以實現成本函式最小化,成本函式為:

其中μk是第k類的重心位置

構造一些樣本使用者試驗,如下:

# coding:utf-8

import sys

reload(sys)

sys.setdefaultencoding( "utf-8" )

import matplotlib.pyplot as plt

import numpy as np

# 生成2*10的矩陣,且值均勻分布的隨機數

cluster1 = np.random.uniform(0.5, 1.5, (2, 10))

cluster2 = np.random.uniform(3.5, 4.5, (2, 10))

# 順序連線兩個矩陣,形成乙個新矩陣,所以生成了乙個2*20的矩陣,t做轉置後變成20*2的矩陣,剛好是一堆(x,y)的座標點

x = np.hstack((cluster1, cluster2)).t

plt.figure()

plt.axis([0, 5, 0, 5])

plt.grid(true)

plt.plot(x[:,0],x[:,1],'k.')

plt.show()

影象如下:

通過k-means做聚類,輸出重心點,增加如下**:

from sklearn.cluster import kmeans

kmeans = kmeans(n_clusters=2)

kmeans.fit(x)

plt.plot(kmeans.cluster_centers_[:,0], kmeans.cluster_centers_[:,1], 'ro')

輸出影象:

可以看到找到了兩個重心點

現實情況是多個點並不像上面這麼聚類清晰,很可能是這樣的:

你說不清它應該聚類成2、3、4個點,因此我們需要通過分別計算k=(2,3,4)的聚類結果,並比較他們的成本函式值,隨著k的增大,成本函式值會不斷降低,只有快速降低的那個k值才是最合適的k值,如下:

# coding:utf-8

import sys

reload(sys)

sys.setdefaultencoding( "utf-8" )

import matplotlib.pyplot as plt

import numpy as np

from sklearn.cluster import kmeans

from scipy.spatial.distance import cdist

# 生成2*10的矩陣,且值均勻分布的隨機數

cluster1 = np.random.uniform(0.5, 1.5, (2, 10))

cluster2 = np.random.uniform(1.5, 2.5, (2, 10))

cluster3 = np.random.uniform(1.5, 3.5, (2, 10))

cluster4 = np.random.uniform(3.5, 4.5, (2, 10))

# 順序連線兩個矩陣,形成乙個新矩陣,所以生成了乙個2*20的矩陣,t做轉置後變成20*2的矩陣,剛好是一堆(x,y)的座標點

x1 = np.hstack((cluster1, cluster2))

x2 = np.hstack((cluster3, cluster4))

x = np.hstack((x1, x2)).t

k = range(1, 10)

meandistortions =

for k in k:

kmeans = kmeans(n_clusters=k)

kmeans.fit(x)

# 求kmeans的成本函式值

plt.figure()

plt.grid(true)

plt1 = plt.subplot(2,1,1)

# 畫樣本點

plt1.plot(x[:,0],x[:,1],'k.');

plt2 = plt.subplot(2,1,2)

# 畫成本函式值曲線

plt2.plot(k, meandistortions, 'bx-')

plt.show()

影象如下:

從曲線上可以看到,隨著k的增加,成本函式值在降低,但降低的變化幅度不斷在減小,因此急速降低才是最合適的,這裡面也許3是比較合適的,你也許會有不同看法

通過這種方法來判斷最佳k值的方法叫做肘部法則,你看影象像不像乙個人的胳膊肘?

八 用scikit learn做特徵提取

現實世界中多數特徵都不是連續變數,比如分類 文字 影象等,為了對非連續變數做特徵表述,需要對這些特徵做數學化表述,因此就用到了特徵提取 比如城市作為乙個特徵,那麼就是一系列雜湊的城市標記,這類特徵我們用二進位制編碼來表示,是這個城市為1,不是這個城市為0 比如有三個城市 北京 天津 上海,我們用sc...

MySQL學習筆記之二十一 使用者的許可權

一 資料庫和表的許可權 下列許可權運用於資料庫和表上的操作。select 允許你使用select語句從表中檢索資料。select語句只有在他們真正從乙個表中檢索行是才需要select許可權,你可以執行某個select語句,甚至沒有任何到伺服器上的資料 庫里的訪問任何東西的許可。例如,你可使用mysq...

學習隨記十一 用順序棧計算逆波蘭表示式

我遇到的主要問題 怎麼儲存表示式以及將表示式中的數字轉化成基本資料型別,我看了許多部落格嘗試過用stringstream的方法,但是每次遇到不知名錯誤除錯求證無果,後找到了c 自帶的型別轉換函式stod,真的很棒 學到的一些知識 字尾表示式的演算法,string與基本資料型別間的轉換,以及用eras...