欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)激活碼778899分享:算法 【機(jī)器學(xué)習(xí)】聚類

柚子快報(bào)激活碼778899分享:算法 【機(jī)器學(xué)習(xí)】聚類

http://yzkb.51969.com/

文章目錄

前言一、K-means簡(jiǎn)介二、算法實(shí)現(xiàn)三、參數(shù)四、實(shí)戰(zhàn)案例1.手機(jī)分類2.圖像分割

五、kmeans半監(jiān)督學(xué)習(xí)實(shí)現(xiàn)總結(jié)

前言

本文將對(duì)kmeans介紹,算法理解,基礎(chǔ)操作,手機(jī)分類模型,圖像切割,半監(jiān)督算法等實(shí)戰(zhàn)案例去學(xué)習(xí)kmeans算法

一、K-means簡(jiǎn)介

K均值聚類(k-means clustering)是一種常見的無監(jiān)督機(jī)器學(xué)習(xí)算法,可用于將數(shù)據(jù)集劃分為多個(gè)不同的聚類。該算法的基本思想是:將數(shù)據(jù)集分成k個(gè)簇(cluster),每個(gè)簇的中心點(diǎn)是簇中所有點(diǎn)的均值。通過迭代的方式不斷優(yōu)化每個(gè)簇的中心點(diǎn),使得同一簇內(nèi)的點(diǎn)距離中心點(diǎn)最小,不同簇之間的距離最大。

二、算法實(shí)現(xiàn)

K均值聚類算法是一種基礎(chǔ)的聚類算法。其基本思想是將n個(gè)樣本分為k個(gè)簇,通過最小化每個(gè)簇內(nèi)樣本與簇中心的距離來優(yōu)化簇內(nèi)的樣本分布。該算法的數(shù)學(xué)實(shí)現(xiàn)基于迭代的思想,包括以下幾個(gè)步驟:

初始化:隨機(jī)選擇k個(gè)點(diǎn)作為中心點(diǎn)。分配:對(duì)于每個(gè)樣本點(diǎn),計(jì)算其與k個(gè)中心點(diǎn)的距離,將其分配到距離最近的中心點(diǎn)所在的簇中。更新:對(duì)于每個(gè)簇,重新計(jì)算其中心點(diǎn)的坐標(biāo)。重復(fù)執(zhí)行步驟2和3,直到收斂或者達(dá)到預(yù)定的迭代次數(shù)。

三、參數(shù)

在開始案例之前,我們先認(rèn)識(shí)幾個(gè)參數(shù),方便我們學(xué)習(xí)

from sklearn.cluster import KMeans

KMeans初始化參數(shù):

n_clusters:指定聚類的個(gè)數(shù),即將數(shù)據(jù)分成幾個(gè)簇。通常需要根據(jù)實(shí)際問題和數(shù)據(jù)特點(diǎn)來確定簇的個(gè)數(shù),可以通過經(jīng)驗(yàn)、調(diào)參和可視化等方式來確定。默認(rèn)值為8。init:指定簇中心點(diǎn)的初始化方式??梢赃x擇k-means++(默認(rèn)值)、random或者自定義。k-means++會(huì)優(yōu)先選擇離已有中心點(diǎn)距離較遠(yuǎn)的點(diǎn)作為新中心點(diǎn),可以加速算法收斂。random是隨機(jī)選擇初始中心點(diǎn),速度快但效果可能較差。自定義需要用戶手動(dòng)指定初始中心點(diǎn)。n_init:指定算法運(yùn)行的次數(shù),即從不同的初始中心點(diǎn)開始運(yùn)行算法,選擇最優(yōu)的一組簇。默認(rèn)值為10。max_iter:指定算法的最大迭代次數(shù)。默認(rèn)值為300。tol:指定算法的收斂閾值。當(dāng)兩次迭代的簇中心點(diǎn)之間的距離小于閾值時(shí),認(rèn)為算法已經(jīng)收斂,可以停止迭代。默認(rèn)值為1e-4。random_state:指定隨機(jī)數(shù)生成器的種子,用于確定初始中心點(diǎn)的隨機(jī)選擇方式。默認(rèn)為None,表示使用默認(rèn)的隨機(jī)數(shù)生成器。

