黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

機器學(xué)習(xí)(一)——K近鄰算法(python實現(xiàn))

系統(tǒng) 2250 0

一、K近鄰算法概念

            
              K近鄰(k-Nearest Neighbor,簡稱kNN)學(xué)習(xí)是一種或常用的監(jiān)督學(xué)習(xí)方法,其工作機制非常簡單:給定測試樣本,基于某種距離度量找出訓(xùn)練集中與其最靠近的k個訓(xùn)練樣本,然后基于這k個“鄰居”的信息來進行預(yù)測。通常,在分類任務(wù)中可使用“投票法”,即選擇這k個樣本中出現(xiàn)最多的類別標(biāo)記作為預(yù)測結(jié)果;在回歸任務(wù)中可使用“平均法”,即將這k個樣本的實質(zhì)輸出標(biāo)記的平均值作為預(yù)測結(jié)果;還可基于距離遠近進行加權(quán)平均或者加權(quán)投票,距離越近的樣本權(quán)重越大。
k近鄰沒有顯式的訓(xùn)練過程。事實上,它是“懶惰學(xué)習(xí)”的著名代表,此類學(xué)習(xí)技術(shù)在訓(xùn)練階段僅僅是把樣本保存起來,訓(xùn)練時間開銷為零,待收到測試樣本后再進行處理;相應(yīng)的,那些在訓(xùn)練階段就對樣本進行學(xué)習(xí)處理的方法,成為“急切學(xué)習(xí)”。

            
          

機器學(xué)習(xí)(一)——K近鄰算法(python實現(xiàn))_第1張圖片
圖1、為k近鄰分類器示意圖

圖1中有紅色三角和藍色方法兩種類別,我們現(xiàn)在需要判斷綠色圓點榆樹哪種類別
當(dāng)k=3時,綠色圓點屬于紅色三角這種類別;
當(dāng)k=5時,綠色圓點屬于藍色方塊這種類別。

下面給出兩個距離公式
第一個是歐幾里得距離(也就是我們經(jīng)常用到的)公式:
在這里插入圖片描述
擴展到n維空間:
在這里插入圖片描述
第二個是曼哈頓距離公式:
在這里插入圖片描述
擴展到n維空間:
在這里插入圖片描述
步驟:
(1)計算已知類別數(shù)據(jù)集中的點與當(dāng)前點之間的距離;
(2)按照距離遞增次序排序;
(3)選取與當(dāng)前點距離最小的k個點;
(4)確定前k個點所在類別的出現(xiàn)頻率;
(5)返回前k個點,出現(xiàn)頻率最高的類別作為當(dāng)前點的預(yù)測類別。

算法功能:分類(核心)、回歸
算法類型:有監(jiān)督學(xué)習(xí),懶惰學(xué)習(xí),距離模型
數(shù)據(jù)輸入:包含數(shù)據(jù)標(biāo)簽y,且特征空間中至少至少包含k個訓(xùn)練樣本(k>=1)特征空間 中各個特征的量綱需統(tǒng)一,若不統(tǒng)一則需要進行歸一化處理自定義的超參數(shù)k(k>=1)
模型輸出:在KNN分類中,輸出是標(biāo)簽中的某個類別
在KNN回歸中,輸出是對象的屬性值,該值是距離輸入的數(shù)據(jù)最近的K個訓(xùn)練 樣本標(biāo)簽的平均值。

二、python代碼的實現(xiàn)
1、電影的預(yù)測

            
              import pandas as pd
"""
函數(shù)功能:KNN分類器
參數(shù)說明:
    intX:需要預(yù)測的數(shù)據(jù)集
    dataSet:已知分類標(biāo)簽的數(shù)據(jù)集(訓(xùn)練集)
    k:k-近鄰算法參數(shù),選擇距離最小的k個點
返回:
    result:分類結(jié)果

"""

rowdata = {'電影名稱':['無問西東', '后來的我們','前任3', '紅海行動', '唐人街探案','戰(zhàn)狼2'],
      '打斗鏡頭':[1,5,12, 108,112,115],
      '接吻鏡頭':[101,89,97,5,9,8],
      '電影類型':['愛情片','愛情片','愛情片','動作片','動作片','動作片']}
movie_data = pd.DataFrame(rowdata)

new_data = [24, 67]


def classify0(intX,dataSet,k):
    result = []
    dist = list((((dataSet.iloc[:6, 0:2]-intX)**2).sum(1))**0.5)
    dist_l = pd.DataFrame({'dist': dist, 'labels': (dataSet.iloc[:, 3])})
    dr = dist_l.sort_values(by='dist')[: k]
    re = dr.loc[:, 'labels'].value_counts()
    result.append(re.index[0])
    return result


intX = new_data
dataSet = movie_data
k = 4
print(classify0(intX, dataSet, k))


            
          

