線性回歸、嶺回歸、邏輯回歸、聚類

分類算法的目標值是離散型的
如果目標值是連續型的值,就需要回歸算法
比如房價預測、銷售額預測、貸款額度預測等

回歸算法-線性回歸分析

舉個栗子

期末成績:0.7×考試成績+0.3×平時成績(各個特征跟某個值組合在一起去預測)

西瓜好壞:0.2×色澤+0.5×根蒂+0.3×敲聲(把回歸問題轉換為分類問題)

線性關系模型

一個通過屬性的線性組合來進行預測的函數:

f(x)=w_1 x_1+w_2 x_2 + ... + w_d x_d+b\\w為權重,b稱為偏置項,可以理解為:w_0×1

線性回歸

定義:線性回歸通過一個或者多個自變量與因變量之間之間進行建模的回歸分析。其中特點為一個或多個稱為回歸系數的模型參數的線性組合

一元線性回歸:涉及到的變量只有一個

多元線性回歸:涉及到的變量兩個或兩個以上

通用公式:
h(w)= w_0 + w_1 x_1 + w_2 x_2+… = w^T x

其中w,x為矩陣:
w = \begin{pmatrix} w_0 \\ w_1 \\ w_2 \end{pmatrix}, x = \begin{pmatrix} 1 \\ x_1 \\ x_2 \end{pmatrix}
屬性和權重的一種組合來預測結果

矩陣也是大多數算法的計算基礎

矩陣乘法:
(m行, l列)*(l行, n列) = (m行, n行)
(這線性代數我是記不住咯…)

預測結果與真實值是有一定的誤差

單變量:

多變量:


回歸算法是迭代的算法

損失函數(誤差大小)

  • y_i為第i個訓練樣本的真實值
  • h_w (x_i)為第i個訓練樣本特征值組合預測函數

總損失定義:
??(\theta)= (?_?? (??_1) ???_1 )^2+(?_?? (??_2) ???_2 )^2+…+(?_?? (??_??) ???_?? )^2 =\sum_{??=1}^{??}(?_?? (??_?? )???_?? )^2
又稱最小二乘法

如何去求模型當中的W,使得損失最小?(目的是找到最小損失對應的W值)

最小二乘法之正規方程

求解:
??=(??^?? ??)^{?1} ??^?? ??
??為特征值矩陣,??為目標值矩陣

缺點:當特征過于復雜,求解速度太慢
對于復雜的算法,不能使用正規方程求解(邏輯回歸等)

損失函數直觀圖(單變量舉例)

直接求解到最小值

最小二乘法之梯度下降

我們以單變量中的w0,w1為例子:
w_1 = -w_1 - \alpha \frac{\delta cost(w_0+w_1x_1)}{\delta w_1}

w_0 = -w_0 - \alpha \frac{\delta cost(w_0+w_1x_1)}{\delta w_1}

\alpha為學習效率,需要手動指定,\frac{\delta cost(w_0+w_1x_1)}{\delta w_1}表示方向

理解:沿著這個函數下降的方向找,最后就能找到山谷的最低點,然后更新W值

使用:面對訓練數據規模十分龐大的任務

sklearn線性回歸正規方程、梯度下降API

正規方程: sklearn.linear_model.LinearRegression

梯度下降: sklearn.linear_model.SGDRegressor

LinearRegression、SGDRegressor

普通最小二乘線性回歸

  • sklearn.linear_model.LinearRegression()
  • coef_:回歸系數

通過使用SGD最小化線性模型

  • sklearn.linear_model.SGDRegressor( )
  • coef_:回歸系數

波士頓房價數據案例分析流程

  1. 波士頓地區房價數據獲取

  2. 波士頓地區房價數據分割

  3. 訓練與測試數據標準化處理

  4. 使用最簡單的線性回歸模型LinearRegression和梯度下降估計SGDRegressor對房價進行預測