Kmeans常用的方法

cluster_centers_:表示每個(gè)簇的中心點(diǎn)。它是一個(gè)二維數(shù)組,每行表示一個(gè)簇的中心點(diǎn)坐標(biāo),其中行數(shù)等于聚類數(shù)目k。labels_:表示每個(gè)樣本點(diǎn)所屬的簇標(biāo)簽。它是一個(gè)一維數(shù)組,長(zhǎng)度等于輸入數(shù)據(jù)的樣本數(shù)目。labels_[i]表示第i個(gè)樣本點(diǎn)所屬的簇標(biāo)簽。transform(X):將數(shù)據(jù)X轉(zhuǎn)換為新的空間,新空間的每個(gè)維度表示該數(shù)據(jù)點(diǎn)到簇中心點(diǎn)的距離。它返回一個(gè)二維數(shù)組,每行表示一個(gè)樣本點(diǎn)到各個(gè)簇中心點(diǎn)的距離,其中行數(shù)等于輸入數(shù)據(jù)的樣本數(shù)目。inertia_:表示聚類的誤差平方和(SSE,Sum of Squared Errors)。它是一個(gè)標(biāo)量,表示所有樣本點(diǎn)到其所屬簇中心點(diǎn)距離的平方和。inertia_越小,表示聚類效果越好。n_iter_:表示KMeans算法迭代的次數(shù)。score(X):返回?cái)?shù)據(jù)X的負(fù)的平均畸變程度,即數(shù)據(jù)到其最近的簇中心點(diǎn)的距離的平方和的相反數(shù)。越接近0表示聚類效果越好。

四、實(shí)戰(zhàn)案例

1.手機(jī)分類

該數(shù)據(jù)為不同手機(jī)品牌性能,價(jià)格,容量等特征值,我們?yōu)榱朔奖?,只取價(jià)格和性能這兩個(gè)特征值分類

數(shù)據(jù)提取處理

import pandas as pd

import numpy as np

dr=pd.read_csv('python.csv')

dr=pd.DataFrame(dr)

#將co_perf和price改為float類型

dr['co_perf'].astype('float')

dr['price'].astype('float')

#先去除重復(fù)多余數(shù)據(jù)

dr=dr.drop_duplicates(keep='first')

# print(df)

# df=df.drop('model',axis=1)

#判斷是否有無窮大的數(shù)

# print(np.isfinite(df).any)

"""檢測(cè)到有無窮大的值對(duì)其進(jìn)行處理"""

dr.replace(np.inf,0,inplace=True)

dr

數(shù)據(jù)觀察

import matplotlib.pyplot as plt

import matplotlib

# matplotlib.use('TkAgg')

from sklearn.datasets import make_blobs

from sklearn.cluster import KMeans

X=dr[['co_perf','price']].values.reshape(dr.shape[0],2)

X

plt.plot(X[:,0],X[:,1],'b.')

plt.show()

可以觀察這個(gè)數(shù)據(jù)大部分是在左下腳那一簇,大致可能分為3到4,這個(gè)后面我們可以通過實(shí)驗(yàn)觀察,到底 n_clusters為多少比較好,另外一個(gè)問題兩個(gè)特征值范圍差別比較大,我們標(biāo)準(zhǔn)化一下

from sklearn.preprocessing import StandardScaler

std=StandardScaler()

X=std.fit_transform(X)

不同n_clusters的模型訓(xùn)練 現(xiàn)在我們不確定可以選擇多少個(gè)簇,我們可以通過不同的嘗試,得到不同的score分?jǐn)?shù),看如何選擇一個(gè)較好的簇的數(shù)量

def plt_modal(modal,n_cluster):

#繪制簇中心

centiods=modal.cluster_centers_

plt.scatter(centiods[0],centiods[1],marker='X',c='red',linewidths=0.2)

labels=modal.labels_

plt.scatter(X[:,0],X[:,1],c=labels,s=4,alpha=0.3)

plt.title(f'n_cluster:{n_cluster}')

