分類算法的目標值是離散型的
如果目標值是連續型的值,就需要回歸算法
比如房價預測、銷售額預測、貸款額度預測等
回歸算法-線性回歸分析
舉個栗子
期末成績:0.7×考試成績+0.3×平時成績(各個特征跟某個值組合在一起去預測)
西瓜好壞:0.2×色澤+0.5×根蒂+0.3×敲聲(把回歸問題轉換為分類問題)
線性關系模型
一個通過屬性的線性組合來進行預測的函數:
線性回歸
定義:線性回歸通過一個或者多個自變量與因變量之間之間進行建模的回歸分析。其中特點為一個或多個稱為回歸系數的模型參數的線性組合
一元線性回歸:涉及到的變量只有一個
多元線性回歸:涉及到的變量兩個或兩個以上
通用公式:
其中w,x為矩陣:
屬性和權重的一種組合來預測結果
矩陣也是大多數算法的計算基礎
矩陣乘法:
(這線性代數我是記不住咯…)
預測結果與真實值是有一定的誤差
單變量:
多變量:
回歸算法是迭代的算法
損失函數(誤差大小)
- y_i為第i個訓練樣本的真實值
- h_w (x_i)為第i個訓練樣本特征值組合預測函數
總損失定義:
又稱最小二乘法
如何去求模型當中的W,使得損失最小?(目的是找到最小損失對應的W值)
最小二乘法之正規方程
求解:
??為特征值矩陣,??為目標值矩陣
缺點:當特征過于復雜,求解速度太慢
對于復雜的算法,不能使用正規方程求解(邏輯回歸等)
損失函數直觀圖(單變量舉例)
直接求解到最小值
最小二乘法之梯度下降
我們以單變量中的w0,w1為例子:
理解:沿著這個函數下降的方向找,最后就能找到山谷的最低點,然后更新W值
使用:面對訓練數據規模十分龐大的任務
sklearn線性回歸正規方程、梯度下降API
正規方程: sklearn.linear_model.LinearRegression
梯度下降: sklearn.linear_model.SGDRegressor
LinearRegression、SGDRegressor
普通最小二乘線性回歸
- sklearn.linear_model.LinearRegression()
- coef_:回歸系數
通過使用SGD最小化線性模型
- sklearn.linear_model.SGDRegressor( )
- coef_:回歸系數
波士頓房價數據案例分析流程
波士頓地區房價數據獲取
波士頓地區房價數據分割
訓練與測試數據標準化處理
使用最簡單的線性回歸模型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) 評價機制:
這個非常簡單,就是你的預測值和真實值之間的差值的平方和求一個平均值
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
分類算法-邏輯回歸
他叫邏輯回歸…可他是分類算法
邏輯回歸:線性回歸的式子作為邏輯回歸的輸入,適用于二分類場景,他也能得出概率值
- 廣告點擊率
- 判斷用戶的性別
- 預測用戶是否會購買給定的商品類
- 判斷一條評論是正面的還是負面的
邏輯回歸是解決二分類問題的利器
邏輯回歸
輸入:
sigmoid函數
邏輯回歸的輸入-sigmoid→分類
sigmodid函數會把值映射到[0, 1],也就是把我們的輸入值轉換成一個概率值
邏輯回歸公式
公式:
輸出:[0,1]區間的概率值,默認0.5作為閥值
注:g(z)為sigmoid函數
邏輯回歸的損失函數、優化
與線性回歸原理相同,但由于是分類問題,損失函數不一樣,只能通過梯度下降求解
對數似然損失函數:
完整的損失函數:
cost損失的值越小,那么預測的類別準確度更高
損失函數:
- 均方誤差:不存在多個局部最低點,只有一個最小值
- 對數似然損失:多個局部最小值
對數似然損失求出來的不一定是總函數的最小值,目前還是一個解決不了的問題,但是我們可以采取一些方案去盡量改善:
- 多次隨機初始化,多次比較最小值結果
- 求解過程中,調整學習率
盡管沒有全局最低點,但是效果都是不錯的
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-近鄰,決策樹,隨機森林,神經網絡
生成模型:樸素貝葉斯,隱馬爾可夫模型
邏輯回歸 | 樸素貝葉斯 | |
---|---|---|
解決問題 | 二分類 | 多分類 |
應用場景 | 二分類需要概率的問題 | 文本分類 |
參數 | 正則化力度 | 沒有 |
得出的結果都有概率解釋
非監督學習
- 隨機在數據當中抽取三個樣本,當作三個類別的中心點(k1, k2, k3)
- 計算其余的點分別到這三個中心店的距離,每一個樣本有三個距離(a, b, c),從中選出距離最近的一個點作為自己的標記形成三個族群。
- 分別計算這三個族群的平均值,把三個平均值與之前的三個舊中心點進行比較,如果相同:結束聚類。如果不相同:把這三個平均值當作新的中心點,重復第二步。
k-means步驟
- 隨機設置K個特征空間內的點作為初始的聚類中心
- 對于其他每個點計算到K個中心的距離,未知的點選擇最近的一個聚類中心點作為標記類別
- 接著對著標記的聚類中心之后,重新計算出每個聚類的新中心點(平均值)
- 如果計算得出的新中心點與原中心點一樣,那么結束,否則重新進行第二步過程
k-means API
sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)
- k-means聚類
- n_clusters:開始的聚類中心數量
- init:初始化方法,默認為'k-means ++’
- labels_:默認標記的類型,可以和真實值比較(不是值比較)
k-means對Instacart Market用戶聚類
- 降維之后的數據
- k-means聚類
- 聚類結果顯示
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性能評估指標
輪廓系數:
注:對于每個點i 為已聚類數據中的樣本 ,b_i 為i 到其它族群的所有樣本的平均距離,a_i 為i 到本身簇的距離平均值
最終計算出所有的樣本點的輪廓系數平均值
如果sc_i 小于0,說明a_i 的平均距離大于最近的其他簇。聚類效果不好
如果sc_i 越大,說明a_i 的平均距離小于最近的其他簇。聚類效果好
輪廓系數的值是介于 [-1,1] ,越趨近于1代表內聚度和分離度都相對較優
對于每一個樣本 這里以藍1為例
計算藍1到自身類別的點距離的平均值a_i
計算藍1分別到紅色類別,綠色類別所有的點的距離,求出平均值b1, b2,取其中最小的值當做b_i
用公式計算藍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