Tải bản đầy đủ (.doc) (22 trang)

Ứng dụng kmean trong phân loại sản phẩm

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (479.99 KB, 22 trang )

BỘ CÔNG THƯƠNG
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI

KHOA CÔNG NGHỆ THÔNG TIN

BÀI TẬP LỚN
HỆ CHUYÊN GIA
Đề bài : Ứng dụng Kmean trong phân loại sản phẩm
Giáo viên hướng dẫn :
Lớp
:

Th.s Trần Thanh Hùng
KHMT2-K4

1


LỜI NÓI ĐẦU
Ngày nay không ai có thể phủ nhận vai trò cực kỳ quan trọng của máy tính trong
nghiên cứu khoa học kỹ thuật cũng như trong đời sống. Máy tính đã làm được những điều kỳ
diệu và giải được những vấn đề tưởng chừng nan giải. Càng ngày càng có nhiều người tự hỏi,
liệu máy tính có khả năng suy nghĩ như con người hay chưa? Chúng ta sẽ không trả lời câu
hỏi ấy. Thay vào đó, chúng ta sẽ nêu ra những khác biệt chủ yếu giữa cách làm việc của máy
tính và bộ óc con người.
Một máy tính, dù có mạnh đến đâu chăng nữa, đều phải làm việc theo một chương
trình chính xác đã được hoạch định trước bởi các chuyên gia. Bài toán càng phức tạp thì việc
lập trình càng công phu. Trong khi đó con người làm việc bằng cách học tập và rèn luyện, khi
làm việc con người có khả năng liên tưởng, kết nối sự việc này với sự việc khác, và quan
trọng hơn hết, họ có thể sáng tạo.
Ngày nay, các website giới thiệu, mua bán sản phẩm trực tuyến ngày càng nhiều trên


internet. Có rất nhiều hình thức giới thiệu sản phẩm tới khách hàng, nhưng làm sao để khi
khách hàng mua xong sản phẩm này mà lại có hứng thú để mua sản phẩm khác mới là vẫn đề
đặt ra với các trang web bán hàng trực tuyến. Những website thông minh như vậy sẽ có giá
thành rất cao và ít cửa hàng có thể bỏ tiền ra đầu tư.
Điều khó khăn của khả năng phân loại này là dữ liệu đầu vào phải được chuẩn hóa một
các chính xác đề chương trình có thể phân loại được sản phẩm vào đúng nhóm phù hợp.
Với một số phương pháp truyền thống, phân loại các nhóm sản phẩm dựa theo mã của
nhóm trong các sản phẩm. Với cách làm này, hoàn toàn phụ thuộc vào việc sắp đặt của người
nhập dữ liệu.
Việc sử dụng Kmean để phân cụm tự động cho các sản phẩm sẽ giúp cho việc phân
loại mềm dẻo hơn, dựa trên các tiêu chí của sản phẩm mà ta có thể phân loại sản phẩm này
thuộc các nhóm nào. Từ đó đưa ra những gợi ý cần thiết làm vừa lòng những vị khách hàng
khó tính nhất.

2


I. Một số phương pháp phân cụm dữ liệu điển hình
1. Phương pháp phân cụm phân hoạch
Ý tưởng chính của phương pháp này là phân một tập dữ liệu có n phần tử cho trước
thành k nhóm dữ liệu sao cho mỗi phần tử dữ liệu chỉ thuộc về một nhóm dữ liệu và mỗi
nhóm dữ liệu có tối thiểu một phần tử dữ liệu. Các thuật toán phân hoạch có độ phức tạp rất
lớn khi xác định nghiệm tối ưu toàn cục cho vấn đề PCDL, vì nó phải tìm kiếm tất cả các cách
phân hoạch có thể được. Chính vì vậy, trên thực tế người ta thường đi tìm giải pháp tối ưu cục
bộ cho vấn đề này bằng cách sử dụng một hàm tiêu chuẩn để đánh giá chất lượng của các cụm
cũng như để hướng dẫn cho quá trình tìm kiếm phân hoạch dữ liệu. Với chiến lược này, thông
thường người ta bắt đầu khải tạo một phân hoạch ban đầu cho tập dữ liệu theo phép ngẫu
nhiên hoặc theo heuristic và liên tục tinh chỉnh nó cho đến khi thu được một phân hoạch
mong muốn, thoả mãn các điều kiện ràng buộc cho trước. Các thuật toán phân cụm phân
hoạch cố gắng cải tiến tiêu chuẩn phân cụm bằng cách tính các giá trị độ đo tương tự giữa các

