(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )git
前面的機器學習類文章(編號從010-019)都是關於監督學習,可是從本篇文章開始,煉丹老頑童要開始講解無監督學習方面,無監督學習是指處理的數據沒有任何形式的標記,咱們沒有對訓練數據集進行實現的類別劃分,故而至關於抹黑處理,要讓機器學習本身找出樣本所屬的類別,那麼機器學習經過什麼方式來找出「所屬類別」了?這就是聚類算法的做用了。github
聚類算法,其核心思想就是中國的「人以類聚,物以羣分」,就是機器學習將經過必定的算法來將樣本劃分類別,使得相互之間類似的樣本劃分爲一個類別,不類似的樣本劃分爲不一樣的類別中。算法
K-means算法是最流行的聚類算法之一,這種算法經常利用數據的不一樣屬性將輸入數據劃分爲K組,這種劃分是使用最優化的技術實現的,讓各組內的數據點與該組中心點的距離平方和最小化。dom
提及來很抽象,讓人感受雲裏霧裏,那麼咱們看一個簡單的實例吧。機器學習
本次所使用的數據集是我前面的文章【火爐煉AI】機器學習010-用樸素貝葉斯分類器解決多分類問題中所採用的數據集,一個具備四種不一樣類別,兩種不一樣features的小數據集,其加載方法和顯示方法以下所示。函數
# 準備數據集
data_path='E:\PyProjects\DataSet\FireAI/data_multivar.txt'
df=pd.read_csv(data_path,header=None)
# print(df.head())
# print(df.info()) # 查看數據信息,確保沒有錯誤
dataset_X,dataset_y=df.iloc[:,:-1],df.iloc[:,-1]
# print(dataset_X.head())
print(dataset_X.info())
print('-'*100)
print(dataset_y.head())
dataset_X=dataset_X.values
dataset_y=dataset_y.values
# print(dataset_X.shape) # (400, 2)
# print(dataset_y.shape) # (400,)
複製代碼
-------------------------------------輸---------出--------------------post
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 400 entries, 0 to 399
Data columns (total 2 columns):
0 400 non-null float64
1 400 non-null float64
dtypes: float64(2)
memory usage: 6.3 KB
None學習
--------------------------------------------完------------------------優化
代表結果數據集已經正確地加載到內存中,且每個features中都沒有Null值,咱們無需作進一步的缺失值處理。spa
下面將這個數據集進行2D可視化,以下是可視化的代碼:
# 無標籤數據集可視化,將第一列feature做爲X,第二列feature做爲y
def visual_2D_dataset_dist(dataset):
'''將二維數據集dataset顯示在散點圖中'''
assert dataset.shape[1]==2,'only support dataset with 2 features'
plt.figure()
X=dataset[:,0]
Y=dataset[:,1]
plt.scatter(X,Y,marker='v',c='g',label='dataset')
X_min,X_max=np.min(X)-1,np.max(X)+1
Y_min,Y_max=np.min(Y)-1,np.max(Y)+1
plt.title('dataset distribution')
plt.xlim(X_min,X_max)
plt.ylim(Y_min,Y_max)
plt.xlabel('feature_0')
plt.ylabel('feature_1')
plt.legend()
visual_2D_dataset_dist(dataset_X)
複製代碼
獲得的結果以下:
########################小**********結#####################
1. 本數據集的加載很簡單,只需用Pandas就能夠直接加載,且不須要作其餘處理。
2. 此處須要注意,無標籤數據集的二維平面可視化,不能使用label數據,故而此處的可視化函數和我以往文章中的可視化函數是不同的,此處須要額外注意。
3. 從二維平面散點圖中能夠看出,這個數據集大概能夠分爲4個不一樣的類別,即數據都分佈在四個族羣裏,這就是咱們能夠用K-mean算法的基礎。
########################################################
構建K-means算法的過程很簡單,和其餘的SVM,隨機森林算法的構建方式同樣,以下代碼:
# 定義一個k-means對象
from sklearn.cluster import KMeans
kmeans=KMeans(init='k-means++',n_clusters=4,n_init=10)
# 這幾個參數是初始化設定的,其中n_clusters是從二維散點圖中看出大概有4個族羣
kmeans.fit(dataset_X)
複製代碼
-------------------------------------輸---------出------------------
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
n_clusters=4, n_init=10, n_jobs=1, precompute_distances='auto',
random_state=None, tol=0.0001, verbose=0)
--------------------------------------------完---------------------
雖然此處咱們定義了一個KMeans對象,且使用咱們的無標籤數據集進行了訓練,但是訓練結果怎麼樣了?咱們怎麼知道k-means算法是否正確的劃分了不一樣類別?
因此咱們須要一個可視化的結果,就像前面文章中提到的SVM分類結果圖同樣,此處咱們定義了一個專門用於可視化K-means聚類結果的函數,並用該函數來查看此處聚類的效果。代碼以下:
def visual_kmeans_effect(k_means,dataset):
assert dataset.shape[1]==2,'only support dataset with 2 features'
X=dataset[:,0]
Y=dataset[:,1]
X_min,X_max=np.min(X)-1,np.max(X)+1
Y_min,Y_max=np.min(Y)-1,np.max(Y)+1
X_values,Y_values=np.meshgrid(np.arange(X_min,X_max,0.01),
np.arange(Y_min,Y_max,0.01))
# 預測網格點的標記
predict_labels=k_means.predict(np.c_[X_values.ravel(),Y_values.ravel()])
predict_labels=predict_labels.reshape(X_values.shape)
plt.figure()
plt.imshow(predict_labels,interpolation='nearest',
extent=(X_values.min(),X_values.max(),
Y_values.min(),Y_values.max()),
cmap=plt.cm.Paired,
aspect='auto',
origin='lower')
# 將數據集繪製到圖表中
plt.scatter(X,Y,marker='v',facecolors='none',edgecolors='k',s=30)
# 將中心點回執到圖中
centroids=k_means.cluster_centers_
plt.scatter(centroids[:,0],centroids[:,1],marker='o',
s=100,linewidths=2,color='k',zorder=5,facecolors='b')
plt.title('K-Means effect graph')
plt.xlim(X_min,X_max)
plt.ylim(Y_min,Y_max)
plt.xlabel('feature_0')
plt.ylabel('feature_1')
plt.show()
visual_kmeans_effect(kmeans,dataset_X)
複製代碼
########################小**********結###################
1. 定義K-means聚類算法的方法很簡單,只須要從sklearn.cluster中導入KMeans,並定義一個KMeans對象便可,直接用fit()函數能夠直接訓練。
2. 此處使用k-means聚類算法對數據進行了聚類分析,可使用函數visual_kmeans_effect()來直接查看聚類後的效果圖。
3. 雖然能夠直觀看到效果圖,但效果圖仍是難以量化k-means聚類算法的準確度,這些內容將在後續文章中講解。
#######################################################
注:本部分代碼已經所有上傳到(個人github)上,歡迎下載。
參考資料:
1, Python機器學習經典實例,Prateek Joshi著,陶俊傑,陳小莉譯