屬性名 解釋 類型
CRIM 城鎮人均犯罪率 連續值
ZN 住宅用地超過 25000 sq.ft. 的比例 連續值
INDUS 城鎮非零售商用土地的比例 連續值
CHAS 查理斯河空變量(如果邊界是河流, 則為1; 否則為0) 離散值
NOX 一氧化氮濃度 連續值
RM 住宅平均房間數 連續值
AGE 1940 年之前建成的自用房屋比例 連續值
DIS 到波士頓五個中心區域的加權距離 連續值
RAD 輻射性公路的接近指數 連續值
TAX 每 10000 美元的全值財產稅率 連續值
PTRATIO 城鎮師生比例 連續值
B 1000(Bk-0.63)^ 2,其中 Bk 指代城鎮中黑人的比例 連續值
LSTAT 人口中地位低下者的比例 連續值

這個數據集一共有13個特征,所以我們需要求出13個權重

正規方程

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error


def mylinear():
    """
    線性回歸直接預測房子價格
    :return: None
    """
    # 獲取數據
    lb = load_boston()

    # 分割數據集到訓練集和測試集
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
    # 進行標準化處理(目標值要進行標準化處理)
    # 特征值和目標值都必須進行標準化處理, 實例化兩個標準化API
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)

    # 目標值
    std_y = StandardScaler()
    y_train = std_y.fit_transform(y_train.reshape(-1, 1))
    y_test = std_y.transform(y_test.reshape(-1, 1))

    # estimator預測
    # 正規方程求解方式預測結果
    lr = LinearRegression()
    lr.fit(x_train, y_train)

    print(lr.coef_)

    # 預測測試集的房子價格
    y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
    print("正規方程測試集里面每個房子的預測價格: ", y_lr_predict)
    print("正規方程的均方誤差: ", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))
    
    
if __name__ == "__main__":
    mylinear()

梯度下降

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error


def mylinear():
    """
    線性回歸直接預測房子價格
    :return: None
    """
    # 獲取數據
    lb = load_boston()

    # 分割數據集到訓練集和測試集
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
    # 進行標準化處理(目標值要進行標準化處理)
    # 特征值和目標值都必須進行標準化處理, 實例化兩個標準化API
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)

    # 目標值
    std_y = StandardScaler()
    y_train = std_y.fit_transform(y_train.reshape(-1, 1))
    y_test = std_y.transform(y_test.reshape(-1, 1))

    # estimator預測
    # 梯度下降進行房價預測
    sgd = SGDRegressor()
    sgd.fit(x_train, y_train)

    print(sgd.coef_)

    # 預測測試集的房子價格
    y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
    print("梯度下降測試集里面每個房子的預測價格: ", y_sgd_predict)
    print("梯度下降的均方誤差: ", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))


if __name__ == "__main__":
    mylinear()

回歸性能評估

(均方誤差(Mean Squared Error)MSE) 評價機制:
MSE = \frac{1}{m} \sum_{i=1}^m(y^i-\bar{y})^2\\注意:y^i為預測值,\bar{y}為真實值
這個非常簡單,就是你的預測值和真實值之間的差值的平方和求一個平均值

sklearn回歸評估API

sklearn.metrics.mean_squared_error

mean_squared_error

mean_squared_error(y_true, y_pred)

  • 均方誤差回歸損失
  • y_true:真實值
  • y_pred:預測值
  • return:浮點數結果

注:真實值,預測值為標準化之前的值

官方給我們的一些建議

正規方程與梯度下降的對比

梯度下降 正規方程
需要選擇學習率α 不需要
需要多次迭代 一次運算得出
當特征數量n大時也能較好適用 需要計算(XTX)-1<br />如果特征數量n較大則運算代價大,因為矩陣逆的計算時間復雜度為O(n^3),通常來說當n小于10000時還是可以接受的
適用于各種類型的模型 只適用于線性模型,不適合邏輯回歸模型等其他模型

線性回歸器是最為簡單、易用的回歸模型。

從某種程度上限制了使用,盡管如此,在不知道特征之間關系的前提下,我們仍然使用線性回歸器作為大多數系統的首要選擇。

  • 小規模數據:LinearRegression(不能解決擬合問題)以及其它
  • 大規模數據:SGDRegressor

過擬合與欠擬合

