Beri tahu saya jika anda mendapati ini berharga dan saya akan teruskan!
Salah satu konsep yang paling ringkas lagi berkuasa ialah model linear.
Dalam ML, salah satu matlamat utama kami adalah untuk membuat ramalan berdasarkan data. Model linear adalah seperti "Hello World" pembelajaran mesin - ia mudah tetapi membentuk asas untuk memahami model yang lebih kompleks.
Jom bina model untuk meramal harga rumah. Dalam contoh ini, output ialah "harga rumah" yang dijangkakan dan input anda adalah seperti "sqft", "num_bedrooms", dll...
def prediction(sqft, num_bedrooms, num_baths): weight_1, weight_2, weight_3 = .0, .0, .0 home_price = weight_1*sqft, weight_2*num_bedrooms, weight_3*num_baths return home_price
Anda akan melihat "berat" untuk setiap input. Berat inilah yang mencipta keajaiban di sebalik ramalan. Contoh ini membosankan kerana ia akan sentiasa mengeluarkan sifar kerana pemberat adalah sifar.
Jadi mari kita temui bagaimana kita boleh mencari pemberat ini.
Proses untuk mencari pemberat dipanggil "melatih" model.
data = [ {"sqft": 1000, "bedrooms": 2, "baths": 1, "price": 200000}, {"sqft": 1500, "bedrooms": 3, "baths": 2, "price": 300000}, # ... more data points ... ]
home_price = prediction(1000, 2, 1) # our weights are currently zero, so this is zero actual_value = 200000 error = home_price - actual_value # 0 - 200000 we are way off. # let's square this value so we aren't dealing with negatives error = home_price**2
Sekarang kami mempunyai cara untuk mengetahui sejauh mana (ralat) kami untuk satu titik data, kami boleh mengira ralat purata merentas semua titik data. Ini biasanya dirujuk sebagai ralat kuasa dua min.
Kita boleh, sudah tentu, memilih nombor rawak dan terus menyimpan nilai terbaik semasa kita pergi- tetapi itu tidak cekap. Jadi mari kita teroka kaedah yang berbeza: keturunan kecerunan.
Keturunan kecerunan ialah algoritma pengoptimuman yang digunakan untuk mencari pemberat terbaik untuk model kami.
Kecerunan ialah vektor yang memberitahu kita cara ralat berubah semasa kita membuat perubahan kecil pada setiap berat.
Gerak hati bar sisi
Bayangkan berdiri di atas landskap berbukit, dan matlamat anda adalah untuk mencapai titik terendah (ralat minimum). Kecerunan adalah seperti kompas yang sentiasa menunjukkan kepada pendakian yang paling curam. Dengan melawan arah kecerunan, kami mengorak langkah ke arah titik terendah.
Begini cara ia berfungsi:
Bagaimanakah kita mengira kecerunan untuk setiap ralat?
Salah satu cara untuk mengira kecerunan adalah dengan membuat perubahan kecil dalam berat, lihat bagaimana ia memberi kesan kepada ralat kami dan lihat ke mana kami harus bergerak dari situ.
def calculate_gradient(weight, data, feature_index, step_size=1e-5): original_error = calculate_mean_squared_error(weight, data) # Slightly increase the weight weight[feature_index] += step_size new_error = calculate_mean_squared_error(weight, data) # Calculate the slope gradient = (new_error - original_error) / step_size # Reset the weight weight[feature_index] -= step_size return gradient
Pecahan Langkah demi Langkah
Parameter Input:
Kira Ralat Asal:
original_error = calculate_mean_squared_error(weight, data)
Kami mula-mula mengira ralat min kuasa dua dengan pemberat semasa kami. Ini memberi kita titik permulaan.
weight[feature_index] += step_size
Kami menambah berat dengan jumlah yang kecil (step_size). Ini membolehkan kami melihat bagaimana perubahan kecil dalam berat mempengaruhi kesilapan kami.
new_error = calculate_mean_squared_error(weight, data)
Kami mengira ralat kuasa dua min sekali lagi dengan berat meningkat sedikit.
gradient = (new_error - original_error) / step_size
Ini adalah langkah utama. Kami bertanya: "Berapa banyak ralat berubah apabila kami meningkatkan sedikit berat?"
Magnitud memberitahu kita betapa sensitifnya ralat terhadap perubahan berat ini.
weight[feature_index] -= step_size
Kami meletakkan berat semula kepada nilai asalnya kerana kami menguji perkara yang akan berlaku jika kami menukarnya.
return gradient
Kami mengembalikan kecerunan yang dikira untuk berat ini.
This is called "numerical gradient calculation" or "finite difference method". We're approximating the gradient instead of calculating it analytically.
Now that we have our gradients, we can push our weights in the opposite direction of the gradient by subtracting the gradient.
weights[i] -= gradients[i]
If our gradient is too large, we could easily overshoot our minimum by updating our weight too much. To fix this, we can multiply the gradient by some small number:
learning_rate = 0.00001 weights[i] -= learning_rate*gradients[i]
And so here is how we do it for all of the weights:
def gradient_descent(data, learning_rate=0.00001, num_iterations=1000): weights = [0, 0, 0] # Start with zero weights for _ in range(num_iterations): gradients = [ calculate_gradient(weights, data, 0), # sqft calculate_gradient(weights, data, 1), # bedrooms calculate_gradient(weights, data, 2) # bathrooms ] # Update each weight for i in range(3): weights[i] -= learning_rate * gradients[i] if _ % 100 == 0: error = calculate_mean_squared_error(weights, data) print(f"Iteration {_}, Error: {error}, Weights: {weights}") return weights
Finally, we have our weights!
Once we have our trained weights, we can use them to interpret our model:
For example, if our trained weights are [100, 10000, 15000], it means:
Linear models, despite their simplicity, are powerful tools in machine learning. They provide a foundation for understanding more complex algorithms and offer interpretable insights into real-world problems.
Atas ialah kandungan terperinci Pembelajaran Mesin untuk Jurutera Perisian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!