đối tượng dữ liệu và sắp xếp các giá trị này, sau đó thuật toán lựa chọn một giá trị trong dãy
sắp xếp sao cho hàm tiêu chuẩn đạt giá trị tối thiểu. Như vậy, ý tưởng chính của thuật toán
phân cụm phân hoạch tối ưu cục bộ là sử dụng chiến lược tham ăn để tìm kiếm nghiệm.
Lớp các thuật toán phân cụm phân hoạch bao gồm các thuật toán đề xuất đầu tiên
trong lĩnh vực KPDL cũng là các thuật toán được áp dụng nhiều trong thực tế. Sau đây là một
số thuật toán kinh điển áp dụng phương pháp phân hoạch được kế thừa sử dụng rộng rãi:
2. Thuật toán k-means
Thuật toán phân cụm phân hoạch k- means do MacQueen đề xuất trong lĩnh vực thống
kê năm 1967, mục đích của tuật toán k- means là sinh ra k cụm dữ liệu {C1, C2, …, Ck} từ một
tập dữ liệu ban đầu gồm n đối tượng trong không gian d chiều Xi=(xi1, xi2, …, xid), (i = 1, n) ,
k

2
sao cho hàm tiêu chuẩn: E = ∑ ∑ D ( x − mi ) đạt cực tiểu. Trong đó: mi là trọng tâm của
i =1 x∈Ci

cụm Ci, D là khoảng cách giữa hai đối tượng.
Trọng tâm của một cụm là một vector, trong đó giá trị của mỗi phần tử của nó là trung
bình cộng các thành phần tương ứng của các đối tượng vector dữ liệu trong cụm đang xét.
Tham số đầu vào của thuật toán là số cụm k, tập CSDL gồm n phần tử và tham số đầu ra của
thuật toán là các trọng tâm của cụm dữ liệu. Độ đo khoảng cách D giữa các đối tượng dữ liệu

3


thường được sử dụng là khoảng cách Euclide, bởi đây là mô hình khoảng cách dễ để lấy đạo
hàm và xác định các cực trị tối thiểu. Hàm tiêu chuẩn và độ đo khoảng cách có thể được xác
định cụ thể hơn tuỳ vào ứng dụng hoặc các quan điểm của người dùng. Thuật toán k- means
bao gồm các bước cơ bản sau:
INPUT: Một CSDL gồm n đối tượng và số cụm cần phân là k.