問題:訓練數據訓練的很好啊,誤差也不大,為什么在測試集上面有問題呢?


分析圖1:

經過訓練后,知道了天鵝是有翅膀的,天鵝的嘴巴是長長的。簡單的認為有這些特征的都是天鵝。因為機器學習到的天鵝特征太少了,導致區分標準太粗糙,不能準確識別出天鵝。

分析圖2:

機器通過這些圖片來學習天鵝的特征,經過訓練后,知道了天鵝是有翅膀的,天鵝的嘴巴是長長的彎曲的,天鵝的脖子是長長的有點曲度,天鵝的整個體型像一個"2"且略大于鴨子。這時候機器已經基本能區別天鵝和其他動物了。然后,很不巧已有的天鵝圖片全是白天鵝的,于是機器經過學習后,會認為天鵝的羽毛都是白的,以后看到羽毛是黑的天鵝就會認為那不是天鵝。

過擬合與欠擬合

過擬合:一個假設在訓練數據上能夠獲得比其他假設更好的擬合, 但是在訓練數據外的數據集上卻不能很好地擬合數據,此時認為這個假設出現了過擬合的現象。(模型過于復雜)

欠擬合:一個假設在訓練數據上不能獲得更好的擬合, 但是在訓練數據外的數據集上也不能很好地擬合數據,此時認為這個假設出現了欠擬合的現象。(模型過于簡單)

對線性模型進行訓練學習會變成復雜模型

欠擬合原因以及解決辦法

  • 原因:學習到數據的特征過少
  • 解決辦法:增加數據的特征數量

過擬合原因以及解決辦法

  • 原因:原始特征過多,存在一些嘈雜特征, 模型過于復雜是因為模型嘗試去兼顧各個測試數據點,數據的特征和目標值之間不僅僅是線性關系

  • 解決辦法:

    • 進行特征選擇,消除關聯性大的特征(很難做)
    • 交叉驗證(讓所有數據都有過訓練)
    • 正則化

回憶一下特征選擇方法:

  • 過濾式:低方差特征
  • 嵌入式:正則化,決策樹,神經網絡

L2正則化

作用:可以使得W的每個元素都很小,都接近于0

優點:越小的參數說明模型越簡單,越簡單的模型則越不容易產生過擬合現象

線性回歸:LinearRegression 容易出現過擬合,為了把訓練接數據表現更好

L2正則化:Ridge:嶺回歸 帶有正則化的線性回歸 解決過擬合

嶺回歸

帶有正則化的線性回歸-Ridge

sklearn.linear_model.Ridge

Ridge

具有l2正則化的線性最小二乘法

  • sklearn.linear_model.Ridge(alpha=1.0)
    • alpha:正則化力度
    • coef_:回歸系數

觀察正則化程度的變化,對結果的影響

正則化力度越來越大,模型越來越簡單

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error


def mylinear():
    """
    線性回歸直接預測房子價格
    :return: None
    """
    # 獲取數據
    lb = load_boston()

    # 分割數據集到訓練集和測試集
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
    # 進行標準化處理(目標值要進行標準化處理)
    # 特征值和目標值都必須進行標準化處理, 實例化兩個標準化API
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)

    # 目標值
    std_y = StandardScaler()
    y_train = std_y.fit_transform(y_train.reshape(-1, 1))
    y_test = std_y.transform(y_test.reshape(-1, 1))

    # estimator預測
    # 嶺回歸去進行房價預測
    rd = Ridge(alpha=1.0)
    rd.fit(x_train, y_train)

    print(rd.coef_)

    # 預測測試集的房子價格
    y_rd_predict = std_y.inverse_transform(rd.predict(x_test))
    print("嶺回歸測試集里面每個房子的預測價格: ", y_rd_predict)
    print("嶺回歸的均方誤差: ", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict))


if __name__ == "__main__":
    mylinear()

線性回歸 LinearRegression與Ridge對比

嶺回歸:回歸得到的回歸系數更符合實際,更可靠。另外,能讓估計參數的波動范圍變小,變的更穩定。在存在病態數據偏多的研究中有較大的實用價值。