2、K近鄰算法之約會網(wǎng)站配對效果判定
海倫-直使用在線約會網(wǎng)站尋找適合自己的約會對象,盡管約會網(wǎng)站會推薦不同的人選,但她并不是每一個都喜歡,經(jīng)過一番總結(jié),她發(fā)現(xiàn)曾經(jīng)交往的對象可以分為三類:

            
                ●不喜歡的人
  ●魅力一般的人
  ●極具魅力得人

            
          

海倫收集約會數(shù)據(jù)已經(jīng)有了-段時間,她把這些數(shù)據(jù)存放在文本文件datingTestSet.txt中,其中各字段分別為:

            
                1.每年飛行常客里程
  2.玩游戲視頻所占時間比
  3.每周消費冰淇淋公升數(shù)

            
          
            
              import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
#
daTingTest = pd.read_table('datingTestSet.txt', header=None)
"""
數(shù)據(jù)集表示
不喜歡的人
魅力一般的人
極具魅力的人
1.每年飛行常客里程
2.玩游戲視頻所占時間比
3.每周消費冰淇淋公升數(shù)
daTingTest.head()查看前五行數(shù)據(jù)
daTingTest.shape查看多少行多少列(1000, 4)
daTingTest.info()

              
                
RangeIndex: 1000 entries, 0 to 999
Data columns (total 4 columns):
0    1000 non-null int64
1    1000 non-null float64
2    1000 non-null float64
3    1000 non-null object
dtypes: float64(2), int64(1), object(1)
memory usage: 31.3+ KB
None
"""
#把不同標(biāo)簽用顏色區(qū)分

Color = []
for i in range(daTingTest.shape[0]):
    m = daTingTest.iloc[i, -1]
    if m == 'didntLike':
        Color.append('black')
    if m == 'smallDoses':
        Color.append('orange')
    if m == 'largeDoses':
        Color.append('red')

# 繪制兩兩特征之間的散點圖

plt.rcParams['font.sans-serif'] = ['Simhei']   #圖中字體設(shè)置為黑體
pl=plt.figure(figsize=(12,8))
fig1 = pl.add_subplot(221)
plt.scatter(daTingTest.iloc[:, 1], daTingTest.iloc[:, 2], marker='.', c=Color)
plt.xlabel('玩游戲視頻所占時間比')
plt.ylabel('每周消費冰淇淋公升數(shù)')
fig2 = pl.add_subplot(222)
plt.scatter(daTingTest.iloc[:, 0], daTingTest.iloc[:, 1], marker='.', c=Color)
plt.xlabel('每年飛行常客里程')
plt.ylabel('玩游戲視頻所占時間比')
fig3 = pl.add_subplot(223)
plt.scatter(daTingTest.iloc[:, 0], daTingTest.iloc[:, 2], marker='.', c=Color)
plt.xlabel('每年飛行常客里程')
plt.ylabel('每周消費冰淇淋公升數(shù)')
plt.show()

#數(shù)據(jù)歸一化
"""
函數(shù)功能:歸一化
參數(shù)說明:
    dataSet:原始數(shù)據(jù)集
返回:0-1標(biāo)準(zhǔn)化之后的數(shù)據(jù)集

"""


def minmax(dataSet):
    minof = dataSet.min()
    maxof = dataSet.max()
    normSet = (dataSet - minof)/(maxof - minof)
    return normSet


daTingT = pd.concat([minmax(daTingTest.iloc[:, :3]), daTingTest.iloc[:, 3]], axis=1)

#q切分訓(xùn)練集和測試集
"""
函數(shù)功能:切分訓(xùn)練集和測試集
參數(shù)說明:
dataSet:原始數(shù)據(jù)集
rate:訓(xùn)練集所占比例
返回:切分好的訓(xùn)練集和測試集
"""


def randSplit(dataSet,rate=0.9):
    n = dataSet.shape[0]
    m = int(n*rate)
    train = dataSet.iloc[:m, :]
    test = dataSet.iloc[m:, :]
    test.index = range(test.shape[0])
    return train, test


train, test = randSplit(daTingT)

#定義分類器的函數(shù)


def datingClass(train,test,k):
    n = train.shape[1]-1
    m = test.shape[0]
    result = []
    for i in range(m):
        dist = list((((train.iloc[:, :n]-test.iloc[i, :n])**2).sum(1))**0.5)
        dist_l = pd.DataFrame({'dist': dist, 'labels': (train.iloc[:, n])})
        dr = dist_l.sort_values(by='dist')[: k]
        re = dr.loc[:, 'labels'].value_counts()
        result.append(re.index[0])
    result = pd.Series(result)
    test['predict'] = result
    acc = (test.iloc[:, -1]== test.iloc[:, -2]).mean()
    print('模型預(yù)測準(zhǔn)確率為%.2f' % acc)

    return test