OUTPUT: Các cụm Ci (i=1... k) sao cho hàm tiêu chuẩn E đạt giá trị tối thiểu.
Thuật toán tiến hành 4 bước sau:
Bước 1: Khởi tạo
Chọn k đối tượng mj (j=1…k) là trọng tâm ban đầu của k cụm từ tập dữ liệu đầu vào
(việc lựa chọn này có thể ngẫu nhiên hoặc chọn theo kinh nghiệm chuyên gia).
Bước 2: Tính khoảng cách
Đối với mỗi đối tượng Xi (1 ≤ i ≤ n), tính khoảng cách của nó tới mỗi trọng tâm mj với
j=1,…,k, sau đó tìm trọng tâm gần nhất đối với mỗi đối tượng.
Bước 3: Cập nhật lại trong tâm
Đối với mỗi j=1,…,k, cập nhật trọng tâm cụm mj bằng cách xác định trung bình cộng
của các vector đối tượng dữ liệu.
Bước 4: Điều kiện dừng
Lặp lại bước 2 và bước b cho đến khi các trọng tâm của cụm không thay đổi.
Hình 2. .Thuật toán k-means
Thuật toán k-means được chứng minh là hội tụ và có độ phức tạp tính toán là:
O((n.k.d).τ.Τflop). Trong đó, n là số đối tượng dữ liệu, k là số cụm dữ liệu, d là số chiều của
vector đối tượng dữ liệu, τ là số vòng lặp, Τflop là thời gian để thực hiện để thực hiện một phép
tính cơ sở như phép cộng, trừ, nhân, chia,… Như vậy, do thuật toán k-means phân tích phân
cụm đơn giản nên có thể áp dụng đối với tập dữ liệu lớn. Tuy nhiên, nhược điểm của thuật
toán k-means là chỉ áp dụng với dữ liệu có thuộc tính số và khám phá ra các cụm có dạng hình
cầu, không những vậy mà thuật toán k-means rất nhậy cảm với nhiễu và các phần tử ngoại lai
trong dữ liệu. Hình sau diễn tả, mô phỏng về một số hình dạng cụm dữ liệu khám phá được
bởi thuật toán k-means:

4


Hình 2. .Hình dạng cụm dữ liệu được khám phá bởi thuật toán k-means
Hơn nữa, chất lượng PCDL của thuật toán k-means phụ thuộc nhiều vào các tham số
đầu vào như: số cụm k và k trọng tâm khởi tạo ban đầu. Trong trường hợp, các trọng tâm khởi

tạo ban đầu mà quá lệch so với các trọng tâm của cụm tự nhiên thì kết quả phân cụm của thuật
toán k-means là rất thấp, nghĩa là các cụm dữ liệu được khám phá rất lệch so với các cụm
trong thực tế. Trên thực tế người ta chưa có một giải pháp tối ưu nào để chọn các tham số đầu
vào, giải pháp thường được sử dụng nhất là thử nghiệm với các giá trị đầu vào k cụm dữ liệu
khác nhau rồi sau đó chọn giải pháp tốt nhất.
Đến nay, đã có rất nhiều thuật toán kế thừa tư tưởng của thuật toán k-means áp dụng
trong KPDL để giải quyết tập dữ liệu có kích thước rất lớn đang được áp dụng rất hiệu quả và
phổ biến như thuật toán PAM, CLARA, CLARANS, k-medoid, k-prototypes,…
II. Ứng dụng kmean trong phân cụm website
1. Giới thiệu
Ngày nay, các website giới thiệu, mua bán sản phẩm trực tuyến ngày càng nhiều trên
internet. Có rất nhiều hình thức giới thiệu sản phẩm tới khách hàng, nhưng làm sao để khi
khách hàng mua xong sản phẩm này mà lại có hứng thú để mua sản phẩm khác mới là vẫn đề
đặt ra với các trang web bán hàng trực tuyến. Những website thông minh như vậy sẽ có giá
thành rất cao và ít cửa hàng có thể bỏ tiền ra đầu tư.
Điều khó khăn của khả năng phân loại này là dữ liệu đầu vào phải được chuẩn hóa một
các chính xác đề chương trình có thể phân loại được sản phẩm vào đúng nhóm phù hợp.
Với một số phương pháp truyền thống, phân loại các nhóm sản phẩm dựa theo mã của
nhóm trong các sản phẩm. Với cách làm này, hoàn toàn phụ thuộc vào việc sắp đặt của người
nhập dữ liệu.
Việc sử dụng Kmean để phân cụm tự động cho các sản phẩm sẽ giúp cho việc phân
loại mềm dẻo hơn, dựa trên các tiêu chí của sản phẩm mà ta có thể phân loại sản phẩm này
thuộc các nhóm nào. Từ đó đưa ra những gợi ý cần thiết làm vừa lòng những vị khách hàng
khó tính nhất.
1.1.