模型的保存與加載

import joblib

保存:joblib.dump(rf, 'test.pkl')

加載:estimator = joblib.load('test.pkl')

注:文件格式pkl

分類算法-邏輯回歸

他叫邏輯回歸…可他是分類算法

邏輯回歸:線性回歸的式子作為邏輯回歸的輸入,適用于二分類場景,他也能得出概率值

  • 廣告點擊率
  • 判斷用戶的性別
  • 預測用戶是否會購買給定的商品類
  • 判斷一條評論是正面的還是負面的

邏輯回歸是解決二分類問題的利器

邏輯回歸

輸入:
h(w)= w_0+w_1 x_1+w_2 x_2+…= w^T x

sigmoid函數

邏輯回歸的輸入-sigmoid→分類

sigmodid函數會把值映射到[0, 1],也就是把我們的輸入值轉換成一個概率值

邏輯回歸公式

公式:
h_0(x)=g(\theta^Tx) = \frac{1}{1+e^{-\theta^Tx}}\\ g(z) = \frac{1}{1+e^{-z}}

輸出:[0,1]區間的概率值,默認0.5作為閥值

注:g(z)為sigmoid函數

邏輯回歸的損失函數、優化

與線性回歸原理相同,但由于是分類問題,損失函數不一樣,只能通過梯度下降求解

對數似然損失函數:
cost(h_\theta(x), y) = \begin{cases} -log(h_\theta(x)) & if ~y=1 \\ -log(1-h_\theta(x)) & if~y=0\end{cases} \to -logP(Y|X)

完整的損失函數:
cost(h_\theta(x), y) = \sum_{i=1}^m-y_ilog(h_\theta(x)) - (1 - y_i)log(1 - h_\theta(x))
cost損失的值越小,那么預測的類別準確度更高

損失函數:

  • 均方誤差:不存在多個局部最低點,只有一個最小值
  • 對數似然損失:多個局部最小值

對數似然損失求出來的不一定是總函數的最小值,目前還是一個解決不了的問題,但是我們可以采取一些方案去盡量改善:

  1. 多次隨機初始化,多次比較最小值結果
  2. 求解過程中,調整學習率

盡管沒有全局最低點,但是效果都是不錯的

sklearn邏輯回歸API

sklearn.linear_model.LogisticRegression

LogisticRegression

sklearn.linear_model.LogisticRegression(penalty=‘l2’, C = 1.0)

  • Logistic回歸分類器
  • coef_:回歸系數

LogisticRegression回歸案例

良/惡性乳腺癌腫瘤預測

原始數據的下載地址:

https://archive.ics.uci.edu/ml/machine-learning-databases/

數據描述

(1)699條樣本,共11列數據,第一列用語檢索的id,后9列分別是與腫瘤相關的醫學特征,最后一列表示腫瘤類型的數值。

(2)包含16個缺失值,用”?”標出。

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, classification_report
import joblib
import pandas as pd
import numpy as np
import ssl


def logistic():
    """
    邏輯回歸做二分類進行癌癥預測(根據細胞的屬性特征)
    :return: None
    """
    ssl._create_default_https_context = ssl._create_unverified_context
    # 構造列標簽名字
    column = ['Sample code number','Clump Thickness', 'Uniformity of Cell Size','Uniformity of Cell Shape','Marginal Adhesion', 'Single Epithelial Cell Size','Bare Nuclei','Bland Chromatin','Normal Nucleoli','Mitoses','Class']

    # 讀取數據
    data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data", names=column)

    print(data)

    # 缺失值進行處理
    data = data.replace(to_replace='?', value=np.nan)

    data = data.dropna()

    # 進行數據的分割
    x_train, x_test, y_train, y_test = train_test_split(data[column[1:10]], data[column[10]], test_size=0.25)

    # 進行標準化處理
    std = StandardScaler()

    x_train = std.fit_transform(x_train)
    x_test = std.transform(x_test)

    # 邏輯回歸預測
    lg = LogisticRegression(C=1.0)

    lg.fit(x_train, y_train)

    print(lg.coef_)

    y_predict = lg.predict(x_test)

    print("準確率:", lg.score(x_test, y_test))

    print("召回率:", classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "惡性"]))

    return None


