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