之前章節講到的算法都是有監督學習方法, 在建模之前需要訓練(樣本)數據集,模型根據樣本數據集的結果,訓練得到某些參數,形成分類器。無監督學習沒有訓練數據集,在數據集上根據某種規則完成模型建立;
所謂物以類聚-人以羣分,“類”指的是具有相似性的集合,聚類是指將數據集劃分爲若干類,使得各個類之內的數據最爲相似,而各個類之間的數據相似度差別儘可能的大。聚類分析就是以相似性爲基礎,在一個聚類中的模式之間比不在同一個聚類中的模式之間具有更多的相似性。對數據集進行聚類劃分,屬於無監督學習。
K-Means是最常用且簡單的聚類算法,最大特點是好理解,運算速度快,時間複雜度近於線性,適合挖掘大規模數據集。但是只能應用於連續型的數據,並且一定要在聚類前需要手工指定要分成幾類;
K-Means採用距離作爲相似性指標,從而發現給定數據集中的K個類,且每個類的中心是根據類中所有數值的均值得到的,每個類的中心用聚類中心來描述。對於給定的一個(包含n個一維以及一維以上的數據點的)數據集X以及要得到的類別數量K,選取歐式距離作爲相似度指標,聚類目標實施的個類的聚類平反和最小,即最小化:
K-Means算法流程:
1、隨機選取K個樣本作爲聚類中心;
2、計算各樣本與各個聚類中心的距離;
3、將各樣本回歸於與之距離最近的聚類中心;
4、求各個類的樣本的均值,作爲新的聚類中心;
5、判定:若類中心不再發生變動或者達到迭代次數,算法結束,否則回到第二步。
西瓜數據集聚類分析
from sklearn import datasets
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
URL="C:\\Users\\71781\\Desktop\\2020\\ML-20200422\\K-means\\"
data=pd.read_csv(URL+"xigua.csv")
data.head()
data.describe()
fig,(axis1,axis2) = plt.subplots(1,2,figsize=(10,3))
sns.distplot(data["density"],ax=axis1)
sns.distplot(data["sugercontent"],ax=axis2)
sns_test=sns.scatterplot(x="density",y="sugercontent",data=data)
import sklearn.cluster as sc
# n_clusters: 聚類數
model = sc.KMeans(n_clusters=4)
# 不斷調整聚類中心,直到最終聚類中心穩定則聚類完成
model.fit(data)
# 獲取訓練結果的聚類中心
centers = model.cluster_centers_
KMeans函數的參數
n_clusters:整型,缺省值=8 ,生成的聚類數。
max_iter:整型,缺省值=300 。
執行一次k-means算法所進行的最大迭代數。
n_init:整型,缺省值=10 。
用不同的聚類中心初始化值運行算法的次數,最終解是在inertia意義下選出的最優結果。
init:有三個可選值:’k-means++’, ‘random’,或者傳遞一個ndarray向量。
此參數指定初始化方法,默認值爲 ‘k-means++’。
(1)‘k-means++’ 用一種特殊的方法選定初始聚類中發,可加速迭代過程的收斂。
(2)‘random’ 隨機從訓練數據中選取初始質心。
(3)如果傳遞的是一個ndarray,則應該形如 (n_clusters, n_features) 並給出初始質心。
precompute_distances:三個可選值,‘auto’,True 或者 False。
預計算距離,計算速度更快但佔用更多內存。
(1)‘auto’:如果 樣本數乘以聚類數大於 12million 的話則不預計算距離。
(2)True:總是預先計算距離。
(3)False:永遠不預先計算距離。
tol:float類型,默認值= 1e-4 與inertia結合來確定收斂條件。
n_jobs:整形數。 指定計算所用的進程數。內部原理是同時進行n_init指定次數的計算。(1)若值爲 -1,則用所有的CPU進行運算。若值爲1,則不進行並行運算。(2)若值小於-1,則用到的CPU數爲(n_cpus + 1 + n_jobs)。因此如果 n_jobs值爲-2,則用到的CPU數爲總CPU數減1。
random_state:整型或 numpy.RandomState 類型,可選,用於初始化質心的生成器(generator)。如果值爲一個整數,則確定一個seed。此參數默認值爲numpy的隨機數生成器。
copy_x:布爾型,默認值=True ,當我們precomputing distances時,將數據中心化會得到更準確的結果。如果把此參數值設爲True,則原始數據不會被改變。如果是False,則會直接在原始數據上做修改並在函數返回值時將其還原。但是在計算過程中由於有對數據均值的加減運算,所以數據返回後,原始數據和計算前可能會有細小差別。