Phát biểu bài toán

Cho một cơ sở dữ liệu có bảng chính là dữ liệu các sản phẩm. Các sản phẩm gồm số
lượng, giá, màu sắc, chất liệu, nhà sản xuất. Tất cả đều là khóa ngoại liên kết tới các bảng

khác.

5


Từ giả thiết, xây dựng ứng dụng phân chia số sản phẩm có trong csdl thành các nhóm
khác nhau sao cho các sản phẩm trong cùng một nhóm có tính chất giống nhau nhất.
Ý tưởng bài toán :
 Chọn ra n sản phẩm ngẫu nhiên làm trọng tâm để phân nhóm với n là số nhóm cần
phân
 Sử dụng Kmean để phân chia các sản phẩm vào các nhóm
 Tính lại trọng tâm của từng nhóm
 Phân chia lại nhóm
 Lặp lại cho đến khi trọng tâm bước trước bằng trọng tâm bước sau.
Các bước này đều được chương trình xử lý tự động. Mỗi khi thêm một sản phẩm mới,
chúng ta đã có dữ liệu trọng tâm của các nhóm. Ta sẽ so sánh sản phẩm mới này với các
trọng tâm và từ đó phân được vào đúng nhóm mà không cần phân nhóm lại cho toàn bộ
sản phẩm.
1.2.

1.2.1.

Các bước giải quyết giải quyết bài toán
Xây dựng tập dữ liệu là các sản phẩm

Người sử dụng sẽ vào quản trị của website và nhập dữ liệu từng sản phẩm. Trước tiên
cần nhập các bảng là bảng khóa ngoại của bảng sản phẩm như bảng màu sắc, kích cỡ, chất
liệu, nhà sản xuất…
Dữ liệu sẽ được nhập vào từng nhóm sao cho các nhóm, các tính chất của sản phẩm
được phân bổ rõ ràng giúp việc phân loại được thể hiện rõ nhất. Việc gợi ý mua cũng được rõ

ràng nhất.

6


Danh sách các sản phẩm sau khi nhập

Dữ liệu được lưu trong bảng sản phẩm
Đầu vào sẽ là danh sách các sản phẩm và 6 thuộc tính: Price, Quantity, Color,
Manufacturer, Size, Material. Các thuộc tính này đã được mã hóa bằng các con số đồng nhất
để dễ dàng cho việc tính toán với các công thức toán học.

7


Ta sẽ phân thành 4 nhóm, mỗi nhóm sẽ gồm các sản phẩm có tính chất tương tự nhau
nhất.

1.2.1.1. Sử dụng Kmean đề phân chia sản phẩm vào các nhóm
III. Cài đặt chương trình thử nghiệm
3.1.Source Code
3.1.1.Lớp Kmean.cs
using System.Data;
class KMean
{
public float [,] Center;//Tạo độ các trọng tâm cuối cùng
/// <summary>
/// Thuật toán phân cụm K-Mean
/// Trả về mảng 1 chiều, các phần tử trong mảng có giá trị bằng nhau sẽ cùng một cụm
/// </summary>

/// Số tập dữ liệu</param>
/// Số thuộc tính của dữ liệu</param>
/// Dữ liệu đầu vào</param>
/// Số cụm</param>
public int[] Execute(int n, int m, float[,] input, int numGroup)
{
if (numGroup > n) return null;
var oldCenter = new float[numGroup, m];
Center = new float[numGroup, m];
var result = new int[n];
for (int i = 0; i < n; i++)
{
result[i] = -1;
}
for (int i = 0; i < numGroup; i++)
{
result[i] = i;
for (int j = 0; j < m; j++)
{
oldCenter[i, j] = input[i, j];
}
}
//duyet
bool check = true;
var distance = new float[numGroup];
while (check)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < numGroup; j++)


8


{
distance[j] = 0;
for (int k = 0; k < m; k++)
{
distance[j] += (input[i, k] - oldCenter[j, k]) * (input[i, k] - oldCenter[j, k]);
}
}
float min = distance[0];
result[i] = 0;
for (int j = 1; j < numGroup; j++)
{
if (min > distance[j])
{
min = distance[j];
result[i] = j;
}
}
}
//tim toa do tam
float[,] newCenter = oldCenter;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
oldCenter[result[i], j] += input[i, j];
}

}
check = false;
for (int i = 0; i < numGroup; i++)
{
for (int j = 0; j < m; j++)
{
oldCenter[i, j] /= m;
if (newCenter[i, j] != oldCenter[i, j]) check = true;
}
}
Center = oldCenter;
}
return result;
}
public float[,] ConvertDataTable(DataTable dt,int startCol,int endCol)
{
var result = new float[dt.Rows.Count, endCol - startCol];
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = startCol; j < endCol; j++)
{
result[i, j - startCol] = float.Parse(dt.Rows[i][j].ToString());
}

