初入機器學習 —— k-近鄰算法預測手機壽命(一)

一、假設數(shù)據(jù)集

1、簡單介紹

昨天上午剛自學了機器學習的k-近鄰算法,下午一個親戚就來說買了一個手機保護殼,然后我就思考了下我自己壽命的問題,想著想著突然問自己為啥有人要手機保護殼?不還是為了手機使用壽命能更長點。。所以寫下了這個代碼,本代碼是在Anaconda最新版下的Jupyter Notebook下寫出來的,使用的電腦系統(tǒng)為Windows 10專業(yè)版。

2、數(shù)據(jù)準備及自定義各個參考指標

由于沒有找到手機壽命方面的數(shù)據(jù)集,所以我就假設一個數(shù)據(jù)集出來,假設一部手機最高壽命為10年,數(shù)字“1”代表壽命長,數(shù)字“0”代表壽命短,并定義小于5年為短壽命,除外都是長壽命。
內容如下:

每天玩手機的時間(小時) 點擊頻率(大于0且小于1) 壽命(年)
3 0.87 1
0.5 0.9 1
5 0.258 1
6.5 0.52 1
7 0.36 0
10 0.45 1
14 0.13 0
18 0.67 0
20 0.89 0
24 0.77 0

利用 k-近鄰算法 預測手機壽命(數(shù)據(jù)純屬瞎編,請勿輕信)


二、算法實現(xiàn)及其他

創(chuàng)建好訓練數(shù)據(jù)集和測試數(shù)據(jù)及作圖

# 導入第三方庫
import numpy as np
from math import sqrt
import matplotlib.pyplot as plt
from collections import Counter
# 原始數(shù)據(jù)
X_original_train = [[3, 0.87],
                    [0.5, 0.9],
                    [5, 0.258],
                    [6.5, 0.52],
                    [7, 0.36],
                    [10, 0.45],
                    [14, 0.13],
                    [18, 0.67],
                    [20, 0.89],
                    [24, 0.77]]
Y_original_train = [1, 1, 1, 1, 0, 1, 0, 0, 0, 0]
# 轉換成可以操作的科學計算中的數(shù)組
X_train = np.array(X_original_train)
Y_train = np.array(Y_original_train)
X_train

輸出結果:
array([[ 3. , 0.87 ],
[ 0.5 , 0.9 ],
[ 5. , 0.258],
[ 6.5 , 0.52 ],
[ 7. , 0.36 ],
[10. , 0.45 ],
[14. , 0.13 ],
[18. , 0.67 ],
[20. , 0.89 ],
[24. , 0.77 ]])

Y_train

輸出結果:
array([1, 1, 1, 1, 0, 1, 0, 0, 0, 0])

# 畫原始數(shù)據(jù)的散點圖
plt.scatter(X_train[Y_train == 0, 0], X_train[Y_train == 0, 1], color = 'g')
plt.scatter(X_train[Y_train == 1, 0], X_train[Y_train == 1, 1], color = 'r')
plt.show()

輸出結果:


原始數(shù)據(jù)散點圖

假設一部手機每天被蹂躪11個小時且在被蹂躪的期間點擊率為0.5,預測此手機使用壽命的長短

# 創(chuàng)建測試數(shù)據(jù)且作包含測試數(shù)據(jù)點的散點圖
X_test = np.array([11, 0.5])
plt.scatter(X_train[Y_train == 0, 0], X_train[Y_train == 0, 1], color = 'g')
plt.scatter(X_train[Y_train == 1, 0], X_train[Y_train == 1, 1], color = 'r')
plt.scatter(X_test[0], X_test[1], color = 'b') # 測試數(shù)據(jù)的坐標點顏色為藍色
plt.show()

輸出結果:


包含測試數(shù)據(jù)的散點圖
# 計算每個點與測試坐標點的距離
distances = [] # 用來存儲每個點與測試點的距離
for x_train in X_train:
distance = sqrt(sum(((x_train - X_test) ** 2)))
distances.append(distance)
distances

輸出結果
[8.008551679298822,
10.507616285342742,
6.004878350141658,
4.500044444224968,
4.002449250146715,
1.0012492197250393,
3.022730553655089,
7.002063981427191,
9.008446036914469,
13.002803543851611]

# 對距離進行排序,找出最近的五個點(這里不一定非要找五個點,也可以找三個點或者其他個數(shù)的點,但不能超過數(shù)據(jù)集的大?。?point_sort = np.argsort(distances)
k = 5 # 這里設置為最近的五個點
near_point = [Y_train[i] for i in point_sort[:k]]
near_point

輸出結果:
[1, 0, 0, 1, 1]

# 找到出現(xiàn)次數(shù)最多的那個點
More_point = Counter(near_point)
More_point.most_common(1)[0][0]

輸出結果:
1


三、總結

至此,k-近鄰算法給出了我們答案,對于一天玩11個小時,玩期間屏幕點擊率為0.5的玩法,手機的使用壽命很長。目前的這個算法所使用的數(shù)據(jù)由于是自己胡編亂造的,所以并不合理,其實第一列玩手機的時間這個數(shù)據(jù)的值用個均值方差歸一化會更好,后面再改算了。

作者:無聊的SEVEN

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容