無監(jiān)督學(xué)習(xí):利用無標(biāo)簽的數(shù)據(jù)學(xué)習(xí)數(shù)據(jù)的分布或數(shù)據(jù)與數(shù)據(jù)之間的關(guān)系土浸,常用于聚類、降維汇四。與有監(jiān)督學(xué)習(xí)最大區(qū)別在于數(shù)據(jù)是否有標(biāo)簽
1. 聚類
聚類(clustering):根據(jù)數(shù)據(jù)的相似性將數(shù)據(jù)分為多類的過程
聚類方法 | 加載模塊 | 聚類方法 | 加載模塊 |
---|---|---|---|
K-means | cluster.KMeans | AP聚類 | cluster.AffinityPropagation |
均值漂移 | cluster.MeanShift | 層次聚類 | cluster.AgglomerativeClustering |
BIRCH | cluster.Birch | 譜聚類 | cluster.SpectralClustering |
DBSCAN | cluster.DBSCAN |
2個樣本的相似性:計算2個樣本之間的距離
使用不同方法計算樣本間距離會關(guān)系到聚類結(jié)果的好壞
1.1 距離算法
歐氏距離:最常用的一種距離度量方法鬼店,源于歐式空間中2點的距離
曼哈頓距離:也稱“城市街區(qū)距離”,類似于在城市之中駕車行駛师骗,從一個十字路口到另外一個十字路口的距離
馬氏距離:數(shù)據(jù)的協(xié)方差距離历等,是一種尺度無關(guān)的度量方式,即會將樣本各個屬性標(biāo)準(zhǔn)化辟癌,再計算樣本間距離
夾角余弦:余弦相似度用向量空間中2個向量夾角余弦值作為衡量2個樣本樣差異大小寒屯。值越接近1,表明越相相似
1.2 sklearn.cluster模塊
sklearn庫提供常用的聚類算法函數(shù)包含在sklearn.cluster
模塊中
同樣數(shù)據(jù)黍少,不同算法寡夹,結(jié)果不同,耗時不同厂置,這些由算法特性決定
標(biāo)準(zhǔn)數(shù)據(jù)輸入格式:[樣本個數(shù)菩掏,特征個數(shù)]定義的矩陣形式
相似性矩陣輸入格式:由[樣本數(shù)目]定義的矩陣形式,矩陣中每一個元素為2個樣本的相似度昵济。如DBSCAN智绸、AffinityPropagation接受這種輸入。如果以余弦相似度為例访忿,則對角線的數(shù)值都為1瞧栗,其他每個元素取值范圍為[0,1]
算法 | 參數(shù) | 可擴展性 | 相似性度量 |
---|---|---|---|
K-means | 聚類個數(shù) | 大規(guī)模數(shù)據(jù) | 點間距離 |
DBSCAN | 鄰域大小 | 大規(guī)模數(shù)據(jù) | 點間距離 |
Gaussian Mixtures | 聚類個數(shù)及其他超參 | 復(fù)雜度高,不適合處理大規(guī)模數(shù)據(jù) | 馬氏距離 |
Birch | 分支因子海铆、閾值等其他超參 | 大規(guī)模數(shù)據(jù) | 歐氏距離 |
1.3 K-means方法
K-means算法:以k為參數(shù)迹恐,把n個對象分成k個簇,使簇內(nèi)具有較高的相似度卧斟,而簇間相似度較低
1.隨機選擇k個點作為初始的聚類中心
2.剩下的點系草,根據(jù)與中心的距離將其歸入最近的簇
3.對每個簇,計算所有點的均值作為新的聚類中心
4.重復(fù)2唆涝、3直到聚類中心不再發(fā)生變化
明日方舟掉落情況聚類
# 導(dǎo)入sklearn相關(guān)包
import numpy as np
from sklearn.cluster import KMeans
'''調(diào)試加載文件代碼'''
with open('111.txt') as fr:
# 逐行讀取找都,并存儲
contents = fr.readlines()
print(contents) # 【輸出結(jié)果】
# 存儲名字和數(shù)據(jù)
RetData = []
RetName = []
for content in contents:
print(content) # 扭轉(zhuǎn)醇 3 3 54【部分?jǐn)?shù)據(jù)】
# strip()刪除字符串前后空格;split()以空格為分隔符將字符串拆分成多個部分廊酣,并將這些存儲到一個列表中
a = content.strip().split()
print(a) # ['扭轉(zhuǎn)醇', '3', '3', '54']【部分?jǐn)?shù)據(jù)】
print(len(a)) # 4
RetName.append(a[0])
print(RetName) # ['扭轉(zhuǎn)醇']【部分?jǐn)?shù)據(jù)】
RetData.append([float(a[i]) for i in range(1, len(a))])
print(RetData) # [[3.0, 3.0, 54.0]]【部分?jǐn)?shù)據(jù)】
加載數(shù)據(jù)模塊能耻,被加載的文件數(shù)據(jù)格式如下:
關(guān)卡1 3 3 54 ······
關(guān)卡2 10 3.33 60 ······
······
def LoadData(FilePath):
'''加載數(shù)據(jù)文件'''
with open(FilePath) as fr:
contents = fr.readlines()
RetData = []
RetName = []
for content in contents:
a = content.strip().split()
RetName.append(a[0])
RetData.append([float(a[i]) for i in range(1, len(a))])
return RetName, RetData
# 調(diào)用
LoadData(r'C:\Users\Administrator\Desktop\111.txt') #【能成功打印數(shù)據(jù)】
調(diào)用K-means方法所需要參數(shù):
- n_clusters:用于指定聚類中心的個數(shù)
- init:初始聚類中心的初始化方法,默認(rèn)是k-means++
- max_iter:最大的迭代次數(shù),默認(rèn)是300
- data:加載的數(shù)據(jù)
- label:聚類后各數(shù)據(jù)所屬的標(biāo)簽
- fit_predict():計算簇中心以及為簇分配序號
if __name__ == '__main__':
'''Kmeans聚類算法'''
import numpy as np
from sklearn.cluster import KMeans
# 讀取數(shù)據(jù)晓猛,分別存儲到data和name中
name, data = LoadData(r'C:\Users\Administrator\Desktop\111.txt')
# 調(diào)用KMeans()和fit_predict()進(jìn)行聚類計算
km = KMeans(n_clusters=3)
label = km.fit_predict(data)
# expense:聚類中心點的數(shù)值加和
expenses = np.sum(km.cluster_centers_, axis = 1)
# 設(shè)定變量饿幅,接收關(guān)卡label的分簇
NameCluster = [[], [], []]
# 將關(guān)卡按照簇分別存儲
for i in range(len(name)):
NameCluster[label[i]].append(name[i])
# 將每個簇的聚類中心點的數(shù)值加和進(jìn)行輸出
for i in range(len(NameCluster)):
print('聚類中心點的數(shù)值加和: %.2f'% expenses[i])
print(NameCluster[i])
修改 km = KMeans(n_clusters=3)中的數(shù)值,可以分層不同簇
相應(yīng)的NameCluster = [[], [], []]需要改變
計算2條數(shù)據(jù)相似性是戒职,Sklearn的K-Means默認(rèn)用的是歐氏距離
1.4 DBSCAN方法
DBSCAN密度聚類栗恩,是一種基于面膜度的距離算法
- 不需要預(yù)先指定簇的個數(shù)
- 最終的簇個數(shù)不定
DBSCAN算法將數(shù)據(jù)分為3類:
- 核心點:在半徑Eps內(nèi)含有超過MinPts數(shù)目點
- 邊界點:在半徑Eps內(nèi)點的數(shù)量小于MinPts,但是落在核心點的鄰域 內(nèi)
-
噪音點:既不是核心點也不是邊界點的點
其核心點中鄰域內(nèi)的點是圖片中黃色的點洪燥,超過5個
DBSCAN算法流程
- 將所有點標(biāo)記為核心點磕秤、邊界點或噪音點
- 刪除噪聲點
- 為距離在Eps內(nèi)的所核心點之間賦予一條邊
- 每組連通的核心點形參一個簇
- 將每個邊界點指派到一個與之關(guān)聯(lián)的核心點的簇中
DBSCAN主要參數(shù):
-
eps
:2個樣本被看做鄰居點的最大距離 -
min_samples
:簇的樣本數(shù) -
metric
:距離的計算方式
import numpy as np
import sklearn.cluster as skc
from sklearn import metrics
import matplotlib.pyplot as plt
# 定義一個字典
mac2id=dict()
# 定義一個列表
onlinetimes=[]
f=open(r'E:\TDRDIS Book\編程\Python應(yīng)用\DBSCAN算法實例數(shù)據(jù)\DBSCAN.txt')
# 遍歷f,獲得mac地址捧韵,開始上網(wǎng)時間市咆,上網(wǎng)時長
for line in f:
# 定義一個變量,接收以逗號分隔的第3個數(shù)據(jù)(具體數(shù)據(jù)格式如下顯示)
mac=line.split(',')[2]
onlinetime=int(line.split(',')[6])
starttime=int(line.split(',')[4].split(' ')[1].split(':')[0])
if mac not in mac2id:
mac2id[mac]=len(onlinetimes)
onlinetimes.append((starttime,onlinetime))
else:
onlinetimes[mac2id[mac]]=[(starttime,onlinetime)]
real_X=np.array(onlinetimes).reshape((-1,2))
# 定義上網(wǎng)時間再来,用于聚類分析的變量蒙兰,
X=real_X[:,0:1]
# 開始上網(wǎng)時間聚類
db=skc.DBSCAN(eps=0.01,min_samples=20).fit(X)
# labels為每個數(shù)據(jù)的簇標(biāo)簽
labels = db.labels_
print('Labels:')
print(labels)
# -1為噪聲數(shù)據(jù),定義噪聲數(shù)據(jù)的比例
raito=len(labels[labels[:] == -1]) / len(labels)
print('Noise raito:',format(raito, '.2%'))
# 計算簇的個數(shù)
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
print('Estimated number of clusters: %d' % n_clusters_)
# 評價聚類效果
print("Silhouette Coefficient: %0.3f"% metrics.silhouette_score(X, labels))
# 打印各簇標(biāo)號芒篷,及其數(shù)據(jù)
for i in range(n_clusters_):
print('Cluster ',i,':')
print(list(X[labels == i].flatten()))
# 根據(jù)上網(wǎng)時間搜变,繪制直方圖
plt.hist(X,24)
數(shù)據(jù)格式如下:
2c929293466b97a6014754607e457d68,U201215025,A417314EEA7B,10.12.49.26,2014-07-20 22:44:18.540000000,2014-07-20 23:10:16.540000000,1558,15,本科生動態(tài)IP模版,100元每半年,internet
2c929293466b97a60147546099a57d81,U201116197,F0DEF1C78366,222.20.71.38,2014-07-20 12:14:21.380000000,2014-07-20 23:25:22.380000000,40261,1,本科生動態(tài)IP模版,20元每月,internet
······
# 以上網(wǎng)時長作為標(biāo)簽
# 將X和db改為如下代碼即可
X=np.log(1+real_X[:,1:])
db=skc.DBSCAN(eps=0.14,min_samples=10).fit(X)
輸出結(jié)果類似開始上網(wǎng)時間
如下圖所示,類似于這樣的原始數(shù)據(jù)分布式不能用于聚類的针炉,可以對數(shù)據(jù)進(jìn)行對數(shù)變幻(如上網(wǎng)時長聚類代碼)
2. 降維
在保證數(shù)據(jù)所具有的代表性或者分布的情況下挠他,將高緯數(shù)據(jù)轉(zhuǎn)化為低維數(shù)據(jù)的過程
可用于數(shù)據(jù)可視化、精簡數(shù)據(jù)
降維方法 | 加載模塊 | 降維方法 | 加載模塊 |
---|---|---|---|
主成分分析 | decomposition.PCA | 字典學(xué)習(xí) | decomposition.SparseCoder |
截斷SVD和LSA | decomposition.TruncatedSVD | 因子分析 | decomposition.FactorAnalysis |
非負(fù)矩陣分解 | decomposition.NMF | LDA | decomposition.LatentDirichletAllocation |
獨立成分分析 | decomposition.FastICA |
目前sklearn提供7種降維算法糊识,需要調(diào)用sklearn.decomposition
模塊
算法 | 參數(shù) | 可擴展性 | 適用任務(wù) |
---|---|---|---|
PCA | 所降維度及其他參數(shù) | 大規(guī)模數(shù)據(jù) | 信號處理等 |
FastICA | 所降維度及其他參數(shù) | 超大規(guī)模數(shù)據(jù) | 圖像圖形特征提取 |
NMF | 所降維度及其他參數(shù) | 大規(guī)模數(shù)據(jù) | 圖像圖形特征提取 |
LDA | 所降維度及其他參數(shù) | 大規(guī)模數(shù)據(jù) | 文本數(shù)據(jù)绩社、主題挖掘 |
2.1 PCA
主成分分析(PCA)通常用于高緯數(shù)據(jù)集的探索與可視化,還可以用作數(shù)據(jù)的壓縮和預(yù)處理
PCA可以把具有相關(guān)性的高緯變量合成線性無關(guān)的低維變量赂苗,稱為主成分愉耙。主成分能夠盡可能保留原始數(shù)據(jù)的信息
PCA原理:矩陣的主成分就是協(xié)方差矩陣對應(yīng)的特征向量,安裝對應(yīng)的特征值大小進(jìn)行排序拌滋,最大的特征值就是第一主成分朴沿,其次是第二主成分,以此類推
方差:各個樣本和樣本均值的差的平方和的均值败砂,用來度量一組數(shù)據(jù)的分散程度
協(xié)方差:用于度量2個變量之間的線性關(guān)系程度
矩陣特征向量:描述數(shù)據(jù)集結(jié)構(gòu)的非零向量
過程:
- 對所有樣本進(jìn)行中心化
- 計算樣本的協(xié)方差矩陣
- 對協(xié)方差矩陣做特征值分解
- 取最的d個大特征值所對應(yīng)的特征向量
輸出:投影矩陣
在sklearn庫中赌渣,使用sklearn.decomposition.PCA,加載PCA進(jìn)行降維昌犹,主要參數(shù)有:
-
n_components
:指定主成分的個數(shù)坚芜,即降維后數(shù)據(jù)的維度 -
svd_solver
:設(shè)置特征值分解的方法,默認(rèn)auto
斜姥,其他可選有full
,arpack
,randomized
實例:將鳶尾花數(shù)據(jù)(4維)的三類樣本鸿竖,使用PCA對數(shù)據(jù)進(jìn)行降維沧竟,實現(xiàn)在二維平面的可視化
# 加載數(shù)據(jù)可視化包
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
# 加載鳶尾花數(shù)據(jù)集
from sklearn.datasets import load_iris
# 調(diào)用載鳶尾花數(shù)據(jù)集,查看數(shù)據(jù),發(fā)現(xiàn)是字典型
data = load_iris()
# 用字典方法缚忧,把數(shù)據(jù)和標(biāo)簽分別調(diào)取出來
y = data['target']
X = data['data']
# 加載PCA算法悟泵,設(shè)定降成二維數(shù)據(jù)
pca = PCA(n_components=2)
# 對數(shù)據(jù)進(jìn)行降維,并保持到變量中
reduced_X = pca.fit_transform(X)
# 設(shè)定變量闪水,按類別對降維后的數(shù)據(jù)進(jìn)行保存
red_x, red_y = [], []
blue_x, blue_y = [], []
green_x, green_y = [], []
# 按照類別將降維后的數(shù)據(jù)保存在不同列表中
for i in range(len(reduced_X)):
if y[i] == 0:
red_x.append(reduced_X[i][0])
red_y.append(reduced_X[i][1])
elif y[i] == 1:
blue_x.append(reduced_X[i][0])
blue_y.append(reduced_X[i][1])
else:
green_x.append(reduced_X[i][0])
green_y.append(reduced_X[i][1])
# 數(shù)據(jù)可視化糕非,用散點圖表示
plt.scatter(red_x, red_y, c='r', marker='x')
plt.scatter(blue_x, blue_y, c='b', marker='D')
plt.scatter(green_x, green_y, c='g', marker='.')
plt.show()
因為類別是之前已經(jīng)分類好的,這里直接設(shè)定3類球榆,并按3類輸出
可以看出朽肥,降維后,數(shù)據(jù)仍能清晰的分成3類芜果。即降維后再聚類鞠呈,降低分類工作量融师,還能保證質(zhì)量
2.2 NMF
非負(fù)矩陣分解(NMF):在矩陣中所有元素均為非負(fù)數(shù)約束條件之下的矩陣分解方法
基本思想:給定一個非負(fù)矩陣V右钾,NMF能夠找到一個非負(fù)矩陣W和一個非負(fù)矩陣H,使得矩陣W和H的乘積近似等于矩陣V中的值
W矩陣:基礎(chǔ)圖像矩陣旱爆,相當(dāng)于從原矩陣V中抽出來的特征
H矩陣:系數(shù)矩陣
NMF:廣泛應(yīng)用于圖像分析舀射、文本挖掘、語言處理等
矩陣分解優(yōu)化目標(biāo):最小化H和W的乘積與原始矩陣的差
在sklearn庫中怀伦,使用sklearn.decomposition.NMF脆烟,加載NMF進(jìn)行降維,主要參數(shù)有:
-
n_components
:指定分解后矩陣的單個維度k房待,通過設(shè)定k大小邢羔,設(shè)置提取特征的數(shù)目 -
init
:W和H的初始化方式,默認(rèn)為nudsvdar
實例:Olivetti臉部圖像數(shù)據(jù)集桑孩。其中有400個人臉數(shù)據(jù)拜鹤,每個數(shù)據(jù)時64*64大小。使用NMF對400個人臉數(shù)據(jù)進(jìn)行特征提攘鹘贰(W矩陣)敏簿,并還原圖形
from numpy.random import RandomState
import matplotlib.pyplot as plt
# 用于創(chuàng)建隨機種子
from sklearn.datasets import fetch_olivetti_faces
from sklearn import decomposition
# 設(shè)置圖形展示時的排列情況,2行3列
n_row, n_col = 2, 3
# 設(shè)置提取的特征數(shù)目
n_components = n_row * n_col
# 設(shè)置人臉數(shù)據(jù)圖片大小
image_shape = (64, 64)
# 加載數(shù)據(jù),并打亂順序
dataset = fetch_olivetti_faces(shuffle=True, random_state=RandomState(0))
# 提取數(shù)據(jù)
faces = dataset.data
def plot_gallery(title, images, n_col=n_col, n_row=n_row):
# 創(chuàng)建圖片宣虾,并指明圖片大小
plt.figure(figsize=(2. * n_col, 2.26 * n_row))
# 設(shè)置標(biāo)題及字號大小
plt.suptitle(title, size=16)
for i, comp in enumerate(images):
# 選擇繪制的子圖
plt.subplot(n_row, n_col, i + 1)
vmax = max(comp.max(), -comp.min())
# 對數(shù)值歸一化惯裕,并以灰度圖顯示
plt.imshow(comp.reshape(image_shape), cmap=plt.cm.gray,
interpolation='nearest', vmin=-vmax, vmax=vmax)
# 去除子圖的坐標(biāo)軸標(biāo)簽
plt.xticks(())
plt.yticks(())
# 調(diào)整子圖的位置間隔
plt.subplots_adjust(0.01, 0.05, 0.99, 0.94, 0.04, 0.)
plot_gallery("First centered Olivetti faces", faces[:n_components])
# 對NMF和PCA進(jìn)行實例化,并存儲在一個列表中
estimators = [
('Eigenfaces - PCA using randomized SVD',
decomposition.PCA(n_components=6,whiten=True)),
('Non-negative components - NMF',
decomposition.NMF(n_components=6, init='nndsvda', tol=5e-3))
]
# 分別調(diào)用PCA和NMF
for name, estimator in estimators:
print("Extracting the top %d %s..." % (n_components, name))
print(faces.shape)
# 調(diào)用提取特征
estimator.fit(faces)
# 獲取提取特征
components_ = estimator.components_
# 按照固定格式進(jìn)行排序
plot_gallery(name, components_[:n_components])
# 可視化
plt.show()
3. 圖像分隔
圖像分隔:利用圖像的灰度绣硝、顏色蜻势、紋理、形狀等特征鹉胖,把圖像分成若干個互不重疊的區(qū)域握玛,并使這些特征在同一區(qū)域內(nèi)呈現(xiàn)相似性猜煮,在不同區(qū)域內(nèi)存在明顯差異。然后提取具有獨特性質(zhì)的區(qū)域用于不同研究
圖像分隔常用方法:
- 閾值分割:對圖像灰度進(jìn)行度量败许,設(shè)置不同類別的閾值王带,達(dá)到分隔目的
- 邊緣分隔:對圖像邊緣進(jìn)行檢測。即灰度值發(fā)生跳變的地方市殷,則魏一片區(qū)域的邊緣
- 直方圖法:對圖像的顏色建立直方圖愕撰,波峰波谷能夠表示一塊區(qū)域的顏色范圍,來達(dá)到分隔目的
- 特定理律:基于聚類分析醋寝、小波變換等理論完成分隔
實例描述:
- 目的:利用K-means算法對圖像像素點顏色進(jìn)行聚類搞挣,實現(xiàn)簡單的圖像分隔
- 輸出:同一聚類中的點使用相同顏色標(biāo)記
- 技術(shù)路線:sklearn.cluster.KMeans
import numpy as np
# 加載圖像處理包
import PIL.Image as image
from sklearn.cluster import KMeans
def loadData(filePath):
# 以二進(jìn)制形式打開文件
f = open(filePath,'rb')
data = []
# 以列表形式返回拖像素值,即獲得圖片像素數(shù)據(jù)
img = image.open(f)
# 獲得圖片的大小音羞。
m,n = img.size
# 將每個像素點RGB顏色處理到0-1
for i in range(m):
for j in range(n):
x,y,z = img.getpixel((i,j))
# 將像素點數(shù)據(jù)存儲在列表data中
data.append([x/256.0,y/256.0,z/256.0])
f.close()
# 以矩陣形式輸出data以圖片大小
return np.mat(data),m,n
# 調(diào)用函數(shù)囱桨,加載圖片
imgData,row,col = loadData(r'E:\TDRDIS Book\編程\Python應(yīng)用\pig\doctor.jpg')
# 設(shè)定聚類個數(shù),對數(shù)據(jù)進(jìn)行聚類嗅绰,結(jié)果存儲到變量中
label = KMeans(n_clusters=4).fit_predict(imgData)
# 還原聚類結(jié)果的維度信息
label = label.reshape([row,col])
# 創(chuàng)建一張新的灰度圖保存聚類后的結(jié)果
pic_new = image.new("L", (row, col))
# 根據(jù)所屬類別向圖片中添加灰度值
for i in range(row):
for j in range(col):
pic_new.putpixel((i,j), int(256/(label[i][j]+1)))
# 以JPEG格式保存圖像
pic_new.save(r'E:\TDRDIS Book\編程\Python應(yīng)用\pig\doctor_new.jpg', "JPEG")
目錄
Python機器學(xué)習(xí)應(yīng)用
一舍肠、Sklearn庫
二、無監(jiān)督學(xué)習(xí)
三窘面、有監(jiān)督學(xué)習(xí)