print(datingClass(train,test,5))

              
            
          

結(jié)果
機器學(xué)習(xí)(一)——K近鄰算法(python實現(xiàn))_第2張圖片

            
              模型預(yù)測準(zhǔn)確率為0.95

           0         1         2           3     predict
0   0.513766  0.170320  0.262181   didntLike   didntLike
1   0.089599  0.154426  0.785277  smallDoses  smallDoses
2   0.611167  0.172689  0.915245   didntLike   didntLike
3   0.012578  0.000000  0.195477  smallDoses  smallDoses
4   0.110241  0.187926  0.287082  smallDoses  smallDoses
5   0.812113  0.705201  0.681085   didntLike   didntLike
6   0.729712  0.490545  0.960202   didntLike   didntLike
7   0.130301  0.133239  0.926158  smallDoses  smallDoses
8   0.557755  0.722409  0.780811  largeDoses  largeDoses
9   0.437051  0.247835  0.131156  largeDoses   didntLike
10  0.722174  0.184918  0.074908   didntLike   didntLike
11  0.719578  0.167690  0.016377   didntLike   didntLike
12  0.690193  0.526749  0.251657   didntLike   didntLike
13  0.403745  0.182242  0.386039   didntLike   didntLike
14  0.401751  0.528543  0.222839  largeDoses  largeDoses
15  0.425931  0.421948  0.590885  largeDoses  largeDoses
16  0.294479  0.534140  0.871767  largeDoses  largeDoses
17  0.506678  0.550039  0.248375  largeDoses  largeDoses
18  0.139811  0.372772  0.086617  largeDoses  smallDoses
19  0.386555  0.485440  0.807905  largeDoses  largeDoses
20  0.748370  0.508872  0.408589   didntLike   didntLike
21  0.342511  0.461926  0.897321  largeDoses  largeDoses
22  0.380770  0.515810  0.774052  largeDoses  largeDoses
23  0.146900  0.134351  0.129138  smallDoses  smallDoses
24  0.332683  0.469709  0.818801  largeDoses  largeDoses
25  0.117329  0.067943  0.399234  smallDoses  smallDoses
26  0.266585  0.531719  0.476847  largeDoses  largeDoses
27  0.498691  0.640661  0.389745  largeDoses  largeDoses
28  0.067687  0.057949  0.493195  smallDoses  smallDoses
29  0.116562  0.074976  0.765075  smallDoses  smallDoses
..       ...       ...       ...         ...         ...
70  0.588465  0.580790  0.819148  largeDoses  largeDoses
71  0.705258  0.437379  0.515681   didntLike   didntLike
72  0.101772  0.462088  0.808077  smallDoses  smallDoses
73  0.664085  0.173051  0.169156   didntLike   didntLike
74  0.200914  0.250428  0.739211  smallDoses  smallDoses
75  0.250293  0.703453  0.886825  largeDoses  largeDoses
76  0.818161  0.690544  0.714136   didntLike   didntLike
77  0.374076  0.650571  0.214290  largeDoses  largeDoses
78  0.155062  0.150176  0.249725  smallDoses  smallDoses
79  0.102188  0.000000  0.070700  smallDoses  smallDoses
80  0.208068  0.021738  0.609152  smallDoses  smallDoses
81  0.100720  0.024394  0.008994  smallDoses  smallDoses
82  0.025035  0.184718  0.363083  smallDoses  smallDoses
83  0.104007  0.321426  0.331622  smallDoses  smallDoses
84  0.025977  0.205043  0.006732  smallDoses  smallDoses
85  0.152981  0.000000  0.847443  smallDoses  smallDoses
86  0.025188  0.178477  0.411431  smallDoses  smallDoses
87  0.057651  0.095729  0.813893  smallDoses  smallDoses
88  0.051045  0.119632  0.108045  smallDoses  smallDoses
89  0.192631  0.305083  0.516670  smallDoses  smallDoses
90  0.304033  0.408557  0.075279  largeDoses  largeDoses
91  0.108115  0.128827  0.254764  smallDoses  smallDoses
92  0.200859  0.188880  0.196029  smallDoses  smallDoses
93  0.041414  0.471152  0.193598  smallDoses  smallDoses
94  0.199292  0.098902  0.253058  smallDoses  smallDoses
95  0.122106  0.163037  0.372224  smallDoses  smallDoses
96  0.754287  0.476818  0.394621   didntLike   didntLike
97  0.291159  0.509103  0.510795  largeDoses  largeDoses
98  0.527111  0.436655  0.429005  largeDoses  largeDoses
99  0.479408  0.376809  0.785718  largeDoses  largeDoses

[100 rows x 5 columns]

            
          

更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論