9


}
return result;
}

}
3.1.2.Lớp SqlDataProvider.cs
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Security.Cryptography;
using System.Text;
public class SqlDataProvider
{
private static readonly string strConStr =
ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
#region DB Access Functions
private static SqlConnection con;
public static SqlConnection GetConnect()
{
if (con == null)
con = new SqlConnection(strConStr);
if (con.State == ConnectionState.Closed)
con.Open();
return con;
}
public static DataTable GetTable(SqlCommand cmd)
{
try
{
if (cmd.Connection != null)
{
using (var ds = new DataSet())
{

using (var da = new SqlDataAdapter())
{
da.SelectCommand = cmd;
da.Fill(ds);
return ds.Tables[0];
}
}
}
else
{

10


using (SqlConnection conn = GetConnect())
{
using (var ds = new DataSet())
{
using (var da = new SqlDataAdapter())
{
da.SelectCommand = cmd;
da.SelectCommand.Connection = conn;
da.Fill(ds);
return ds.Tables[0];
}
}
}
}
}
finally

{
}
}
public static SqlDataReader ExecuteReader(SqlCommand cmd)
{
try
{
if (cmd.Connection != null)
{
return cmd.ExecuteReader();
}
else
{
using (SqlConnection conn = GetConnect())
{
cmd.Connection = conn;
return cmd.ExecuteReader();
}
}
}
finally
{
}
}
public static DataSet GetDsData(SqlCommand cmd)
{
try
{
if (cmd.Connection != null)
{

using (var ds = new DataSet())

11


{
using (var da = new SqlDataAdapter())
{
da.SelectCommand = cmd;
da.Fill(ds);
return ds;
}
}
}
else
{
using (SqlConnection conn = GetConnect())
{
using (var ds = new DataSet())
{
using (var da = new SqlDataAdapter())
{
da.SelectCommand = cmd;
da.SelectCommand.Connection = conn;
da.Fill(ds);
return ds;
}
}
}
}

}
finally
{
}
}
public static DataTable GetTable(string sql)
{
SqlConnection conn = GetConnect();
var dt=new DataTable();
var ad = new SqlDataAdapter(sql, conn);
ad.Fill(dt);
return dt;
}
public static void ExeCuteNonquery(SqlCommand cmd)
{
try
{
SqlConnection conn = GetConnect();
cmd.Connection = conn;
cmd.ExecuteNonQuery();
}
finally
{

12


}
}
public static void ExeCuteNonquery(string sql)

{
try
{
SqlConnection conn = GetConnect();
var cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
}
finally
{
}
}
public static SqlDataReader ExecuteReader(string sql)
{
try
{
var cmd = new SqlCommand(sql, GetConnect());
return cmd.ExecuteReader();
}
finally
{
}
}
public static string ExecuteScalar(string sql)
{
try
{
SqlConnection conn = GetConnect();
var cmd = new SqlCommand(sql, conn);
return cmd.ExecuteScalar().ToString();
}

finally
{
}
}
public object ExecuteScalar(SqlCommand cmd)
{
try
{
SqlConnection conn = GetConnect();
cmd.Connection = conn;
return cmd.ExecuteScalar();
}
finally

13


{
}
}
public int DBSize()
{
using (var cmd = new SqlCommand("select sum(size) * 8 * 1024 from sysfiles"))
{
cmd.CommandType = CommandType.Text;
return (int) ExecuteScalar(cmd);
}
}
public bool CheckConnect()
{

var cmd = new SqlCommand("select getdate()");
if (GetTable(cmd).Rows.Count > 0)
return true;
return false;
}
public static string Encrypt(string toEncrypt, bool useHashing)
{
byte[] keyArray;
byte[] toEncryptArray = Encoding.UTF8.GetBytes(toEncrypt);
if (useHashing)
{
var hashmd5 = new MD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(Encoding.UTF8.GetBytes("THANHNV"));
}
else keyArray = Encoding.UTF8.GetBytes("THANHNV");
var tdes = new TripleDESCryptoServiceProvider
{
Key = keyArray,
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
ICryptoTransform cTransform = tdes.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0,
toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
public static string Decrypt(string toDecrypt, bool useHashing)
{
byte[] keyArray;
byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);

if (useHashing)
{
var hashmd5 = new MD5CryptoServiceProvider();

14


keyArray = hashmd5.ComputeHash(Encoding.UTF8.GetBytes("THANHNV"));
}
else keyArray = Encoding.UTF8.GetBytes("THANHNV");
var tdes = new TripleDESCryptoServiceProvider
{
Key = keyArray,
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
ICryptoTransform cTransform = tdes.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0,
toEncryptArray.Length);
return Encoding.UTF8.GetString(resultArray);
}
#endregion
}
3.1.3. Mã nguồn phân loại sản phẩm khi thêm mới
if (Insert.Checked)
{
if (!kt) return;
try
{
#region Xếp vào nhóm

DataTable dtGroup = ProductController.Product_GetDistinct_CenterKmean();
string s2 = txtQuantity.Text + "," + ddlUColor.SelectedValue + "," +
ddlUManufacturer.SelectedValue + "," +
ddlUSize.SelectedValue + "," + ddlUMaterial.SelectedValue;
float min = float.MaxValue;
string nhom="", center="";
for (int i = 0; i < dtGroup.Rows.Count; i++)
{
string s1 = dtGroup.Rows[i]["Center_Kmean"].ToString();
float kq = CaculatorDistance(s1, s2);
if (min < kq)
{
min = kq;
nhom = dtGroup.Rows[i]["Group_Kmean"].ToString();
center = dtGroup.Rows[i]["Center_Kmean"].ToString();
}
}
#endregion
ProductController.Product_Insert(txtName.Text, Session["upload"] == null ? "" :
Session["upload"].ToString(), txtDescription.Text, txtPrice.Text, txtQuantity.Text,
ddlUColor.SelectedValue, ddlUManufacturer.SelectedValue,

15


ddlUSize.SelectedValue, ddlUMaterial.SelectedValue,
ddlUGroupProduct.SelectedValue,nhom,center);
}
catch
{

WebMsgBox.Show("Lỗi :");
return;
}
}
else
{
if (!kt) return;
try
{
ProductController.Product_Update(ViewState["Id"].ToString(),
Session["upload"] == null ? "" : Session["upload"].ToString(), txtName.Text,
txtDescription.Text,
txtPrice.Text, txtQuantity.Text, ddlUColor.SelectedValue,
ddlUManufacturer.SelectedValue, ddlUSize.SelectedValue,
ddlUMaterial.SelectedValue,
ddlUGroupProduct.SelectedValue);
}
catch
{
WebMsgBox.Show("Lỗi :");
return;
}
}
Loadgrd_showProduct();
WebMsgBox.Show("Cập nhật thành công");
pn_showProduct.Visible = true;
pn_updateProduct.Visible = false;
3.1.4. Mã nguồn phân loại toàn bộ sản phẩm
DataTable dt = ProductController.Product_GetAll();
const int m = 5;//số tiêu chí phân cụm (màu sắc, chất liệu, hãng sx, kích cỡ)

int numgroup = int.Parse(SqlDataProvider.ExecuteScalar("Select NumGroup from
Config"));
var km = new KMean();
float[,] data = km.ConvertDataTable(ProductController.Product_GetAll(), 5, 10);
int[] result = km.Execute(dt.Rows.Count, m,data, numgroup);
//lấy center
var center=new string[numgroup];
for (int i = 0; i < numgroup; i++)
{
center[i] = "";
for (int j = 0; j < m; j++)
{
center[i] += km.Center[i,j]+",";

16


}
center[i] = center[i].Remove(center[i].Length - 1, 1);
}
//update Group_Kmean, Center_Kmean
for (int i = 0; i < result.Length; i++)
{
ProductController.Product_Update_GroupKmean(dt.Rows[i]
["Id"].ToString(),result[i].ToString());
ProductController.Product_Update_CenterKmean(dt.Rows[i]["Id"].ToString(),
ReturnCenterKmean(result[i].ToString(),center));
}
WebMsgBox.Show("Cập nhật thành công!");


3.2.Giao diện chương trình
3.2.1. Giao diện trang chủ

17


3.2.2. Giao diện gợi ý sản phẩm

18


3.2.3. Giao diện giỏ hàng

19


3.2.4. Giao diện các chức năng quản trị

3.2.5. Quản trị sản phẩm

3.2.6. Cấu hình phân nhóm

20


KẾT LUẬN
Trong thời gian vừa qua, như đã trình bày ở trên đây nội dung nghiên cứu đề tài của
nhóm em được gồm các phần chính sau:
 Tìm hiểu thuật toán phân cụm Kmean.
 Tìm kỹ thuật thiết kế website bằng ASP.NET

 Mô tả bài toán ứng dụng bán hàng sử dụng Kmean
 Thiết kế mạng và phân cụm thành công các sản phẩm dựa trên các đặc tính
sản phẩm để gợi ý mua hàng thông minh cho người sử dụng.
 Cài đặt và kiểm tra thực nghiệm bài toán này.
Ngày này, các website bán hàng thường không tương tác tối với người mua hàng. Vì
vậy cần thiết kế các dạng website thông minh hỗ trợ người mua hàng tới tối đa có thể và làm
tăng doanh số cho doanh nghiệp.
Trong ví dụ trên mới chỉ thử nghiệm với tập dữ liệu nhỏ, quá trình phân cụm diễn ra khá
nhanh. Các tiêu chí phân cụm cũng chưa nhiều nên sẽ không được chính xác tuyệt đối như
thực tế.
Hướng phát triển tiếp theo của khóa luận này trong tương lai.
 Nâng cao hiệu quả và độ chính xác trong việc phân loại các nhóm sản phẩm
 Mở rộng thêm nhiều loại sản phẩm, đặc điểm sản phẩm

21


TÀI LIỆU THAM KHẢO
[1.]

Giá trình hệ chuyên gia – Đại học Bách Khoa Hà Nội

[2.]

MathNeuralNetworks. Ben Krose, faculty of Mathematics and computer science,
university of Amsterdam. And Patrick van der smagt, institute of robotics and
system dynamics German aerospase Reseach establishment.

[3.]


Artificial Neural Networks and Information theory, colin Fyfe, department of
computing and information system, the university of Paisley.

[4.]

A Growth Algorithm for Neural Networks Decision Trees. Mostefa golea and Mario
Marchand, Deparment of physics, university of Ottawa Canada.

[5.]

Artificial neural network From Wikipedia, the free encyclopedia.

[6.]

Expert System From Wikipedia, the free encyclopedia.

[7.]

/>
22



×