n_clusterses=(2,3,4,5,6,7,8,9,10)

modal_sorces=[]

for i,n_clusters in enumerate(n_clusterses):

modal=KMeans(n_clusters=n_clusters)

modal.fit(X)

plt.subplot(331+i)

plt_modal(modal,n_clusters)

modal_sorces.append(modal.score(X))

plt.show()

plt.plot(range(2,11),modal_sorces)

plt.show()

這個(gè)圖是不同簇?cái)?shù)量的分類情況

這個(gè)圖是不同簇類score方法的得分情況,KMeans模型的score方法返回?cái)?shù)據(jù)集X的平均畸變程度的相反數(shù)。畸變程度指的是每個(gè)樣本點(diǎn)到它所屬簇中心點(diǎn)的距離的平方。畸變程度越小,說明聚類效果越好。因此,score的值越接近0,說明聚類效果越好。 一般來說,我們?cè)谑褂肒Means聚類算法時(shí),會(huì)嘗試不同的聚類數(shù)目,然后選擇score最小的聚類數(shù)目。這是因?yàn)殡S著聚類數(shù)目的增加,模型可以更好地?cái)M合數(shù)據(jù),畸變程度也會(huì)逐漸降低。但當(dāng)聚類數(shù)目增加到一定程度時(shí),模型的擬合能力會(huì)降低,畸變程度也會(huì)開始增加,這時(shí)我們就需要在擬合能力和簡(jiǎn)潔性之間尋找平衡,選擇score最小的聚類數(shù)目作為最終模型的聚類數(shù)目。

如果單單從score看的話,可能會(huì)分成10以上的類別,但也不是越大越好,對(duì)于手機(jī)的分類,一般我們可以分成這樣4類

高價(jià)低配 低價(jià)高配 高價(jià)高配 低價(jià)低配

為此我們可以吧n_clusters=4去觀察情況

modal=KMeans(n_clusters=4,random_state=42)

modal.fit(X)

#%%

dr['label']=modal.labels_

centrids=modal.cluster_centers_

for i,centrid in enumerate(centrids):

plt.scatter(x=dr['co_perf'][dr.label==i],

y=dr['price'][dr.label==i]

,s=8,label=i)

# #

plt.xlabel('co_perf')

plt.ylabel('price')

plt.legend()

plt.show()

從圖中我們看到價(jià)格和性能能相匹配的還是占大部分,我們打印觀察一下

0類就是低價(jià)低配 1類就是高價(jià)低配 2類也有點(diǎn)低價(jià)低配或者高價(jià)高配的感覺,不好評(píng)估 3類就是妥妥的低價(jià)高配 可能數(shù)據(jù)來源問題,好像高價(jià)高配的沒有欸

觀察評(píng)估 我們主要觀察一下那些性價(jià)比比較高和一些高價(jià)低配的,我們先看一下性價(jià)比之光有哪些

print(dr['price'].describe())

print(dr['co_perf'].describe())

modalist=dr[['co_perf','price','model']][dr.label==3]

modalist

由于我沒用過這些手機(jī),不知道是否高價(jià)低配,但是如果從平均數(shù)據(jù)看,還是有點(diǎn)信服力。 我們?cè)倏纯锤邇r(jià)低配的有哪些

modalist=dr[['co_perf','price','model']][dr.label==1]

modalist

最后我們統(tǒng)計(jì)一下各類別的品牌數(shù)量

plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標(biāo)簽

plt.rcParams['axes.unicode_minus'] = False#用來正常顯示負(fù)號(hào)

def plt_show(X,y,i):

print(X)

print(y)

plt.pie(X,labels=y)

plt.title(f'{i}類別')

plt.subplots_adjust(left=0.01)#控制子圖間距

for i in range(4):

data=dr[dr['label']==i].brand.value_counts().to_dict()

plt.subplot(221+i)

plt_show(list(data.values()),list(data.keys()),i)

plt.show()

上面的結(jié)果由于數(shù)據(jù)來源以及性能評(píng)分來源未知,僅參考方法就行

2.圖像分割

