一、假設數(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