if __name__ == "__main__":
    logistic()

運行結果

     Sample code number  Clump Thickness  ...  Mitoses  Class
0               1000025                5  ...        1      2
1               1002945                5  ...        1      2
2               1015425                3  ...        1      2
3               1016277                6  ...        1      2
4               1017023                4  ...        1      2
..                  ...              ...  ...      ...    ...
694              776715                3  ...        1      2
695              841769                2  ...        1      2
696              888820                5  ...        2      4
697              897471                4  ...        1      4
698              897471                4  ...        1      4

[699 rows x 11 columns]
[[1.30052154 0.14422948 0.87413413 1.00049744 0.13566855 1.20200872
  0.95905237 0.61479529 0.74051181]]
準確率: 0.9766081871345029
召回率:               precision    recall  f1-score   support

          良性       0.98      0.98      0.98       123
          惡性       0.96      0.96      0.96        48

    accuracy                           0.98       171
   macro avg       0.97      0.97      0.97       171
weighted avg       0.98      0.98      0.98       171

LogisticRegression總結

應用:廣告點擊率預測、電商購物搭配推薦

優點:適合需要得到一個分類概率的場景

缺點:當特征空間很大時,邏輯回歸的性能不是很好(看硬件能力)

生成模型和判別模型

先驗概率:從歷史的數據中總結出概率信息。

需要進行先驗概率的模型就是生成模型。

判別模型:k-近鄰,決策樹,隨機森林,神經網絡

生成模型:樸素貝葉斯,隱馬爾可夫模型

邏輯回歸 樸素貝葉斯
解決問題 二分類 多分類
應用場景 二分類需要概率的問題 文本分類
參數 正則化力度 沒有

得出的結果都有概率解釋

非監督學習

“物以類聚,人以群分”
  1. 隨機在數據當中抽取三個樣本,當作三個類別的中心點(k1, k2, k3)
  1. 計算其余的點分別到這三個中心店的距離,每一個樣本有三個距離(a, b, c),從中選出距離最近的一個點作為自己的標記形成三個族群。
  1. 分別計算這三個族群的平均值,把三個平均值與之前的三個舊中心點進行比較,如果相同:結束聚類。如果不相同:把這三個平均值當作新的中心點,重復第二步。

k-means步驟

  1. 隨機設置K個特征空間內的點作為初始的聚類中心
  2. 對于其他每個點計算到K個中心的距離,未知的點選擇最近的一個聚類中心點作為標記類別
  3. 接著對著標記的聚類中心之后,重新計算出每個聚類的新中心點(平均值)
  4. 如果計算得出的新中心點與原中心點一樣,那么結束,否則重新進行第二步過程

k-means API

sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)

  • k-means聚類
  • n_clusters:開始的聚類中心數量
  • init:初始化方法,默認為'k-means ++’
  • labels_:默認標記的類型,可以和真實值比較(不是值比較)

k-means對Instacart Market用戶聚類

  1. 降維之后的數據
  2. k-means聚類
  3. 聚類結果顯示
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_score

# 讀取四張表的數據
prior = pd.read_csv("./data/instacart/order_products__prior.csv")
products = pd.read_csv("./data/instacart/products.csv")
orders = pd.read_csv("./data/instacart/orders.csv")
aisles = pd.read_csv("./data/instacart/aisles.csv")

# 合并四張表到一張表  (用戶-物品類別)
_mg = pd.merge(prior, products, on=['product_id', 'product_id'])
_mg = pd.merge(_mg, orders, on=['order_id', 'order_id'])
mt = pd.merge(_mg, aisles, on=['aisle_id', 'aisle_id'])

print(mt.head(10))

# 交叉表(特殊的分組工具)
cross = pd.crosstab(mt['user_id'], mt['aisle'])
print(cross.head(10))

# 進行主成分分析
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross)

# 把樣本數量減少
x = data[:500]
print(x.shape)