K均值聚類算法可以將圖像中的像素點(diǎn)分為不同的簇,從而實(shí)現(xiàn)圖像分割

數(shù)據(jù)準(zhǔn)備 一張我在大觀樓拍的湖景照片

import numpy as np

import os

import matplotlib

matplotlib.use('TkAgg')

import matplotlib.pyplot as plt

from matplotlib.image import imread

plt.rcParams['axes.labelsize']=14

plt.rcParams['xtick.labelsize']=12

plt.rcParams['ytick.labelsize']=12

import warnings

warnings.filterwarnings('ignore')

np.random.seed(24)

#%%

image=imread('2.jpg')

plt.imshow(image,cmap=None)

plt.show()

查看shape

image.shape

(3000, 4000, 3)

表示(高度,寬度,顏色通道數(shù))

為了方便計(jì)算,我們需要重塑圖像將圖像轉(zhuǎn)換為一個(gè)NumPy數(shù)組,方便后面我們的機(jī)器學(xué)習(xí)

X=image.reshape(-1,3)

X.shape

但是發(fā)現(xiàn)圖片尺寸太大,這里我們需要對(duì)圖片進(jìn)行縮小,不然后面機(jī)器學(xué)習(xí)中運(yùn)行時(shí)間太長(zhǎng)(體驗(yàn)過)

from PIL import Image

image=Image.open('2.jpg')

width,heght=image.size

rate=0.1

image=image.resize((int(width*rate),int(heght*rate)))

plt.imshow(image,cmap=None)

plt.show()

image.size

image.save('new.png')

圖像處理 我們的圖像有多種顏色構(gòu)成的, kmeans聚類就是將有相關(guān)的的顏色區(qū)域分類

我們選擇顏色數(shù)量也可以說是簇?cái)?shù)量,進(jìn)行訓(xùn)練與可視化比較

(

256

,

128

,

64

,

32

,

16

,

8

,

4

,

2

)

(256,128,64,32,16,8,4,2)

(256,128,64,32,16,8,4,2)

from sklearn.cluster import KMeans

image=imread('./new.png')

X=image.reshape(-1,3)

n_colors=(256,128,64,32,16,8,4,2)

images_=[]

for colors in n_colors:

kmeans=KMeans(n_clusters=colors,random_state=42,init='random')

kmeans.fit(X)

segemented_img=kmeans.cluster_centers_[kmeans.labels_]

images_.append(segemented_img.reshape(image.shape))

plt.figure(figsize=(10,6))

plt.subplot(331)

plt.imshow(image)

plt.title('original image')

for idx,n_cluster in enumerate(images_):

plt.subplot(332+idx)

plt.imshow(images_[idx])

plt.title('{}cloros'.format(n_colors[idx]))

plt.show()

顏色數(shù)量從256到2,大家可以明顯看到還是切割的很成功。

五、kmeans半監(jiān)督學(xué)習(xí)實(shí)現(xiàn)

半監(jiān)督學(xué)習(xí)是指使用有標(biāo)簽和無標(biāo)簽的數(shù)據(jù)進(jìn)行學(xué)習(xí)的一種機(jī)器學(xué)習(xí)方法,常用于在數(shù)據(jù)集中標(biāo)記較少的情況下提高模型的準(zhǔn)確性。在kmeans聚類算法中,也可以使用半監(jiān)督學(xué)習(xí)的方法來提高聚類的準(zhǔn)確性也可以提高標(biāo)簽值值較少的數(shù)據(jù)模型訓(xùn)練準(zhǔn)確性。

一般的思路用法為

對(duì)未標(biāo)記的數(shù)據(jù)進(jìn)行聚類,得到每個(gè)數(shù)據(jù)點(diǎn)所屬的簇。選擇每個(gè)簇中最代表性的幾個(gè)樣本,手動(dòng)將其標(biāo)記。將這些標(biāo)記傳播到同一簇中的其他樣本,得到一個(gè)半標(biāo)記的數(shù)據(jù)集。使用半標(biāo)記的數(shù)據(jù)集來訓(xùn)練一個(gè)分類器,以進(jìn)行預(yù)測(cè)。

下面將會(huì)采用kmeans半監(jiān)督算法優(yōu)化邏輯回歸去實(shí)現(xiàn)下面的手寫數(shù)字集模型優(yōu)化案例

核心 通過kmeans分類將每個(gè)簇中距離最近的樣本的標(biāo)簽傳播到該簇的的部分樣本中,然后將這些傳播后的樣本作為有標(biāo)簽樣本,用于訓(xùn)練邏輯回歸分類器,提高模型準(zhǔn)確率,適用于標(biāo)簽值數(shù)量較少的模型中

導(dǎo)入模塊和加載數(shù)據(jù)集

from sklearn.cluster import k_means

from sklearn.datasets import load_digits

from sklearn.model_selection import train_test_split

from sklearn.linear_model import LogisticRegression

X,y=load_digits(return_X_y=True)

from sklearn.model_selection import train_test_split

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=42)

X_train.shape

我們先用沒有優(yōu)化的邏輯回歸的手寫數(shù)字集模型進(jìn)行訓(xùn)練分類與評(píng)估

lables=100

log_reg=LogisticRegression(random_state=42,multi_class='multinomial',solver='lbfgs')

log_reg.fit(X_train[:lables],y_train[:lables])

score=log_reg.score(X_test,y_test)

score

這是通過訓(xùn)練100個(gè)手寫數(shù)字集,模型得分為 然后使用kmeans聚類訓(xùn)練得到實(shí)例到簇中心的距離

k=100

kmeans=KMeans(n_clusters=k,random_state=42)

X_dit=kmeans.fit_transform(X=X_train)

對(duì)每個(gè)簇,找到距離簇中心最近的實(shí)例的索引。

import numpy as np

dit_index=np.argmin(X_dit,axis=0)

dit_index.shape

然后通過索引,找出在訓(xùn)練集中的位置,并可視化出來

X_rep_dits=X_train[dit_index]

X_rep_dits

#%%

import matplotlib.pyplot as plt

plt.figure(figsize=(8,4))

for index,X_rep_dit in enumerate(X_rep_dits):

plt.subplot(10,10,index+1)

plt.imshow(X_rep_dit.reshape(8,8),cmap='binary')

plt.axis('off')

plt.show()

這些就是100個(gè)離100個(gè)簇最近的實(shí)例數(shù)字 我們?nèi)缓鬄檫@些打上標(biāo)簽(因?yàn)檫@次的數(shù)據(jù)集有點(diǎn)特殊,我就偷下懶直接拿標(biāo)簽就行)

y_pre_dits=np.array(y_train[dit_index])

y_pre_dits

然后用這些代表性標(biāo)簽,再去訓(xùn)練

log_reg=LogisticRegression(multi_class='multinomial',solver='lbfgs',random_state=42)

log_reg.fit(X_rep_dits,y_pre_dits)

score=log_reg.score(X_test,y_test)

score

可以看到,模型得到了明顯的優(yōu)化

現(xiàn)在我們使用這些代表性數(shù)字的標(biāo)記來對(duì)數(shù)據(jù)進(jìn)行標(biāo)記傳播,這意味著將這些標(biāo)記分配給與它們最接近的數(shù)據(jù)點(diǎn)。通過這種方式,我們將大量未標(biāo)記的數(shù)據(jù)點(diǎn)轉(zhuǎn)化為部分標(biāo)記的數(shù)據(jù)。

y_train_propagated = np.empty(len(X_train), dtype=np.int32)

for i in range(k):

y_train_propagated[kmeans.labels_==i] = y_pre_dits[i]

log_reg = LogisticRegression(random_state=42)

log_reg.fit(X_train, y_train_propagated)

使用代表性數(shù)字的標(biāo)記來初始化一個(gè)大小為len(X_train)的數(shù)組,然后,我們使用K-Means聚類算法得到每個(gè)數(shù)據(jù)點(diǎn)所屬的簇,并將該簇的代表性數(shù)字的標(biāo)記分配給該簇中的所有數(shù)據(jù)點(diǎn)。

然后我們選擇范圍,這個(gè)范圍相當(dāng)重要,這里我們選擇26,代表與每個(gè)簇中與代表標(biāo)簽也就是簇中心距離的26%的其他標(biāo)簽