# 假設用戶一共分為四個類別
km = KMeans(n_clusters=4)
km.fit(x)

predict = km.predict(x)
print(predict)

# 顯示聚類的結果
plt.figure(figsize=(10,10))

# 建立四個顏色的列表
colored = ['orange', 'green', 'blue', 'purple']
colr = [colored[i] for i in predict]
plt.scatter(x[:, 1], x[:, 20], color=colr)

plt.xlabel("1")
plt.ylabel("20")

plt.show()

# 評判聚類效果,輪廓系數
print(silhouette_score(x, predict))

運行結果

   order_id  product_id  ...  days_since_prior_order  aisle
0         2       33120  ...                     8.0   eggs
1        26       33120  ...                     7.0   eggs
2       120       33120  ...                    10.0   eggs
3       327       33120  ...                     8.0   eggs
4       390       33120  ...                     9.0   eggs
5       537       33120  ...                     3.0   eggs
6       582       33120  ...                    10.0   eggs
7       608       33120  ...                    12.0   eggs
8       623       33120  ...                     3.0   eggs
9       689       33120  ...                     3.0   eggs

[10 rows x 14 columns]
aisle    air fresheners candles  asian foods  ...  white wines  yogurt
user_id                                       ...                     
1                             0            0  ...            0       1
2                             0            3  ...            0      42
3                             0            0  ...            0       0
4                             0            0  ...            0       0
5                             0            2  ...            0       3
6                             0            0  ...            0       0
7                             0            0  ...            0       5
8                             0            1  ...            0       0
9                             0            0  ...            0      19
10                            0            1  ...            0       2

[10 rows x 134 columns]
(500, 27)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 2
 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 2 0 0 0
 2 0 0 0 0 0 0 0 0 0 0 2 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 0 0 0 2 0 0
 0 0 0 1 2 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 2 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 2 0 2 0 0 0 0 0 3 0 0 0 2 0 0 0 0 0 0 0 0
 1 0 0 0 2 0 0 0 0 2 2 2 0 2 0 0 0 0 0 0 2 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 2 0 0 0 0 0 0 0 3 2 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 3 0 0 0 0 0 0 0 2 0 1 0 0 0 2 0 0 0 0 0 0
 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 3 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 2 0 0 0 0 2 0 0 0 0
 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 3
 0 0 0 2 0 0 0 2 0 2 0 0 0 0 0 0 0 1 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2
 0 0 0 0 2 2 0 0 0 0 0 0 0 0 2 0 0 0 0]
0.6123125240469242

Kmeans性能評估指標

輪廓系數:

計算公式:sc_i = \frac{b_i - a_i}{max(b_i, a_i)}
注:對于每個點i 為已聚類數據中的樣本 ,b_i 為i 到其它族群的所有樣本的平均距離,a_i 為i 到本身簇的距離平均值

最終計算出所有的樣本點的輪廓系數平均值

如果sc_i 小于0,說明a_i 的平均距離大于最近的其他簇。聚類效果不好

如果sc_i 越大,說明a_i 的平均距離小于最近的其他簇。聚類效果好

輪廓系數的值是介于 [-1,1] ,越趨近于1代表內聚度和分離度都相對較優

對于每一個樣本 這里以藍1為例

  1. 計算藍1到自身類別的點距離的平均值a_i

  2. 計算藍1分別到紅色類別,綠色類別所有的點的距離,求出平均值b1, b2,取其中最小的值當做b_i

  3. 用公式計算藍1的輪廓系數[-1, 1]

極端情況:

b_i>>a_i: 1 完美

a_i>> b_i: -1 最差

Kmeans性能評估指標API

sklearn.metrics.silhouette_score(X, labels)

  • 計算所有樣本的平均輪廓系數
  • X:特征值
  • labels:被聚類標記的目標值

特點分析:采用迭代式算法,直觀易懂并且非常實用

缺點:容易收斂到局部最優解(多次聚類)
需要預先設定簇的數量(k-means++解決)

"日出于東,落于西。登高棄梯,未來可期。"
Macsen Chu

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容