closet=26#選擇簇最近的26%樣本

X_clusrer_dist=X_dit[np.arange(len(X_train)),kmeans.labels_]

for i in range(k):

in_cluter=(kmeans.labels_==i)

clusetr_dist=X_clusrer_dist[in_cluter]

cotoff_distance=np.percentile(clusetr_dist,closet)#得到前26%

abover_citoff=(X_clusrer_dist>cotoff_distance)

X_clusrer_dist[in_cluter & abover_citoff]=-1

X_clusrer_dist數(shù)組計(jì)算每個(gè)訓(xùn)練樣本到所有聚類中心的距離,其中kmeans.labels_數(shù)組指示每個(gè)訓(xùn)練樣本屬于哪個(gè)聚類,對(duì)于每個(gè)聚類,找到它內(nèi)部樣本到聚類中心的距離的分位數(shù)。這里使用np.percentile()函數(shù)計(jì)算。然后,選擇距離當(dāng)前聚類中心最近的一定比例的樣本。這里選擇距離分位數(shù)之上的樣本,使用abover_citoff數(shù)組來標(biāo)記。最后,將距離分位數(shù)(26%)之上的樣本的距離設(shè)為-1,以便在下一個(gè)聚類中心被處理時(shí)忽略它們。

整個(gè)過程的目的是選擇距離聚類中心最近的一部分樣本,使它們成為代表該聚類的樣本。這些樣本將被用于標(biāo)記傳播算法,以幫助對(duì)未標(biāo)記的樣本進(jìn)行分類。在這里,closet被設(shè)置為26,這意味著每個(gè)聚類中最接近聚類中心的26%的樣本將被選擇為代表性樣本。

partially_propagated = (X_clusrer_dist != -1)

x_train_partially_propaged=X_train[partially_propagated]

y_train_partially_propaged=y_train[partially_propagated]

上述代碼中,我們把遠(yuǎn)離中心26%的數(shù)據(jù)設(shè)置為-1,然后得到索引,將前26%設(shè)置為代表樣本 標(biāo)簽

最后訓(xùn)練

log_reg = LogisticRegression(random_state=42)

log_reg.fit(x_train_partially_propaged,y_train_partially_propaged)

log_reg.score(X_test,y_test)

可見還是有部分的提高,范圍值可以自己設(shè)置,直到找到最優(yōu)的。

總結(jié)

Kmeans聚類算法在實(shí)際應(yīng)用中有著廣泛的應(yīng)用,例如:

市場(chǎng)細(xì)分:商家可以使用K均值聚類算法將顧客分為不同的簇,并為每個(gè)簇制定不同的營(yíng)銷策略; 圖像分割:K均值聚類算法可以將圖像中的像素點(diǎn)分為不同的簇,從而實(shí)現(xiàn)圖像分割; 自然語言處理:K均值聚類算法可以將文本分為不同的簇,從而實(shí)現(xiàn)文本聚類和主題分類。 半監(jiān)督學(xué)習(xí):允許我們?cè)跊]有足夠的標(biāo)記數(shù)據(jù)的情況下,利用未標(biāo)記數(shù)據(jù)來提高分類器或者模型的準(zhǔn)確性。

除了K均值聚類算法之外,還有一些其他的聚類算法,例如層次聚類、譜聚類,密度聚類等。在實(shí)際應(yīng)用中,需要根據(jù)數(shù)據(jù)集的特點(diǎn)和需求選擇合適的聚類算法。

kmeans算法雖然簡(jiǎn)單應(yīng)用廣泛有一定的缺點(diǎn),無法處理任意形狀的簇,所以在下一節(jié)我將介紹監(jiān)督算法中DBSCAN算法。

由于本人水平有限,上述有何錯(cuò)誤,歡迎指正 我會(huì)繼續(xù)學(xué)習(xí),推出更多有趣的東西

柚子快報(bào)激活碼778899分享:算法 【機(jī)器學(xué)習(xí)】聚類

http://yzkb.51969.com/

好文閱讀

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/18821160.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